IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Uniapp 下安卓的权限申请

    obaby发表于 2024-06-19 06:20:52
    love 0

    安卓手机各种定制化的系统,真的是一言难尽。尤其是国内的这些手机厂商各种定制化的系统,底层修改加上深度定制。也就导致了为了适应国内的手机厂商系统,要做大量的工作。

    这几天在准备闺蜜圈的更新发版,再加入了推送之后。由于系统的角标设置问题,最终是通过原生插件实现的。想着多找几个设备测试下实际的效果。

    百度的 mtc 平台之前充了 200 块钱,停止做 app 之后里面有一些余额已知没用完,结果再次想使用的时候结果要求进行企业认证。当时就懵逼了。

    现在真机租用的价格是真的离谱,一块钱一分钟,没有任何的优惠。

    结果第一台机器就遇到了让输入身份证号验证的情况,5 块钱白花了。

    这 tm 我咋知道号码是啥,联系客服结果折腾半天都没找到人工,最后加 qq 群才有人联系自己,加微信,把时间返还了。就离谱。不过在测试的时候还是发现了一个问题,那就是竟然在一些手机上无法访问图片。

    为了满足华为市场上架要求,增加了一个弹窗用来显示权限申请的提示。实现逻辑:

    UNIAPP 华为应用商店 未同步告知权限申请的使用目的

    然而,也正是因为这个代码,貌似导致在 android 11 以上的系统失效了。具体原因可能是安卓权限的细化导致的,已经不在有这个存储权限申请了,取代的是更加细化的权限:

    在Android14上与应用交互的用户现在可以授予对其媒体库的部分访问权限(READ_MEDIA_IMAGES和READ_MEDIA_VIDEO)。

    新对话框包含以下选项:

    ●  选择照片和视频: Android14中的新功能。用户选择想要提供给应用的特定照片和视频;

    ●  全部允许:用户授予对设备上所有照片和视频的完整库访问权限;

    ●  不允许:用户拒绝所有访问。

    如果用户选择了“选择照片和视频”并且应用稍后再次请求READ_MEDIA_IMAGES 或者 READ_MEDIA_VIDEO权限,系统会显示不同的对话框,让用户有机会授予完全访问的权限,维持现状,或者授予对其他照片和视频的访问权限。为了帮助应用支持新的变化,系统引入了一个新的权限READ_MEDIA_VISUAL_USER_SELECTED。

    如果应用不声明READ_MEDIA_VISUAL_USER_SELECTED权限,则会发生以下行为:

    ●  在用户与应用会话期间,将会授予对用户选择的照片和视频的READ_MEDIA_IMAGES 和 READ_MEDIA_VIDEO 临时访问权限。当应用移到后台或者当用户主动杀死应用时,系统最终会拒绝这些权限。此行为就像其他一次性权限一样;

    ●  如果应用稍后需要访问其他照片和视频,必须手动请求权限重新获得权限。

    https://developers.vivo.com/doc/d/6ca290306e294b11ae2d6bf14757fd1d
    • Android 10。分区存储、限制访问不可重置的硬件标识符、限制对剪贴板数据的访问权限
    • Android 11。强制执行分区存储、单次授权、自动重置权限、软件包可见性。
    • Android 12。授予大致位置信息权限、剪贴板访问通知、更安全的组件导出。
    • Android 13。细化的媒体权限、内置图片选择器、隐藏剪贴板中的敏感内容、屏蔽不匹配的 Intent、针对 Wifi 设备的新运行时权限、广告 ID 权限。

     

    不得不说因为这些更新导致的一些问题,的确比较棘手。主要是系统版本,厂商定制合并到一块,这个问题就麻烦了。

    搜索之后发现uniapp 的 uts 插件:https://ext.dcloud.net.cn/plugin?id=15597

    然而,这个插件的问题,貌似在 uniapp 项目中导入之后申请权限没有看到效果,不知道是因为代码问题还是什么其他问题导致的。底层的实现逻辑应该是:https://github.com/getActivity/XXPermissions?tab=readme-ov-file

    这个开源项目看起来相对更靠谱一些,后期如果需要喜欢权限申请以及判断,可能还是得将这个项目代码集成到原生插件中实现。

    如果项目已经适配了 Android 10 分区存储特性,请在 AndroidManifest.xml 中加入
    <manifest>
    
        <application>
    
            <!-- 告知 XXPermissions 当前项目已经适配了分区存储特性 -->
            <meta-data
                android:name="ScopedStorage"
                android:value="true" />
    
        </application>
    
    </manifest>
    如果当前项目没有适配这特性,那么这一步骤可以忽略
    
    需要注意的是:这个选项是框架用于判断当前项目是否适配了分区存储,需要注意的是,如果你的项目已经适配了分区存储特性,可以使用 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 来申请权限,如果你的项目还没有适配分区特性,就算申请了 READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 权限也会导致无法正常读取外部存储上面的文件,如果你的项目没有适配分区存储,请使用 MANAGE_EXTERNAL_STORAGE 来申请权限,这样才能正常读取外部存储上面的文件,你如果想了解更多关于 Android 10 分区存储的特性,可以点击此处查看和学习。

    这一系列的权限细分,适配起来就比较蛋疼了。

    目前暂时的解决方案,针对华为系列的手机进行权限提醒,其他的暂时先不做处理了:

    if (plus.os.name != "iOS") {
                        var androidVersion = plus.os.version;
                        console.log('Android版本信息:', androidVersion);
                        console.log('系统信息:', plus.os.name);
                        // this.showToast(androidVersion);
                        let info = uni.getSystemInfoSync();
                        console.log('手机品牌:' + info.brand); // 输出手机品牌
                        if (info.brand === 'huawei' ||info.brand === 'honor') {
    
                            let result = await this.$store.dispatch("permitions/requestPermissions",
                                'READ_EXTERNAL_STORAGE')
                            if (result !== 1) return
                        } else {
                            // let result =await this.$store.dispatch("permitions/requestPermissions",
                            // 	'MANAGE_EXTERNAL_STORAGE')
                            // if (result !== 1) return
                            // 针对安卓13以上不处理 声明权限
                        }
    
                    }

    一圈下来,钱都花光了要~~

    一分钟一块钱,从来没觉得时间这么值钱过~~

     



沪ICP备19023445号-2号
友情链接