我的应用程序中有一个活动,该活动允许用户从设备中一个接一个地选择多个文件,我使用的是这样的意图:
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)的设备中进行测试。
请也检查以下问题:
尝试从MediaStore读取时,Android KitKat securityException
权限拒绝:打开提供程序
对于KitKat上的相同问题,我使用了它。这是我从Stack Overflow链接之一中找到的一个选项/解决方法,您可以从Downloads / Recent中选择文件。
public static final int KITKAT_VALUE = 1002;
Intent intent;
if (Build.VERSION.SDK_INT < 19) {
intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
startActivityForResult(intent, KITKAT_VALUE);
} else {
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, KITKAT_VALUE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == KITKAT_VALUE ) {
if (resultCode == Activity.RESULT_OK) {
// do something here
}
}
}
参考:KitKat上的Android Gallery为Intent返回了不同的Uri。ACTION_GET_CONTENThttp: //developer.android.com/guide/topics/providers/document-provider.html#client
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句