近期写代码碰到华为、小米手机拍照、从相册获取图片设置头像失败的问题,在网上浏览一些相关博客后,终于解决了此问题,特在此记录,分享给大家,也算是自己的一个笔记了!
问题原因:裁剪时 return-data的方式只适用于小图,小米miui系统和华为系统默认的裁剪图片可能裁剪得过大,或对return-data分配的资源不足,造成return-data失败。
解决思路是:裁剪后,将裁剪的图片保存在Uri中,在onActivityResult()方法中,再提取对应的Uri图片转换为Bitmap使用。
//拍照获取图片 private void takePhoto() { Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 判断存储卡是否可用,存储照片文件 if (hasSdcard()) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, IMAGE_FILE_NAME); intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri .fromFile(new File(Environment.getExternalStorageDirectory(), IMAGE_FILE_NAME))); } startActivityForResult(intentFromCapture, CODE_CAMERA_REQUEST); }
//从相册选取图片 private void selectPhotoFromGallery() { Intent intentFromGallery = new Intent(); // 设置文件类型 intentFromGallery.setType("image/*"); intentFromGallery.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intentFromGallery, CODE_GALLERY_REQUEST); }
/** * 裁剪原始的图片 */ public void cropRawPhoto(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 设置裁剪 intent.putExtra("crop", "true"); // aspectX , aspectY :宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX , outputY : 裁剪图片宽高 intent.putExtra("outputX", output_X); intent.putExtra("outputY", output_Y); // intent.putExtra("return-data", true); //原本的裁剪方式 //uritempFile为Uri类变量,实例化uritempFile,转化为uri方式解决问题 mUritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, mUritempFile); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); startActivityForResult(intent, CODE_RESULT_REQUEST); }
@Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); // 用户没有进行有效的设置操作,返回 if (resultCode == getActivity().RESULT_CANCELED) { return; } switch (requestCode) { case CODE_GALLERY_REQUEST: //相册 String replace = intent.getData().toString().replace("content", "file"); cropRawPhoto(Uri.parse(replace)); break; case CODE_CAMERA_REQUEST: //相机 if (hasSdcard()) { File tempFile = new File(Environment.getExternalStorageDirectory(), IMAGE_FILE_NAME); Log.e("ffl", "onActivityResult: path==== " + tempFile.getAbsolutePath()); cropRawPhoto(Uri.fromFile(tempFile)); } else { Toast.makeText(getActivity(), "没有SDCard!", Toast.LENGTH_LONG).show(); } break; case CODE_RESULT_REQUEST: if (intent != null) { //将Uri图片转换为Bitmap try { Bitmap bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(mUritempFile)); //TODO,将裁剪的bitmap显示在imageview控件上 setImageToHeadView(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } // setImageToHeadView(intent); }else { Log.e("ffl", "onActivityResult: -------------intent为null------------"); } break; } }