我想创建自己的相机应用程序。主要活动有一个按钮,单击该按钮时,它将转到相机活动(带有预览和“拍摄”按钮)。一旦我按下“拍摄”按钮,照片就会被拍摄。拍摄的照片将返回到主要活动并显示在图像视图中。问题是,我不知道如何将照片从相机活动传回主要活动。希望有人能给出提示或例子吗?
问问题
547 次
4 回答
0
的确!你必须用 发送相机意图startActivityForResult
,看看下面的代码:
定义要存储图像的路径:
String filepath = Environment.getExternalStorageDirectory()+"/foldername/"+filename;
File file = new File(_path);
Uri outputFileUri = Uri.fromFile(file);
相机意图
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, 1212);
覆盖 startActivityForResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1212) {
//here you can decode your path and use for displaying an image.
}
}
于 2013-01-16T12:40:41.153 回答
0
在按钮单击事件上使用以下代码
Intent action = new Intent("android.media.action.IMAGE_CAPTURE");
action.putExtra(MediaStore.EXTRA_OUTPUT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString());
startActivityForResult(action,TAKE_PICTURE_FROM_CAMERA);
你必须使用
public void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
}
if (resultCode == Activity.RESULT_OK) {
uri = data.getData();
try {
photoBitMap = (Bitmap) data.getExtras().get("data");
int h = 100; // height in pixels
int w = 100; // width in pixels
photoBitMap = Bitmap.createScaledBitmap(photoBitMap, h, w,
true);
uri = Uri.parse(android.provider.MediaStore.Images.Media
.insertImage(getContentResolver(), photoBitMap,
null, null));
Bitmap usableBMP = Bitmap.createScaledBitmap(photoBitMap,
68, 80, true);
if (!Calculations.encodeImageToBase64(photoBitMap).equals(
"")
&& Calculations.encodeImageToBase64(photoBitMap) != null) {
// userPhoto.setImageBitmap(usableBMP);
userPhoto.setImageBitmap(Calculations
.getRoundedCornerBitmap(this, usableBMP));
} else {
userPhoto.setImageBitmap(null);
userPhoto.setImageResource(R.drawable.default_user_img);
Toast.makeText(RegisterActivity.this,
getString(R.string.imageSizeValidation),
Toast.LENGTH_SHORT).show();
}
userPhoto.setScaleType(ScaleType.FIT_XY);
} catch (Exception e) {
e.printStackTrace();
} catch (OutOfMemoryError e) {
e.printStackTrace();
Toast.makeText(RegisterActivity.this,
getString(R.string.imageSizeValidation),
Toast.LENGTH_SHORT).show();
}
}
于 2013-01-16T13:41:21.827 回答
0
嗨,请尝试使用此代码。
package com.example.stackoverflow;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.math.BigInteger;
import java.security.SecureRandom;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;
public class MyCameraActivity extends Activity {
private static final int CAMERA_REQUEST = 1888;
static String str_Camera_Photo_ImagePath = "";
private static File f;
private static int Take_Photo = 2;
private static String str_randomnumber = "";
static String str_Camera_Photo_ImageName = "";
public static String str_SaveFolderName;
private static File wallpaperDirectory;
Bitmap bitmap;
int storeposition = 0;
public static GridView gridview;
public static ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ccccc);
this.imageView = (ImageView)this.findViewById(R.id.imageView1);
Button photoButton = (Button) this.findViewById(R.id.button1);
photoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
str_SaveFolderName = Environment
.getExternalStorageDirectory()
.getAbsolutePath()
+ "/rajeshsample";
str_randomnumber = String.valueOf(nextSessionId());
wallpaperDirectory = new File(str_SaveFolderName);
if (!wallpaperDirectory.exists())
wallpaperDirectory.mkdirs();
str_Camera_Photo_ImageName = str_randomnumber
+ ".jpg";
str_Camera_Photo_ImagePath = str_SaveFolderName
+ "/" + str_randomnumber + ".jpg";
System.err.println(" str_Camera_Photo_ImagePath "
+ str_Camera_Photo_ImagePath);
f = new File(str_Camera_Photo_ImagePath);
startActivityForResult(new Intent(
MediaStore.ACTION_IMAGE_CAPTURE).putExtra(
MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)),
Take_Photo);
System.err.println("f " + f);
}
});
}
// used to create randon numbers
public String nextSessionId() {
SecureRandom random = new SecureRandom();
return new BigInteger(130, random).toString(32);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_HOME:
finish();
Toast.makeText(getApplicationContext(), "TTTTTTTTTTTT", Toast.LENGTH_LONG).show();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == Take_Photo) {
String filePath = null;
filePath = str_Camera_Photo_ImagePath;
if (filePath != null) {
Bitmap faceView = ( new_decode(new File(
filePath))); // ========================> good
// lines
imageView.setImageBitmap(faceView);
} else {
bitmap = null;
}
}
}
public static Bitmap new_decode(File f) {
// decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
o.inDither = false; // Disable Dithering mode
o.inPurgeable = true; // Tell to gc that whether it needs free memory,
// the Bitmap can be cleared
o.inInputShareable = true; // Which kind of reference will be used to
// recover the Bitmap data after being
// clear, when it will be used in the future
try {
BitmapFactory.decodeStream(new FileInputStream(f), null, o);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 300;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 1.5 < REQUIRED_SIZE && height_tmp / 1.5 < REQUIRED_SIZE)
break;
width_tmp /= 1.5;
height_tmp /= 1.5;
scale *= 1.5;
}
// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
// o2.inSampleSize=scale;
o.inDither = false; // Disable Dithering mode
o.inPurgeable = true; // Tell to gc that whether it needs free memory,
// the Bitmap can be cleared
o.inInputShareable = true; // Which kind of reference will be used to
// recover the Bitmap data after being
// clear, when it will be used in the future
// return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
try {
// return BitmapFactory.decodeStream(new FileInputStream(f), null,
// null);
Bitmap bitmap= BitmapFactory.decodeStream(new FileInputStream(f), null, null);
System.out.println(" IW " + width_tmp);
System.out.println("IHH " + height_tmp);
int iW = width_tmp;
int iH = height_tmp;
return Bitmap.createScaledBitmap(bitmap, iW, iH, true);
} catch (OutOfMemoryError e) {
// TODO: handle exception
e.printStackTrace();
// clearCache();
// System.out.println("bitmap creating success");
System.gc();
return null;
// System.runFinalization();
// Runtime.getRuntime().gc();
// System.gc();
// decodeFile(f);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
于 2013-01-16T13:29:48.237 回答
0
通过路径将意图发送到相机屏幕。图像将被捕获并存储在该路径上。
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
if (!APP_FILE_PATH_Media.exists())
{
APP_FILE_PATH_Media.mkdirs();
}
uriSavedImage =new File(APP_FILE_PATH_Media+ "/" +
"IMG_"+ getTimeStamp() + ".jpeg");
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(uriSavedImage));
startActivityForResult(cameraIntent, CAMERA_REQUEST);
现在,当您单击 take 时,它将调用主 Activity 的 onActivityResult 方法。在 OnActivityResult 中:
path=uriSavedImage.getAbsolutePath();
您可以使用此路径来显示图像。
于 2013-01-16T12:32:54.763 回答