当前位置: 首页 > 知识库问答 >
问题:

获取权限拒绝异常

淳于祺
2023-03-14

我的应用程序中有一个活动,允许用户逐个从设备中选择多个文件,我正在使用这样的意图:

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);

当用户单击按钮时,我通过 intent 将 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)的设备中进行测试。

共有3个答案

长孙鸿波
2023-03-14

确保您使用的是从请求内容的活动中访问内容解析器,例如:

activity.getContentResolver()  

而不是MyApp.getContext(). getContentResolver()

对我来说,情况显然就是这样,它不需要将android.permission.MANAGE_DOCUMENTS添加到清单中。

并且你用这个来称呼意图:

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    intent.setAction(Intent.ACTION_GET_CONTENT);
} else {
    intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
}

更多信息:https://developer . Android . com/guide/topics/providers/document-provider . html # client

呼延宪
2023-03-14

当控件和数据返回到中的活动时

protected void onActivityResult(int reqCode, int resultCode, Intent data)

同时,您的活动被授予访问传递意图中的图像URL的权限。您的活动将能够读取意图中的URL并显示图像。但是,您将无法将任何权限传递给其他活动或新的执行线程。这就是为什么你得到安全异常android.permission.MANAGE_DOCUMENTS。

避免权限问题的一种方法是获取具有权限的活动中的数据。在您的情况下,来自具有编码权限的活动

InputStream is = getContentResolver().openInputStream(uri);
byte[] inputData = getBytes(is);
is.close();
String encoded = Base64.encodeToString(inputData, Base64.DEFAULT);

获得编码字符串后,您可以将其传递给任何其他可能需要它的活动,或者您可以将其传递给要发送到其他地方的AsyncTask。

齐承泽
2023-03-14

也请检查这些问题:< br >尝试从MediaStore读取时出现Android KitKat安全异常< br >权限拒绝:打开提供程序

对于KitKat上的相同问题,我使用了这个。这是我从堆栈溢出链接中找到的一个选项/解决方法,您将能够从下载/最近更新中选择文件。

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 返回不同的 Uri 进行Intent.ACTION_GET_CONTENT http://developer.android.com/guide/topics/providers/document-provider.html#client

 类似资料:
  • 从今天起,我们的Airflow服务无法访问BigQuery中的查询。所有作业都会失败,并显示以下消息: [2021-03-12 10:17:28079]{taskinstance.py:1150}错误-原因:403获取https://bigquery.googleapis.com/bigquery/v2/projects/waipu-app-prod/queries/e62030d7-36eb-4

  • 问题内容: 当我尝试运行简单的docker命令时,例如: 我收到一条错误消息: 获得权限被拒绝… /var/run/docker.sock:connect:权限被拒绝 当我检查权限 我看到这一行: 因此,我遵循许多论坛的建议并将本地用户添加到docker组: 但这无济于事。我仍然收到非常相同的错误消息。我该如何解决? 问题答案: 对于那些刚接触shell的人,命令: 需要在您的外壳中定义。默认情况

  • 问题内容: 尝试显示URI时出现以下异常。我认为这是在我的活动停止后发生的,我尝试再次访问可行的URI。还有其他问题可以解决这个问题,但是我对如何对我的代码应用任何解决方案感到非常困惑,因为我的takePhotoIntent允许拍照或从图库中选择图片(如下所示)。 我的createImageFile和我的takePhotoIntent: 问题答案: 根据Storage Access Framewo

  • 问题内容: 我对编码比较陌生,遇到了麻烦。 我有这段代码可以将数据发送到Firebase 但是,我不断收到错误: FIREBASE警告:设置为/ users /(GoogleID)失败:Permission_denied 2016-05-23 22:52:42.707 firebase.js:227未捕获(承诺)错误:PERMISSION_DENIED:权限被拒绝(…) 当我尝试查找时,它谈论的是

  • 问题内容: 很抱歉来到这里问这个问题,但是我已经读完了所有互联网,试图找到解决方案,但是我仍然遇到这个问题… 我已经成功安装了Jenkins(让我在仍有希望的时候开始)可以在我们的持续集成流程中使用它。 我试图从这样一个简单的例子开始: 但是每次启动时,都会出现此错误: 问题在于用户jenkins(服务和主节点以Jenkins的身份运行)拥有此存储库上的所有权限。我试图授予组和其他人读取和执行的权