最近向做一个头像剪裁的功能,调用系统的gallery选择图片,用com.android.camera.action.CROP对URI剪裁便可以实现。
用联想的一部手机测试如下代码没问题
public void ChooseImage(View v) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);// ACTION_OPEN_DOCUMENT
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
startActivityForResult(intent, SELECT_PIC_KITKAT);
} else {
startActivityForResult(intent, SELECT_PIC);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (RESULT_OK == resultCode) {
switch (requestCode) {
case SELECT_PIC_KITKAT:
Uri selectedImage = data.getData();
startPhotoZoom(selectedImage);
break;
case 3:
if(data != null){
setPicToView(data);
}
break;
default:
break;
}
}
}
public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, 3);
}
但是小米系统下提示加载图片失败,去看了下log提示如下:
W/Worker (18831): Exception in running a job
W/Worker (18831): java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{43ca3940 18831:com.miui.gallery:crop/u0a6} (pid=18831, uid=10006) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
W/Worker (18831): at android.os.Parcel.readException(Parcel.java:1465)
W/Worker (18831): at android.os.Parcel.readException(Parcel.java:1419)
W/Worker (18831): at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2860)
W/Worker (18831): at android.app.ActivityThread.acquireProvider(ActivityThread.java:4448)
W/Worker (18831): at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2239)
W/Worker (18831): at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1430)
W/Worker (18831): at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1052)
W/Worker (18831): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:909)
W/Worker (18831): at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:766)
W/Worker (18831): at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:721)
W/Worker (18831): at com.miui.gallery.data.UriImage.openOrDownloadInner(UriImage.java:141)
W/Worker (18831): at com.miui.gallery.data.UriImage.openFileOrDownloadTempFile(UriImage.java:116)
W/Worker (18831): at com.miui.gallery.data.UriImage.prepareInputFile(UriImage.java:210)
W/Worker (18831): at com.miui.gallery.data.UriImage.access$100(UriImage.java:48)
W/Worker (18831): at com.miui.gallery.data.UriImage$BitmapJob.run(UriImage.java:233)
W/Worker (18831): at com.miui.gallery.data.UriImage$BitmapJob.run(UriImage.java:225)
W/Worker (18831): at com.miui.gallery.app.CropImageBase$LoadBitmapDataTask.run(CropImageBase.java:1003)
W/Worker (18831): at com.miui.gallery.app.CropImageBase$LoadBitmapDataTask.run(CropImageBase.java:975)
W/Worker (18831): at com.miui.gallery.util.ThreadPool$Worker.run(ThreadPool.java:130)
W/Worker (18831): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/Worker (18831): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/Worker (18831): at java.lang.Thread.run(Thread.java:841)
W/Worker (18831): at com.miui.gallery.util.PriorityThreadFactory$1.run(PriorityThreadFactory.java:43)
猜测调用com.android.camera.action.CROP实际为com.miui.gallery:crop缺少权限。