您的位置:首页 > 其它

根据指定路劲调用系统相机进行拍照

2016-09-05 16:56 381 查看
使用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.getExte
4000
rnalStoragePublicDirectory(
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;
}

以上是关于根据指定路劲调用系统相机进行拍照的全部代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐