Вопрос:
Изменение: это не дублирующий вопрос. Нет вопросов, я видел ответы, как решить это, когда вы не контролируете активность, отправляющую намерение (в моем случае приложение-браузер или, возможно, приложение для просмотра файлов отправляет намерение моему приложению). А затем, в частности, это не касается фотографий/галереи.
На какое-то время это наводило мое приложение. Я не могу лично заставить его произойти с любым устройством, но я вижу, что от сбоев это случается с другими.
Мое приложение получает намерение, содержащее файл ZIP из внешнего приложения. Я поймаю его либо в onCreate() либо onNewIntent():
Intent intent = getIntent(); if (intent != null && intent.getData() != null) beginZipIntent(intent);
В beginZipIntent():
Uri data = intent.getData(); String filename = data.toString(); // Open input stream to copy ZIP to a temporary directory. Uri uri = Uri.parse(filename); InputStream inputStream = null; try { inputStream = getContentResolver().openInputStream(uri); // This fails } catch (Exception e) { //… }
На приведенной выше строке некоторые устройства не работают:
Permission Denial: reading com.android.providers.downloads.DownloadStorageProvider uri content://com.android.providers.downloads.documents/document/2772 from pid=26094, uid=10094 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
Я не контролирую приложение/действие, отправляющее намерение. Я подумал, схватив файл сразу и сохранив его во временном каталоге, я мог бы исправить это (как видно из других ответов) – но нет.
Я также добавил android.permission.MANAGE_DOCUMENTS но, как и ожидалось (из других ответов), он не работает.
Кто-нибудь когда-нибудь сталкивался с этим? Кажется, это влияет на устройства от Android 4 до 7, а не на одну версию ОС.
Лучший ответ:
Возможно, вам потребуется добавить следующие права на выполнение во время выполнения кода и показать также
<uses-permission android:name=»android.permission.WRITE_INTERNAL_STORAGE» /> <uses-permission android:name=»android.permission.READ_EXTERNAL_STORAGE»/>
вы можете сослаться на эту ссылку #save_zip_files
Я надеюсь, что это помогает!!
Ответ №1
Ну, я столкнулся с этой проблемой раньше, у меня было устройство oppo, которое запускалось на Android версии 7.1, и это сработало хорошо, и это создало проблему на samsung с той же версией Android, поэтому, чтобы решить эту проблему, я попросил разрешение на чтение в случае необходимости, и это сработало.
Пример для людей, которые любят код:
public class CheckPermissions { public static boolean hasPermission(int PERMISSION_REQUEST, String permission, Context context) { if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, permission) && ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { return false; } else { ActivityCompat.requestPermissions((Activity) context, new String[]{permission}, PERMISSION_REQUEST); } return false; } else { return true; } } }
И проверить разрешение:
if (CheckPermissions.hasPermission(REQUEST_CODE, Manifest.permission.READ_EXTERNAL_STORAGE, this)) // todo read the saved URI
Также я ожидал от вас добавления разрешения манифеста:
<uses-permission android:name=»android.permission.READ_EXTERNAL_STORAGE» />
И используйте разрешение записи для записи файла.
Ответ №2
Просто добавьте эту строку, прежде чем получить URI
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build());