热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ContentResolver操作uri权限问题

在Android中使用ContentResolver通过uri代开输入流:ContentResolvercontentResolvergetContentResol

在Android中使用ContentResolver通过uri代开输入流:

ContentResolver contentResolver = getContentResolver();
InputStream inputStream = contentResolver.openInputStream(uri);

报了以下错误:

java.lang.SecurityException: Permission Denial: reading com.android.externalstorage.ExternalStorageProvider uri content://com.android.externalstorage.documents/document/primary%3ADownload%2Fxxx from pid=15575, uid=10079 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()

或报

Caused by: java.lang.SecurityException: UID 10173 does not have permission to content://com.android.fileexplorer.myprovider/external_files/Android/data/com.tencent.mobileqq/Tencent/QQfile_recv/6.%E5%B9%BF%E5%B7%.pdf [user 0]

查看官方文档:

在这里插入图片描述
当接收uri的activity销毁之后,这个uri也就失去权限,它是跟随接收它的activity生命周期的,那么我们只需要在接收的activity销毁之前,将权限传递给其他的activity即可:

Intent intent = new Intent(MainActivity.this, BActivity.class);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(uri,Intent.ACTION_OPEN_DOCUMENT);
intent.setType(Intent.ACTION_CREATE_DOCUMENT);
startActivity(intent);

注意:


  1. activity只能逐级传递权限,比如你的跳转流程是a-》b-》c,需要每次跳转都使用上面的方法。
  2. 在跳转过程中确保在其他地方intent的flags没被修改,比如在前面做了intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION),后面的步骤中可能需要用到其他的flags,务必要使用addFlags而不能用setFlags,因为setFlags会把前面设置的给覆盖掉!

以上是一个URI传递权限的情况,那如果是一个URI集合呢,要怎么传递,比如:

List<Uri> uris &#61; intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);

要想把uris的权限传递到下一个activity&#xff0c;也比较简单&#xff0c;只需要这么做&#xff1a;

Intent intent &#61; new Intent(MainActivity.this, BActivity.class);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.setType(Intent.ACTION_CREATE_DOCUMENT);
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
startActivity(intent);

注意&#xff1a;如果少了intent.setAction(Intent.ACTION_SEND_MULTIPLE)&#xff0c;则报错&#xff1a;java.lang.SecurityException: Permission Denial: reading com.android.externalstorage.ExternalStorageProvider uri content://com.android.externalstorage.documents/document/primary%3ADownload%2Fxxx from pid&#61;15575, uid&#61;10079 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()


推荐阅读
author-avatar
好人木庄子mzz
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有