我试图打开一个意图从Android画廊中选择一张照片,然后在父活动中使用所选图像设置一个图像视图 . 我能够打开图库并选择和图像,但是父活动在onActivityResult()方法中崩溃了 . 崩溃发生在Cursor实例化行中 .
<!--
The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
Google Maps Android API v2, but you must specify either coarse or fine
location permissions for the 'MyLocation' functionality.
-->
<!--<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
结果方法的父活动
Uri selectedImage = data.getData();
if(!isExternalStorageReadable()) {
Log.d("NAMSD", "SS");
} else {
Log.d("hey", selectedImage.toString());
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
Bitmap imageBitmap = BitmapFactory.decodeFile(picturePath);
photo.setImageBitmap(imageBitmap);
}
Stach Trace:
02-16 16:09:54.108 1803-1815 /? E / DatabaseUtils:向parcel写入异常java.lang.SecurityException:Permission Denial:从pid = 8382读取com.android.providers.media.MediaProvider uri content:// media / external / images / media / 37,uid = 10057要求在Android.content.ContentProvider的android.content.ContentProvider $ Transport.enforceReadPermission(ContentProvider.java:480)上的android.permission.READ_EXTERNAL_STORAGE或grantUriPermission()android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605)$ Transport .query(ContentProvider.java:211)在android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)在android.os.Binder.execTransact(Binder.java:453)02-16 16:09:54.108 8382-8382 /? D / AndroidRuntime:关闭VM 02-16 16:09:54.109 8382-8382 /? E / AndroidRuntime:FATAL EXCEPTION:main进程:io.github.getExposure,PID:8382 java.lang.RuntimeException:传递结果失败ResultInfo {who = null,request = 3,result = -1,data = Intent {dat = content :// media / external / images / media / 37}}到activity {io.github.getExposure / io.github.getExposure.PostViewActivity}:java.lang.SecurityException:Permission Denial:读取com.android.providers.media . MediaProvider uri content:// media / external / images / media / 37 from pid = 8382,uid = 10057需要android.permission.READ_EXTERNAL_STORAGE,或者在android.app.ActivityThread.deliverResults(ActivityThread.java:3699)的grantUriPermission() android.app.A活动中的android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)在android.app上的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1393)的android.app.ActivityThread.-wrap16(ActivityThread.java) . Handler.dispatchMessage(Handler.java:102)在android.app.Looper.loop(Looper.java:148)的android.app.ActivityThread.main(ActivityThread.java:5417)at ja Com.android.internal.os.ZygoteInit.main(ZygoteInit.java)中的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)中的va.lang.reflect.Method.invoke(Native Method) :616)引起:java.lang.SecurityException:Permission Denial:从pid = 8382读取com.android.providers.media.MediaProvider uri content:// media / external / images / media / 37,uid = 10057需要android . android.Database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java)上的android.dos.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)上的android.os.Parcel.readException(Parcel.java:1599)中的permission.READ_EXTERNAL_STORAGE或grantUriPermission() :135)android.content.ContentProviderProxy.query(ContentProviderNative.java:421)在android.content.ContentResolver.query(ContentResolver.java:491)的android.content.ContentResolver.query(ContentResolver.java:434)at io android.app.Activity.dispatchActivit上的.github.getExposure.PostViewActivity.onActivityResult(PostViewActivity.java:135) yResult(Activity.java:6428)在android.app.ActivityThread.deliverResult(ActivityThread.java:3695)的android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)android.app.ActivityThread.-wrap16(ActivityThread . java)at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1393)at android.os.Handler.dispatchMessage(Handler.java:102)at android.os.Looper.loop(Looper.java:148)at android.app.ActivityThread.main(ActivityThread.java:5417)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
2 回答
问题不明确,但我怀疑你正在使用android-23 API(Marshmallow)进行编译,并且它已经引入了一种新的方式来询问用户当场使用它的权限,因此有两个选择
( Recommended )在使用之前询问用户该权限 . 更多信息here .
( NOT recommended )将目标API更改为Marshmallow之前的版本,并恢复为询问应用程序安装的所有权限的旧方式 .
我只需要明确要求读/写权限由于android marshmallow在我的活动中的外部存储 .