Android13关于获取外部存储文件的相关问题及解决方案记录
创始人
2024-12-09 02:32:58
0

  Android的学习路上...

  • 测试设备:vivo X90s
  • 安卓版本: Android13
  • 开发环境:AndroidStudio Flamingo
  • SDK:33

最近我在Android13的环境下尝试写一个文件选择器,以便日后的开发使用。但是我们知道,从Android13 (API33) 开始,外部存储权限发生了变化,要想读取外部存储文件,使用原来的权限注册方式已经失效了。

   

测试一下:我在test文件夹内有4个文件和1个文件夹。

左图是系统自带的文件选择器,右图是我开发的文件选择器(我是以系统的选择器作为参照的,因此样子长得很像😄)。此时我的文件选择器只注册了 WRITE/READ_EXTERNAL_STORAGE 权限。可以看到,这种方式在Android13中是获取不到文件的,只能获取文件夹。

系统自带的文件选择器
我开发的文件选择器

这是因为Android13细化了外部存储权限,在我的理解里,Android13把文件分为了媒体文件非媒体文件。媒体文件包括照片视频音频,他们需要各自的权限才能获取。权限声明如下所示(在AndroidManifest.xml中声明后还需动态获取权限):

     

在上图中,picture.png属于照片文件,video.mp4属于视频文件,music.mp3属于音频文件。而text.pdf就属于非媒体文件了。若现在赋予我的文件选择器媒体文件权限,如下图所示,此时就能看到:picture.png、video.mp4、music.mp3就能被获取了。

开启媒体文件权限
获取到媒体文件

那除了媒体文件外,其他的比如PDF文件、DOCX文件、TXT文件等等这些非媒体文件应该如何获取呢?其中之一可行的办法就是使用管理所有文件权限

 

 使用此权限时,需要现在AndroidManifest.xml中声明,但不需动态获取权限。而是要跳转到设置页面使用户手动开启权限,跳转代码如下:

// 跳转至设置页面,让用户手动开启 public void setting(Activity activity) {     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {         if (!Environment.isExternalStorageManager()) {             Intent intent = new Intent(                 Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);             intent.setData(Uri.parse("package:" + activity.getPackageName()));             activity.startActivity(intent);         }     } }

 设置页面如下左图。手动开启了权限后,就可以获取到其他文件了,如下右图所示。 

管理所有文件权限设置页面
开启后就能获取到非媒体文件了

开启此权限值得注意的是: 

如果允许了此权限,那么即使应用无“照片与视频”、“音乐与音频”权限,仍可访问、写入、修改和删除所有文件。

 也就是说,如果开启了这个权限,就可以获取所有的文件了(包括媒体文件和非媒体文件),那么媒体文件的权限就算不申请也可以获得权限。

总结:

1.  如果业务需求只获取媒体文件,那么就 AndroidManifest.xml 注册以下权限并动态申请权限。

     

2. 如果业务需求获取非媒体文件或所有文件,那么就在 AndroidManifest.xml 注册以下权限并跳转至设置页面使用户手动开启权限。

 
// 跳转至设置页面,让用户手动开启 public void setting(Activity activity) {     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {         if (!Environment.isExternalStorageManager()) {             Intent intent = new Intent(                 Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);             intent.setData(Uri.parse("package:" + activity.getPackageName()));             activity.startActivity(intent);         }     } }

这是我在开发中尝试的一种可行的方案,如果大家有其他可行的方案欢迎留言。如文章有错误之处,强烈欢迎指正,在下萌新需要多多学习和积累,谢谢啦~

相关内容

热门资讯

黑科技辅助“赣牌圈挂怎么安装”... 黑科技辅助“赣牌圈挂怎么安装”外挂透视辅助下载(一贯真的有挂);1、进入到赣牌圈挂怎么安装黑科技之后...
第2分钟辅助挂!海盗来了刷能量... 第2分钟辅助挂!海盗来了刷能量辅助(辅助挂)必胜教程(竟然是真的有挂)1、海盗来了刷能量辅助ai机器...
9分钟辅助器!微友联盟辅助(辅... 9分钟辅助器!微友联盟辅助(辅助挂)果然是真的有挂(详细辅助软件教程)1)微友联盟辅助辅助挂:进一步...
黑科技辅助挂“游戏辅助神器ap... 黑科技辅助挂“游戏辅助神器app”外挂透视辅助器(真是存在有挂);1、上手简单,内置详细流程视频教学...
两分钟辅助器!欢乐对决脚本(辅... 两分钟辅助器!欢乐对决脚本(辅助挂)规律教程(往昔是有挂)1、超多福利:超高返利,海量正版游戏,欢乐...
第3分钟了解!闲逸辅助器(辅助... 第3分钟了解!闲逸辅助器(辅助挂)好像是有挂(详细辅助AA德州教程);1、完成闲逸辅助器的残局,帮助...
黑科技辅助挂“奇迹永久免费脚本... 黑科技辅助挂“奇迹永久免费脚本辅助工具”外挂透视辅助助手(果然存在有挂)亲,关键说明,奇迹永久免费脚...
4分钟辅助挂!大唐麻雀辅助器怎... 4分钟辅助挂!大唐麻雀辅助器怎么设置(辅助挂)靠谱教程(真是真的是有挂)是一款可以让一直输的玩家,快...
5分钟辅助挂!随意玩辅助软件(... 5分钟辅助挂!随意玩辅助软件(辅助挂)确实有挂(详细辅助AI教程)1)随意玩辅助软件辅助挂:进一步探...
黑科技辅助“拼十app辅助”外... 黑科技辅助“拼十app辅助”外挂透视辅助下载(总是有挂);1、起透看视 拼十app辅助透明视辅助2、...