Android 安卓存储访问框架在asyntask期间未授予持久权限

Android 安卓存储访问框架在asyntask期间未授予持久权限,android,android-asynctask,permissions,android-bitmap,Android,Android Asynctask,Permissions,Android Bitmap,我在这里设置了意图标志: public void createAlbum(View view) { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.putExtra(Intent.EXTRA_A

我在这里设置了意图标志:

public void createAlbum(View view) {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
    String intentChooserDialog = getResources().getString(R.string.pick_image_dialog);
    startActivityForResult(Intent.createChooser(intent, intentChooserDialog), PICK_IMAGE);
}
在我的“活动结果”中,我设置了持久权限,如下所述:

就是在这里我得到了这个错误:

05-08 14:17:40.850 2728-2813/com.example.app W/System.err: java.lang.SecurityException: No persistable permission grants found for UID 10058 and Uri 0 @ content://com.android.providers.media.documents/document/image:32
05-08 14:17:40.850 2728-2813/com.example.app W/System.err:     at android.os.Parcel.readException(Parcel.java:1599)
05-08 14:17:40.850 2728-2813/com.example.app W/System.err:     at android.os.Parcel.readException(Parcel.java:1552)
05-08 14:17:40.850 2728-2813/com.example.app W/System.err:     at android.app.ActivityManagerProxy.takePersistableUriPermission(ActivityManagerNative.java:4217)
05-08 14:17:40.850 2728-2813/com.example.app W/System.err:     at android.content.ContentResolver.takePersistableUriPermission(ContentResolver.java:1703)
05-08 14:17:40.850 2728-2813/com.example.app W/System.err:     at com.example.app.AlbumCreator$BitmapWorkerTask.decodeSampledBitmapFromResource(AlbumCreator.java:395)
05-08 14:17:40.850 2728-2813/com.example.app W/System.err:     at com.example.app.AlbumCreator$BitmapWorkerTask.doInBackground(AlbumCreator.java:343)
05-08 14:17:40.850 2728-2813/com.example.app W/System.err:     at com.example.app.AlbumCreator$BitmapWorkerTask.doInBackground(AlbumCreator.java:329)
如果从“活动结果”中包含BitmapFactory.decodeFileDescriptor的parcelFileDescriptor加载位图,则不会出现此错误。因此,据我所知,AsyncTask是具有不同权限的不同用户。有人知道如何为异步任务分配持久权限吗?我不希望在UI线程上加载位图

这是我的舱单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".AlbumCreator"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--
             ATTENTION: This was auto-generated to add Google Play services to your project for
             App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information.
        -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <activity
            android:name=".AlbumEditor"
            android:label="@string/title_activity_album_editor"
            android:parentActivityName=".AlbumCreator">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.app.AlbumCreator" />
        </activity>
    </application>
</manifest>

您需要在清单中添加必要的权限。 请加上:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

如果要进行写操作,这是必需的


试试看,让我们知道这是否有用。

我解决了自己的问题。如果您查看我的代码,您可以看到我使用了intent.getData()。然后,我使用该uri保留了权限。当我保存uri供以后使用时,我对它进行了解码
Uri.decode(Uri.toString()

编码Uri:
content://com.android.providers.media.documents/document/image%3A32
解码:
content://com.android.providers.media.documents/document/image:32


因此,我改为使用intent.getDataString(),然后使用Uri.parse()为takePersistableUriPermission()创建Uri然后,我保存了保存在编码组件中的数据库中的初始数据字符串。

请检查相关的问题和建议的答案-希望这也给你一些想法。我很感激你分享这个相关的问题。但是,我能够加载一个位图,像这个PAR一样有持久权限。tial解决方案:。但是,当我尝试从保存的内容路径加载onActivityResult方法之外的位图时,除了在后台进程上发生之外,我还得到了SecurityException。我猜这是因为后台进程是不同的用户。或者进程ID不同是一个问题。也许吧另外…我添加了这个权限,但我仍然得到了一个安全例外。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".AlbumCreator"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--
             ATTENTION: This was auto-generated to add Google Play services to your project for
             App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information.
        -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <activity
            android:name=".AlbumEditor"
            android:label="@string/title_activity_album_editor"
            android:parentActivityName=".AlbumCreator">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.app.AlbumCreator" />
        </activity>
    </application>
</manifest>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />