uni-app targetSdkVersion升级30出现问题
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描述:
-
当targetSdkVersion升级到30之后,在获取权限“WRITE_EXTERNAL_STORAGE”的时候有所不同,就导致了在打开文件管理器获取文件路径的时候只能获取到相册的地址,其他地方的地址获取不到 targetSdkVersion 没有定义的时候,通过WRITE_EXTERNAL_STORAGE获取系统读取权限如下图1 但是打开文件管理器获取图片其他文件的时候就是正常的
-
targetSdkVersion设置了30之后,在通过WRITE_EXTERNAL_STORAGE获取系统读取权限如下图2 打开文件管理器获取图片的时候如图4,打开pdf,doc等其他文件的时候如图3
-
再通过文件管理器获取文件地址的时候,在设置了30之后,除了相册内部的地址可以获取,其他地方的文件地址多获取不到
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 的要求,例如使用WebViewClient
和WebChromeClient
来处理页面加载和权限请求。
5. PendingIntent 变更
Android 11 对 PendingIntent
的行为进行了调整,可能会导致一些通知或广播无法正常工作。
解决方法:
- 在创建
PendingIntent
时,使用PendingIntent.FLAG_MUTABLE
或PendingIntent.FLAG_IMMUTABLE
标志:PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_MUTABLE);