使用Intent调用系统中的相机进行拍摄时,不需要camera权限。需要给Intent设置MediaStore.ACTION_IMAGE_CAPTURE动作
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
如果需要指定拍摄时的照片存储路劲,需要设置putExtra
intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);
前面key是指示需要存储照片到指定路劲。后面的fileUri是指定存储路劲的Uri。
Note:当指定拍摄时的存储路劲后,onActivityResult中的data参数将会变成null,由于这个方法中的回调对应的路劲是系统默认的,所以将没有数据被回调出来。
启动相机完整代码:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);
startActivityForResult(intent,1);
当调用相机结束后,将会回调onActivityResult方法,可以在该方法中获取对应的图片(当没有指定路径时,图片是保存在data参数中的,可以直接获取。如果设置了,则需要根据自己设置的路劲去寻找图片)。
没有设置路劲时,获取图片代码:
Bitmap bitmap = data.getParcelableExtra("data");
当设置路径后,data为null,则需:
Bitmap bitmap = BitmapFactory.decodeFile(path,options);
如果要设置到ImageView上,最好进行压缩,否则可能出现OOM错误。
onActivity完整代码:(XML文件仅有一个点击按钮,和一个ImageView就不贴了)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && resultCode == RESULT_OK){
if (data != null) {//没有设置指定路径
if (data.hasExtra("data")) {
Bitmap bitmap = data.getParcelableExtra("data");
imageView.setImageBitmap(bitmap);
}
}else {//设置了指定路劲
String path = fileUri.getPath();
Bitmap bitmap = Utils.compressImg(path,imageView);
imageView.setImageBitmap(bitmap);
}
}
}
获取fileUri的代码:
private static Uri getOutputMediaFileUri(int type){
return Uri.fromFile(getOutputMediaFile(type));
}
private static File getOutputMediaFile(int type){
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyCameraApp");
if (! mediaStorageDir.exists()){
mediaStorageDir.mkdirs();
}else {
Log.d("forme","exists !!");
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == MEDIA_TYPE_IMAGE){
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
} else {
return null;
}
if (!mediaFile.exists()){
try {
mediaFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
return mediaFile;
}
Utils.compressImg是进行图片的压缩,其中在指定ImageView的大小的时候,最好不要用match_parent,不然在获取宽高的时候,无法判断宽高是多少
public static Bitmap compressImg(String path, ImageView imageView){
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inSampleSize = 1;
Bitmap bitmap = BitmapFactory.decodeFile(path,options);
int height = imageView.getHeight();
int width = imageView.getWidth();
int bitHeight = options.outHeight;
int bitWidth = options.outWidth;
while (bitHeight>height || bitWidth>width){
options.inSampleSize *= 2;
bitHeight /= options.inSampleSize;
bitWidth /= options.inSampleSize;
}
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.RGB_565;
bitmap = BitmapFactory.decodeFile(path,options);
return bitmap;
}
以上是关于根据指定路劲调用系统相机进行拍照的全部代码