uni-app targetSdkVersion升级30出现问题

发布于 1周前 作者 bupafengyu 来自 Uni-App

uni-app targetSdkVersion升级30出现问题

产品分类:

uniapp/App

PC开发环境操作系统:

Windows

PC开发环境操作系统版本号:

window11

HBuilderX类型:

正式

HBuilderX版本号:

3.99

手机系统:

Android

手机系统版本号:

Android 12

手机厂商:

小米

手机机型:

红米 k30sUltra

页面类型:

vue

vue版本:

vue2

打包方式:

云端

项目创建方式:

HBuilderX

示例代码:

const _rResult = await permissionSpecification.requestPermissions('WRITE_EXTERNAL_STORAGE'); //获取文件读取权限
if(_rResult !== 1) return;
gainFileChanges((res)=>{
if(res){
uni.showToast({
title:'获取地址成功'+res, 
icon:'none'
})
}else{
uni.showToast({
title:'获取地址失败'
})
}  
})

操作步骤:

使用云端证书打包测试,打开文件管理器获取文件地址,除了音频,视频,图片以外的其他文件多获取不到,手机使用标准基座测试没有问题

预期结果:

打开文件管理器获取文件地址,正常获取文件地址

实际结果:

只能获取图片,音频,视频的地址,其他文件地址获取不到

bug描述:

  1. 当targetSdkVersion升级到30之后,在获取权限“WRITE_EXTERNAL_STORAGE”的时候有所不同,就导致了在打开文件管理器获取文件路径的时候只能获取到相册的地址,其他地方的地址获取不到 targetSdkVersion 没有定义的时候,通过WRITE_EXTERNAL_STORAGE获取系统读取权限如下图1 但是打开文件管理器获取图片其他文件的时候就是正常的

  2. targetSdkVersion设置了30之后,在通过WRITE_EXTERNAL_STORAGE获取系统读取权限如下图2 打开文件管理器获取图片的时候如图4,打开pdf,doc等其他文件的时候如图3

  3. 再通过文件管理器获取文件地址的时候,在设置了30之后,除了相册内部的地址可以获取,其他地方的文件地址多获取不到


5 回复

targetSdkVersion = 30 android11+系统会强制限制应用操作文件的目录。仅支持app沙盒目录及部分公共目录。建议你尽早修改这种读取手机根目录资源的业务逻辑。


那也就是说,现在只能获取沙盒目录和公共目录(相册)等文件,那其他的文件是不能获取了吗

回复 我是纸飞机: 是的,如果你要获取所有存储文件需要申请“所有文件访问权” 具体参考官方文档:https://developer.android.google.cn/training/data-storage/manage-all-files?hl=zh-cn

回复 DCloud_Android_ST: 好的

uni-app 项目中,将 targetSdkVersion 升级到 30 时可能会遇到一些问题,主要是因为 Android 11 (API 30) 引入了一些新的权限和行为变更。以下是一些常见问题及其解决方法:

1. 文件访问权限问题

Android 11 引入了 Scoped Storage,限制了应用对文件系统的访问。如果你的应用需要访问外部存储,可能会遇到权限问题。

解决方法:

  • 使用 MANAGE_EXTERNAL_STORAGE 权限:如果你的应用需要广泛访问外部存储,可以在 AndroidManifest.xml 中添加以下权限:

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

    并请求用户授权:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        if (!Environment.isExternalStorageManager()) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivity(intent);
        }
    }
  • 使用 MediaStore API:如果不需要广泛访问外部存储,建议使用 MediaStore API 来访问媒体文件。

2. 包可见性限制

Android 11 引入了包可见性限制,默认情况下,应用无法直接查询或与其他应用的组件交互。

解决方法:

  • AndroidManifest.xml 中添加 <queries> 元素,声明你需要访问的其他应用包名:
    <queries>
        <package android:name="com.example.package" />
    </queries>

3. 后台位置权限

Android 11 对后台位置权限进行了更严格的限制。如果你的应用需要访问后台位置,用户必须明确授予权限。

解决方法:

  • AndroidManifest.xml 中添加以下权限:
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    并在运行时请求用户授权:
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION}, REQUEST_CODE);
    }

4. WebView 相关变更

Android 11 对 WebView 的行为进行了调整,可能会导致一些功能无法正常工作。

解决方法:

  • 确保你的 WebView 配置符合 Android 11 的要求,例如使用 WebViewClientWebChromeClient 来处理页面加载和权限请求。

5. PendingIntent 变更

Android 11 对 PendingIntent 的行为进行了调整,可能会导致一些通知或广播无法正常工作。

解决方法:

  • 在创建 PendingIntent 时,使用 PendingIntent.FLAG_MUTABLEPendingIntent.FLAG_IMMUTABLE 标志:
    PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_MUTABLE);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!