如何在 android API 19 (KitKat) 中保留权限?

2024-01-28

在我的应用程序中,我将图像路径存储在 SQlite 数据库中以供进一步使用。我得到的路径是

content://com.android.providers.media.documents/document/image%3A71964

当我从数据库检索此路径并尝试从该路径检索图像时,android 抛出

java.lang.SecurityException: Permission Denial: opening provider
com.android.providers.media.MediaDocumentsProvider 
from ProcessRecord{42c84ec8 23911:com.gots.gb/u0a248} (pid=23911, uid=10248) 
requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS

根据https://developer.android.com/guide/topics/providers/document-provider.html#permissions https://developer.android.com/guide/topics/providers/document-provider.html#permissions我需要通过添加以下代码来保留权限

final int takeFlags = intent.getFlags()
        & (Intent.FLAG_GRANT_READ_URI_PERMISSION
        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Check for the freshest data.
getContentResolver().takePersistableUriPermission(uri, takeFlags);

当我将此代码添加到扩展 BaseAdapter 的 ImageAdapter 类时,android 抛出异常

08-21 02:14:38.530: W/System.err(24452): java.lang.SecurityException:
No permission grant found for UID 10248 and Uri 
content://com.android.providers.media.documents/document/image:71964

这是我的 ImageAdapter 代码的相关部分

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView ;


    if (convertView == null){
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(185, 185));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(8, 8, 8, 8);

    }
    else{
        imageView = (ImageView)convertView ;
    }

    InputStream is = null;
    Bitmap bitmap = null ;

    try {

        Log.d(TAG,String.valueOf(list.get(position)));
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        final int takeFlags = intent.getFlags()
                & (Intent.FLAG_GRANT_READ_URI_PERMISSION
                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        // Check for the freshest data.

        if (Build.VERSION.SDK_INT >= 19){
            mContext.getContentResolver().takePersistableUriPermission(list.get(position), takeFlags);
        }


        is = mContext.getContentResolver().openInputStream(list.get(position));

        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 8;
        bitmap = BitmapFactory.decodeStream(is,null, options);
        is.close();
        imageView.setImageBitmap(bitmap);

        return imageView;

    }
    catch (Exception e) {
        e.printStackTrace();

        return null;
    }

我究竟做错了什么? 谢谢


我相信我已经解决了。请求意图:

Intent intent;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
    intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
}else{
    intent = new Intent(Intent.ACTION_GET_CONTENT);
}
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent, getResources().getString(R.string.form_pick_photos)), REQUEST_PICK_PHOTO);

and onActivityResult

...
// kitkat fixed (broke) content access; to keep the URIs valid over restarts need to persist access permission
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    final int takeFlags = data.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION;
    ContentResolver resolver = getActivity().getContentResolver();
    for (Uri uri : images) {
        resolver.takePersistableUriPermission(uri, takeFlags);
    }
}
...

我还没有测试过这个 pre-kitkat,我的手机运行的是 5.1,任何人都可以在旧手机上验证这一点吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 android API 19 (KitKat) 中保留权限? 的相关文章

随机推荐

  • HttpSessionListener 不起作用

    我已经实现了 HttpSessionListiner 但它不起作用 用调试器检查 输入 servlet 后创建新会话 登录后 JSESSION ID 发生变化 但 session getCreateTime 保持不变 会话保持不变 使用注释
  • Erlang集群

    我正在尝试使用 Erlang 作为将所有组件粘合在一起的粘合剂来实现一个集群 我喜欢它创建一个完全连接的节点图的想法 但在在线阅读不同的文章后 似乎这不能很好地扩展 最多有 50 100 个节点 OTP 的开发者是否故意施加此限制 我确实知
  • 调用未定义函数curl_file_create() [文件处理]

    我正在尝试使用curl上传文件 在PHP文档中它说 要发布文件 请在文件名前面添加 并使用完整路径 可以通过在文件名后面加上格式为 type mimetype 的类型来显式指定文件类型 此参数可以作为 urlencoded 字符串 如 pa
  • FBSDK 登录错误代码:Objective-C 中的 308

    我不断得到 Error Domain com facebook sdk login Code 308 操作无法 完成 com facebook sdk login 错误 308 尝试从我的设备登录 Facebook 时 我的代码可以在模拟器
  • WebKit 及其遗留前缀

    我正在尝试编译特性前缀为 apple and khtml WebKit 支持哪些and since 哪个版本它们最终被放弃或引入 他们受到什么限制 例如 您可以在以下位置找到它们吗 document body style 我猜只有像记者这样
  • 共同好友数量最多的好友

    我想找到我与他们共同好友数量最多的朋友 我尝试使用 FQL 和图形 API 按以下方式执行此操作 获取当前登录用户的好友列表 FQL SELECT uid1 FROM friend WHERE uid2 MY USER ID and uid
  • Cin 无需等待输入?

    对于我正在开发的项目 我需要程序能够接收用户的输入 但是当他们输入某些内容时 程序可以继续循环 For example while true if userInput true cin gt gt input DO SOMETHING 这意
  • 标记数据和未标记数据有什么区别? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 In this http www youtube com watch v qkcFRr7LqAw在 Sebastian Thrum 的视频
  • 我可以在以后的版本中更改 Android 应用程序图标和名称吗?

    这在某种程度上听起来很愚蠢 但我想知道是否可以在后续版本中更改应用程序徽标 图标 和 Android 名称 比如说 今天我在 Android 市场上推送我的应用程序 明天我想更改徽标 图标 我知道我 不应该 这样做 但是可以这样做吗 另外
  • 使用 OpenVPN 创建 VPN

    我在 Android 10 上连接 VPN 时遇到问题 并在 logcat 中收到以下消息 这是权限错误 寻找解决方案 还在 Mainfest 中添加了 android requestLegacyExternalStorage true 但
  • 在 XSLT 中,在使用时计算设置为 name(..) 之类的变量是否正常?

    我的 XML 中有几棵树 想要根据另一棵树的名称来访问其中一棵树 这里被称为tab name它是当前节点的父标签 所以我使用 name 如果我在设置变量的同一位置进行测试 这会给我正确的值 然而 我遇到的问题是 当我引用 tab name
  • 在单个查询中为每个 DISTINCT 记录选择多条记录

    我需要为每个不同的记录选择几行 几乎就像这里问的那样在 SQL Server 2008 中为每个不同 ID 选择前 n 条记录 https stackoverflow com questions 3364224 select first n
  • 我可以使用同一个套接字进行多个连接吗?

    我正在尝试创建一个扫描一系列地址的 python 函数 我启动了一个套接字并将该套接字作为参数传递给连接到它的函数 def scan socket address port c socket connect ex address port
  • 在 React 中使用 setState 更新对象

    是否有可能更新对象的属性setState 就像是 this state jasper name jasper age 28 我努力了 this setState jasper name someOtherName 和这个 this setS
  • PDO MySQL:在一个查询中插入多行

    你好 我正在制作一个类 用于在 pdo 中进行多次插入 是这样的 INSERT INTO table key1 key2 key3 etc VALUE value1 value2 value3 etc value1 value2 value
  • 如何在sqlalchemy中划分两列

    如何使用 sqlalchemy 生成此 SQL SELECT SUM click SUM impression as my indicator FROM stats session query func sum table click la
  • 导入数据库架构

    我有一个 mysqldump 文件 其中包含架构和数据转储 我只需要从 sqldump 导入数据库架构 我尝试使用以下命令 mysql uUSER pPASSWORD lt filename sql 但没有帮助 它导入模式和数据 我该怎么做
  • 如何将字符串附加到 Pandas 索引

    我有以下 Pandas 数据框 import pandas as pd df pd DataFrame d 1 2 3 index FOO BAR BAZ df d FOO 1 BAR 2 BAZ 3 我想要做的是在索引前面附加两个字符串
  • Android 4.1.1 中的 NETWORK_PROVIDER 行为是否发生了变化?

    我有一个现有的经过充分测试的应用程序 它利用GPS PROVIDER and NETWORK PROVIDER与相同的LocationListener LocationManager报告 GPS 网络和被动定位提供商可用并已启用 我最近将
  • 如何在 android API 19 (KitKat) 中保留权限?

    在我的应用程序中 我将图像路径存储在 SQlite 数据库中以供进一步使用 我得到的路径是 content com android providers media documents document image 3A71964 当我从数据