根据指定路劲调用系统相机进行拍照
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;
}
以上是关于根据指定路劲调用系统相机进行拍照的全部代码
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;
}
以上是关于根据指定路劲调用系统相机进行拍照的全部代码
相关文章推荐
- 【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!
- 实现主流软件的调用系统相机拍照 取得照片 并进行加工
- android调用系统相机拍照与打开相册选择照片进行截取保存笔记
- android调用系统相机拍照后对相片进行裁剪
- 调用系统相机进行拍照
- 完美调用系统相机拍照,获取图片进行压缩并本地保存
- android调用系统相册选图或相机拍照后对图片进行剪切无内存溢出支持7.0
- Android调用系统相机拍照并保存到指定位置
- 实现主流软件的调用系统相机拍照 取得照片 并进行加工
- [置顶] android 调用系统相机进行拍照及照片的裁切
- android调用系统相机拍照后对相片进行裁剪[先存,明天看]
- Android 调用系统相机进行拍照 使用自带的图片选择器和裁剪工具
- 调用android系统相机拍照并将图片传指定路径并获取相片
- Android调用系统相机拍照并且裁剪指定大小
- android调用系统相机和相册进行拍照裁剪处理,解决不同安卓版本存在无法加载相册的问题,处理了是否有sd卡的存在的情况
- 调用系统相机进行拍照并保存
- android调用系统相机进行视频录制并保存到指定目录
- Android调用系统相机拍照,并且模仿实现水印相机简单功能
- Android拍照、调用系统图库、裁剪图片到指定大小后输出
- 调用系统相机拍照,拍照后获取照片