【发布时间】:2019-04-17 08:55:12
【问题描述】:
我在从 Android N 的意图中检索 Uri 时遇到问题。
据我所知,在 Android 24 及更高版本上要获得外部 Uri,您需要在 Manifest 中声明 FileProvider。一切都完成了,它可以与相机一起使用,但是当我尝试从图库中获取图像时,onActivityResult data.getData(); 出现错误@
这些是我的一些代码示例:
public void getPictureFromGallery(){
picUriCar = null;
try {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, PIC_SELECT);
} catch (ActivityNotFoundException e) {
Toast.makeText(MainActivity.this, getResources().getString(R.string.text_error_no_gallery_app),
Toast.LENGTH_SHORT).show();
}
}
还有onActivityResult:
else if(requestCode == PIC_SELECT){
picUriCar = data.getData();
if (picUriCar != null){
performCrop();
}
}
据我所知data.getData() 返回一个 Uri,这在 Marshmallow 上运行正常,但在 Nougat 手机上我收到此错误:
java.lang.RuntimeException: 传递结果失败 ResultInfo{who=null, request=5, result=-1, data=Intent { dat=content://com.android.externalstorage.documents/document/4996-1EFF:DCIM/100ANDRO/DSC_0004.JPG flg=0x1 }} 到活动 {com.company.example/com.company.example.MainActivity}: java.lang.SecurityException: Uid 10246 没有 uri 的权限 0@ 内容://com.android.externalstorage.documents/document/4996-1EFF%3ADCIM%2F100ANDRO%2FDSC_0004.JPG 在 android.app.ActivityThread.deliverResults(ActivityThread.java:4267) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:4310) 在 android.app.ActivityThread.-wrap20(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1628) 在 android.os.Handler.dispatchMessage(Handler.java:110) 在 android.os.Looper.loop(Looper.java:203) 在 android.app.ActivityThread.main(ActivityThread.java:6361) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 引起:java.lang.SecurityException: Uid 10246 没有权限访问uri 0 @ 内容://com.android.externalstorage.documents/document/4996-1EFF%3ADCIM%2F100ANDRO%2FDSC_0004.JPG 在 android.os.Parcel.readException(Parcel.java:1683) 在 android.os.Parcel.readException(Parcel.java:1636) 在 android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3213) 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1525) 在 android.app.Activity.startActivityForResult(Activity.java:4235) 在 android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767) 在 android.app.Activity.startActivityForResult(Activity.java:4194) 在 android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754) 在 com.company.example.MainActivity.performCrop(MainActivity.java:1654) 在 com.company.example.MainActivity.onActivityResult(MainActivity.java:1534) 在 android.app.Activity.dispatchActivityResult(Activity.java:6928) 在 android.app.ActivityThread.deliverResults(ActivityThread.java:4263) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:4310) 在 android.app.ActivityThread.-wrap20(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1628) 在 android.os.Handler.dispatchMessage(Handler.java:110) 在 android.os.Looper.loop(Looper.java:203) 在 android.app.ActivityThread.main(ActivityThread.java:6361) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
我的问题是:
如何将data.getData() uri 传递给 picUriCar 而不会出现任何错误?
【问题讨论】:
标签: java android exception permissions android-7.0-nougat