关于安卓开发,在鸿蒙系统应用时,File读取文被拒绝访问的解决方案

        最近在开发一款简单的音乐播放器,中间要求从指定文件夹读取歌曲文件和歌词文件,按部就班地通过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不兼容时呢。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值