android项目中的拍照和本地图片截图
1,得到保存截图文件的地址
private static final String IMAGE_FILE_LOCATION = Environment.getExternalStorageDirectory()+"/temp.jpg"; private Uri imageUri; imageUri = Uri.fromFile(new File(IMAGE_FILE_LOCATION));
2,相册和拍照按钮的点击事件
// 相册 imageViewLocalPhoto.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null); intent.setDataAndType( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,//content://media/external/images/media IMAGE_UNSPECIFIED); startActivityForResult(intent, PHOTOZOOM); } }); // 拍照 imageViewTakePhoto.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File( Environment.getExternalStorageDirectory(), "temp.jpg"))); System.out.println("=============" + Environment.getExternalStorageDirectory()); startActivityForResult(intent, PHOTOHRAPH); } });
3,在onActivityResult回调方法中
拍照和本地图片传入的uri不同
// 拍照 显示图片页面 if (requestCode == PHOTOHRAPH) { startPhotoZoom(imageUri); } // 读取相册缩放图片 显示图片页面 if (requestCode == PHOTOZOOM) { startPhotoZoom(data.getData()); }
4,截图方法
public void startPhotoZoom(Uri uri, int flag) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//图像输出 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", true); intent.putExtra("return-data", false);//回调方法data.getExtras().getParcelable("data")返回数据为空 startActivityForResult(intent, PHOTORESOULT); }
5,回调方法返回截图结果
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 处理结果 处理缩放过后的图片 if (requestCode == PHOTORESOULT) { flag_layout = "layout2"; Bundle extras = data.getExtras(); if (extras != null) { photo = extras.getParcelable("data"); } if(photo==null)//加载本地截图 { Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/temp.jpg"); imageView.setImageBitmap(bm); } else//加载接收的图片数据 { imageView.setImageBitmap(photo); } } super.onActivityResult(requestCode, resultCode, data); }
传统的截图方法为:1,不加这句intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//图像输出,,
2,这句改为返回数据为true:intent.putExtra("return-data", true);
3,也就没有剪切后的输出图片,通过data.getExtras().getParcelable("data")接收返回的图像数据
说明:经试验,传统的截图方法经常死机,报绑定数据过大的错误,所以改用本例的方法比较好用了,就是截好图片后,直接加载本地图片就好了
bug:如果删除temp.jpg文件后,拍照截图时会一直截删掉的temp.jpg文件,本地图片没问题,再换回拍照截图也没问题了
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。