我有我的应用程序的活动,可以让用户通过一个从设备一个选择几个文件,我使用像这样的意图:得到允许拒绝例外
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
是否有任何官方文档说明未将权限传递给“新执行线程”? –