最近在开发一款简单的音乐播放器,中间要求从指定文件夹读取歌曲文件和歌词文件,按部就班地通过File从文件夹读取文件,先申请读写权限:
AndroidManifest.xml
- <uses-permission android:name="android.permission.BLUETOOTH" />
- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
Activity
- private static final String[] PERMISSIONS = {
- "android.permission.READ_EXTERNAL_STORAGE",
- "android.permission.WRITE_EXTERNAL_STORAGE"};
-
- public static void verifyStoragePermissions(Activity activity) {
- int permission;
- try {
- //检测是否有写的权限
- for (String s : PERMISSIONS) {
- permission = ActivityCompat.checkSelfPermission(activity, s);
- if (permission != PackageManager.PERMISSION_GRANTED) {
- // 没有写的权限,去申请写的权限,会弹出对话框
- ActivityCompat.requestPermissions(activity, PERMISSIONS, REQUEST_EXTERNAL_STORAGE);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
然后获取文件:
- File[] subFile = file.listFiles();
-
- for (File value : subFile) {
- // 判断是否为文件夹
- if (!value.isDirectory()) {
- String filename = value.getName();
- // 判断是否为MP3结尾
- if (filename.trim().toLowerCase().endsWith(".mp3")) {
- ListItem data = new ListItem();
- String name=filename.split("\\.")[0];
- data.name=name;
- data.path = SYS_FILE_PATH + "/" + name;
- Buffer.add(data);
- }
本来在虚拟机还是实机(Android 11)运行时都非常正常,但是就在联系客户测试的时候,客户告知我扫描音乐时闪退!经过了解得知用户使用的为华为手机(HarmonyOS 2.0),然后就开始了对崩溃原因的排查,最后锁定了file.listFiles()方法返回值为空
File[] subFile = file.listFiles();
此时subFile为null,所以读取出异常崩溃,于是我就输出了file的可读性file.canRead(),奇怪的事发生了,在Android 11运行时会返回ture(可读),而在HarmonyOS则会返回false(不可读),这个Bug一时间还真没想到原因,由于HarmonyOS资料少,兼容性问题资料更少,求助于互联网并不能找到有效地解决方案,只能自己寻找原因。
首先想到了权限的问题,之前知道最新的SDK引入了一些新权限,所以去查了一下,结果就发现了ACCESS_MEDIA_LOCATION这个从媒体收藏中读取位置信息的权限,一想到自己是在读取的时候出的问题,果断加上,结果Bug依旧,在Android 11运行时会返回ture(可读),而在HarmonyOS则会返回false(不可读),依然在华为手机上闪退
在尝试诸多办法无果后,最终无意间看到HarmonyOS 2.0大约相当于Android 10(不知有无根据),最终决定降一下targetSdkVersion,由30降至28时,Bug消失!
总结:兼容性方面,HarmonyOS和Android还是有些许去别的,而且HarmonyOS与Android并没有官方的版本对应关系,个人认为(仅个人看法)HarmonyOS 2.0与Android10版本相似,在开发Android应用时,如果放到HarmonyOS设备上有Bug,不妨降低一下兼容SDK版本,说不定问题就解决了,因为Android自身SDK不兼容时都会出一些Bug,更何况和HarmonyOS不兼容时呢。
评论记录:
回复评论: