我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android无需读写权限通过临时授权读写用户文件怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android无需读写权限通过临时授权读写用户文件怎么实现

这篇文章主要讲解了“Android无需读写权限通过临时授权读写用户文件怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android无需读写权限通过临时授权读写用户文件怎么实现”吧!

在进行需求开发的时候,我们总是避不开和用户的数据打交道,那提到获取用户的数据一定会想到的东西就是申请权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在我刚学习安卓的时候,我是以为APP一定要声明了读写用户空间权限并且在用户授权之后才能获取到用户的文件,即使是做个简简单单的更换头像的功能,或者是升级APP时下载新的APK。对于后者,我们其实可以将升级的APK包放到我们应用的私有目录下(无需权限),对于前者,有什么比较轻量,适合快速开发需求的方法来满足呢。

这里插三段小说明,如果只想知道方法的可以直接跳过

  • 首先我们要明白,为什么谷歌要用读写权限来限制APP对用户文件的操作权。答案其实很明显,因为需要防止APP恶意侵犯用户隐私,或者是在用户的目录里存放大量的垃圾文件,在用户目录里存放的文件是不会随着APP的卸载而被删除的,所以如果所有APP都在用户的目录里存放文件(像是相册文件夹/下载文件夹),那用户的体验别提有多糟糕了。

  • 其次就是声明权限其实是有挺多弊端的,如果不是非必须的权限,其实谷歌是希望我们能不要就不要的。做过谷歌应用市场开发的就知道,你声明的每个权限都会在谷歌应用的详情页标注,这不仅仅是让用户一进来就觉得:"这个APP又要窥探我隐私",而且是让你在填应用的数据安全表单时更加地麻烦,因为你声明了读写权限,那你就要说明你的APP会获取用户的什么数据,如何保存,用户是否可以删除以及是否知情等等。还有就是你声明的权限越多,你的应用审核时间就会越长,这个我相信没有人觉得无所谓吧

  • 第三就是,Android11及以上的版本其实已经大削了WRITE_EXTERNAL_STORAGE这个权限,谷歌不再允许APP悄悄地在用户的外置存储目录里偷偷拉屎了,你在用户目录里创建什么目录存取什么数据都要在用户知情并且同意的情况下才能进行,而本文要介绍的方式是能兼容到Android13的,所以赶紧学起来吧^-^

模拟获取用户的图片的逻辑

我们需要拿到代表用户临时授权给APP的Uri

通过

val intent = Intent(Intent.ACTION_GET_CONTENT)    .addCategory(Intent.CATEGORY_OPENABLE)    //这里传的参数是你要获取的文件类型的mimeType    .setType(mimeType)startActivityForResult(intent,1024)override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {    super.onActivityResult(requestCode, resultCode, data)    if (requestCode == 1024 && resultCode == RESULT_OK) {        val uri = data?.data        //这里获取到的uri就是用户临时授权的文件/文件夹的的标识    }}

或者

val launch = registerForActivityResult(ActivityResultContracts.GetContent()){uri-> //这里获取到的uri就是用户临时授权的文件/文件夹的的标识}//这里传的参数是你要获取的文件类型的mimeTypelaunch.launch("**"那就代表文件夹val launcher = registerForActivityResult(ActivityResultContracts.CreateDocument("*/*")){uri->    //这里获取到的uri是已经创建好的文件的uri}//这里传入要创建的文件名launcher.launch("cache.png")

启动之后是这个界面

Android无需读写权限通过临时授权读写用户文件怎么实现

通过contentResolver打开文件的文件描述符FileDescriptor

val pfd : ParcelFileDescriptor? = context.contentResolver.openFileDescriptor(uri, "rw")

第一个参数是我们刚刚得到的文件的uri,第二个文件是表示我们对文件的操作模式,我现在示范的是保存一张图片所以要用读写模式("rw")

通过FileDescriptor可以打开一个文件IO流(FIS或者FOS),就可以写文件啦

FileOutputStream(pfd.fileDescriptor).use {//这里将处理好的图片利用fos写到用户刚才用uri指定的地方}

另一种读取文件的方法,还是使用contentResolver直接打开io流

context.contentResolver.openOutputStream(uri)?.use {}

模拟获取用户文件夹控制权的操作

最后再模拟一下获取用户文件夹控制权的操作,通过这个方法你可以拿到其他应用在外置存储里的目录(例如一些聊天软件的聊天记录其实就是存放在这个目录的)

Android无需读写权限通过临时授权读写用户文件怎么实现

通过Uri获取文件信息

最后再介绍一 通过Uri获取文件信息(文件名/文件大小/文件Mime类型)的方法

//第二个参数相当于是sql里的select,列表里是要过滤的列名,如果传null那说明取所有的列,这样性能会比较差val cursor: Cursor? = context.contentResolver.query(    this,    arrayOf(MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.SIZE),    null,    null,    null)?.use { cursor ->    if (cursor.moveToFirst()) {        val columnIndex1 = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME)        if (columnIndex1 > -1) {            name = cursor.getString(columnIndex1)        }        val columnIndex2 = cursor.getColumnIndex(MediaStore.MediaColumns.SIZE)        if (columnIndex2 > -1) {            size = cursor.getLong(columnIndex2)        }    }

文件的话,用正常途径也只能拿到文件名(MediaStore.MediaColumns.DISPLAY_NAME),文件大小(MediaStore.MediaColumns.SIZE),文件Mime类型(MediaStore.MediaColumns.MIME_TYPE)这三个有用的信息 注意,获取到的cursor是Closeable对象,所以用完之后需要手动close()

感谢各位的阅读,以上就是“Android无需读写权限通过临时授权读写用户文件怎么实现”的内容了,经过本文的学习后,相信大家对Android无需读写权限通过临时授权读写用户文件怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android无需读写权限通过临时授权读写用户文件怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android无需读写权限通过临时授权读写用户文件怎么实现

这篇文章主要讲解了“Android无需读写权限通过临时授权读写用户文件怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android无需读写权限通过临时授权读写用户文件怎么实现”吧!在
2023-07-05

Android无需读写权限通过临时授权读写用户文件详解

这篇文章主要为大家介绍了Android无需读写权限通过临时授权读写用户文件详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录