У меня есть активность в моем приложении, которая позволяет пользователю выбирать несколько файлов с устройства один за другим, я использую такое намерение:
Intent intent = new Intent();
intent.setType("*/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, getString(R.string.select_attachments_activity_chooser_label)), SELECT_PICTURE);
Это работает отлично, я получаю Uri из выбранных файлов, они выглядят так:
content://com.android.providers.media.documents/document/image%3A42555
Затем, если файл является изображением, я его декодирую с помощью:
InputStream streamForDecodeBitmap = MyApp.getContext().getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(streamForDecodeBitmap, null, options);
Когда пользователь нажимает кнопку, я передаю список Uris другому действию с помощью намерения и в этом действии в AsyncTask, я кодирую файл в base64 для отправки по сети:
InputStream is = MyApp.getContext().getContentResolver().openInputStream(uri);
byte[] inputData = getBytes(is);
is.close();
return Base64.encodeToString(inputData, Base64.DEFAULT);
Проблема заключается в том, когда я открываю inputStream, иногда он работает, но большую часть времени я получаю это исключение:
E/AndroidRuntime(22270): Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{42858fe0 22270:co.uk.manifesto.freeagentapp/u0a246} (pid=22270, uid=10246) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
Это все разрешения в моем манифесте:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
Я тестирую устройство с KITKAT (API 19).