SecurityException на grantUriPermissions () - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть приложение, которое может открывать текстовые файлы из файлового менеджера, редактировать их и сохранять изменения в этом файле.

Дело в том, что когда URI схема равна file:// все работает нормально. Но если схема URI равна content://, я получаю исключение при попытке grantUriPermissions().

Вот как я пытаюсь сохранить файл:

    OutputStream os;
try {
    List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    for (ResolveInfo resolveInfo : resInfoList) {
        String packageName = resolveInfo.activityInfo.packageName;
        context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }
    os = context.getContentResolver().openOutputStream(uri);
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8));
    writer.write(newText.trim());
    writer.flush();
    writer.close();
    os.close();
    context.revokeUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
} catch (IOException e) {
    e.printStackTrace();
}

Я получаю:

java.lang.SecurityException: Permission Denial: writing com.android.fileexplorer.provider.FileExplorerFileProvider uri content://com.mi.android.globalFileexplorer.myprovider/external_files/txtpad/uu.txt from pid=32456, uid=10208 requires the provider be exported, or grantUriPermission()

Мой <provider/> в AndroidManifest

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>

У меня есть это в теге активности в AndroidManifest

<intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />

            <data android:scheme="content" />
            <data android:scheme="file" />
            <data android:mimeType="text/*" />
        </intent-filter>

1 Ответ

0 голосов
/ 29 апреля 2018

Начните с избавления от некоторого вашего кода, оставив вам:

OutputStream os;
try {
    os = context.getContentResolver().openOutputStream(uri);
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8));
    writer.write(newText.trim());
    writer.flush();
    writer.close();
    os.close();
} catch (IOException e) {
    e.printStackTrace();
}

Код, который я удалил, был связан с предоставлением другим приложениям прав на содержимое, обозначенное Uri. Вы ничего не делаете с другими приложениями, и, в частности, бит revokeUriPermission() может испортить доступ вашего приложения к контенту.

Затем полностью удалите и переустановите ваше приложение и посмотрите, все ли заработает.

Если нет, убедитесь, что либо:

  • Вы используете этот Uri только в упражнении, в котором вы его получили (через getIntent().getData()), или

  • Если вы передаете Uri другому компоненту, добавьте FLAG_GRANT_WRITE_URI_PERMISSION к Intent, который вы используете для запуска этого компонента (и, возможно, FLAG_GRANT_READ_URI_PERMISSION, в зависимости от потребностей этого другого компонента)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...