Android 开发笔记之读写权限的小坑

自己的生活自己做主?反正我是东一榔头西一棒子的在IT的海洋中乱闯中…
同学有一个英文版的ForRunner245,抱怨说每次手机上来的消息都是问号,我说这个我可以试试解决。因此,这几天一直在研究如何将手机发来的汉字在英文手表上显示出来(之前说过汉化的事情)。技术路线已经有了,并且实现了,这个以后弄好了再说。因为呢,同学的手机是苹果的,我还得研究在苹果上怎么弄。(我因为讨厌苹果的技术做法,一直没弄过苹果的东西)

读取字模矩阵遇到的存贮读写权限问题

由于手表的内存不大(这个不是主要原因),以及佳明使用的MonekyC SDK对存贮支持的局限性(这个是主要原因), 将汉字库考到手表上的方案暂时搁置,准备采用将汉字字模数据直接发送到手表上的方案。这个方案的优劣暂不考虑,这个需要在手机上对文件进行读操作。由于手机的特殊性,对安全的级别要求比较高,因此Google 对Android的权限使用做了各种限定。使用ChatGPT 获得了读写权限的方法,需要设置 AndroidManifest.xml文件 如下

在这里插入图片描述

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在这里插入图片描述

val PERMISSION_REQUEST_CODE = 1

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), PERMISSION_REQUEST_CODE)
}

在这里插入图片描述

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    when (requestCode) {
        PERMISSION_REQUEST_CODE -> {
            if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                // Permission granted, proceed with file access
            } else {
                // Permission denied, handle the case
            }
            return
        }
        else -> {
            // Ignore other requests
        }
    }
}

照着做之后,在运行中仍然不能是访问被拒,耗时半天不能得解。后来只好再用原始手段,使用搜索引擎得到下来方案。

requestLegacyExternalStorage 参数设置 相关

具体参阅
有关手机存贮权限

里面设计API版本和参数requestLegacyExternalStorage 的设置问题,AI解释如下

requestLegacyExternalStorage 是一个 AndroidManifest.xml 中的参数,用于 Android 10(API 级别 29)的应用,以便继续使用传统的外部存储访问方式。以下是对该参数的详细解释和使用场景:

背景

从 Android 10 开始,Android 引入了 Scoped Storage,限制了应用对设备外部存储的访问权限。这一变化旨在提高用户数据的隐私和安全性。具体来说,应用只能访问其私有目录和特定媒体类型的文件(如图片、视频、音频),而无法像以前那样随意访问整个外部存储。

requestLegacyExternalStorage 参数
为了让现有的应用在适配 Scoped Storage 之前继续正常运行,Android 提供了 requestLegacyExternalStorage 参数。将该参数设置为 true,可以让应用在 Android 10 上继续使用传统的外部存储访问方式。

使用方法
在 AndroidManifest.xml 中,将 requestLegacyExternalStorage 参数设置为 true:

<manifest ... >
    <application
        android:requestLegacyExternalStorage="true"
        ... >
        ...
    </application>
</manifest>

使用场景

现有应用的兼容性:

如果你的应用在 Android 10 之前的版本上使用了大量的外部存储访问代码,并且短期内无法完成对 Scoped Storage 的适配,可以使用这个参数以确保应用在 Android 10 上仍能正常工作。
临时解决方案:

在逐步迁移到 Scoped Storage 期间,可以暂时使用这个参数,以便有更多时间重构代码并适配新的存储模型。
文件管理应用:

某些文件管理类应用需要广泛访问外部存储中的文件。在这些应用适配 Scoped Storage 的复杂需求之前,可以使用此参数以维持功能完整性。

因此对于一个比较传统的开发者而言,新技术在没有掌握的时候,传统的方法还是必须的。上面提到的 Scoped Storage 的使用,我还没有用过,后面看看。

maraSun BJFWDQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值