我有我的應用程序的活動,可以讓用戶通過一個從設備一個選擇幾個文件,我使用像這樣的意圖:得到允許拒絕例外
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的時候,看起來就像這樣:
InputStream streamForDecodeBitmap = MyApp.getContext().getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(streamForDecodeBitmap, null, options);
0:
content://com.android.providers.media.documents/document/image%3A42555
然後,如果該文件是一個形象,我與它的解碼
當用戶點擊一個按鈕時,我通過意圖和本次活動通過URI列表到另一活動,在的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)的設備中測試。
偉大的答案,我已經重構我的代碼,但沒有拋出這個問題在設備上測試。這是有道理的,但在我的情況下,我正在使用ACTION_NEW_PICTURE和ACTION_NEW_VIDEO在BroadcastReceiver中偵聽新照片/視頻。我已經移動在UI線程上構建媒體查詢,然後將光標傳遞給後臺任務進行處理。 – Meanman
是否有任何官方文檔說明未將權限傳遞給「新執行線程」? –