天天看点

【FAQ】从存储权限看HarmonyOS 3.0中应用适配

问题背景:

HarmonyOS 3.0发布了,之前开发的Android的应用,发现系统选项中存储权限部分有变化,如下图:

【FAQ】从存储权限看HarmonyOS 3.0中应用适配

【FAQ】从存储权限看HarmonyOS 3.0中应用适配

”存储“权限变为”媒体和文件“,且只能访问”仅媒体“的文件目录。因为项目需要读取本地导入存储文件,”仅媒体“权限无法满足当前项目需求。

初步分析:

控制变量排查问题根源,而在另一台2.0.0的手机并没有发生此问题。如下图中”存储访问权限“开启则可以获取所有外部文件,因而怀疑与3.0系统权限控制有关。

【FAQ】从存储权限看HarmonyOS 3.0中应用适配

真正的原因:

查阅资料后发现,”仅媒体“权限是Android 11中新增的”媒体文件访问权限“ (​​Android 11 中的存储机制更新  |  Android 开发者  |  Android Developers​​),因此判断HarmonyOS 3.0适配的是Android 11以上版本。因此需要做相应的适配,查阅官方文档针对Android 11上访问所有文件,有一个新的权限MANAGE_EXTERNAL_STORAGE(​​管理存储设备上的所有文件  |  Android 开发者  |  Android Developers​​)

具体步骤如下:

1、在Manifest中声明权限:

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />      
【FAQ】从存储权限看HarmonyOS 3.0中应用适配

声明这个权限后,我们在系统权限管理中就可以找到访问所有文件的权限入口,如下图:

【FAQ】从存储权限看HarmonyOS 3.0中应用适配

2、判断是否获取到MANAGE_EXTERNAL_STORAGE权限:

//判断是否获取MANAGE_EXTERNAL_STORAGE权限:
    Boolean isHasStoragePermission= Environment.isExternalStorageManager()      
【FAQ】从存储权限看HarmonyOS 3.0中应用适配

3、使用系统intent跳转至权限界面,打开所有文件访问权限:

Intent intent = Intent();
    intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
    startActivity(intent);      
【FAQ】从存储权限看HarmonyOS 3.0中应用适配