uni-app targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径 请更改为应用运行路径
uni-app targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径 请更改为应用运行路径
操作步骤:
执行代码,
plus.io.resolveLocalFileSystemURL(path, function(entry) {
entry.file(function(file){
var fileReader = new plus.io.FileReader()
fileReader.readAsText(file, 'utf-8')
fileReader.onloadend = function(evt) {
alert("11" + evt);
alert("evt.target" + evt.target);
alert(evt.target.result);
}
alert(file.size + '--' + file.name);
} );
}, function (e) {
alert("Resolve file URL failed: " + e.message);
} );
预期结果:
fileReader.onloadend的函数里evt.target.result返回正确的文件对象
实际结果:
fileReader.onloadend的函数里evt.target.result返回为空,且报错targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径。请更改为应用运行路径!
bug描述:
targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径。请更改为应用运行路径,这个问题请问下要怎么解决?需求是需要读取外部存储的音频文件,用plus.io.resolveLocalFileSystemURL获取到file对象后,调用plus.io.FileReader返回的是:targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径。请更改为应用运行路径,请问下要怎么解决?根据提示查看了这个文档https://ask.dcloud.net.cn/article/36199,但是还是没懂要怎么解决,求助!
| 信息类别 | 信息内容 |
|------------------|----------------|
| 产品分类 | uniapp/App |
| PC开发环境操作系统 | Windows |
| PC开发环境操作系统版本号 | win11 |
| HBuilderX类型 | 正式 |
| HBuilderX版本号 | 4.29 |
| 手机系统 | Android |
| 手机系统版本号 | Android 12 |
| 手机厂商 | 模拟器 |
| 手机机型 | A64主控芯片 |
| 页面类型 | vue |
| vue版本 | vue3 |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
更多关于uni-app targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径 请更改为应用运行路径的实战教程也可以访问 https://www.itying.com/category-93-b0.html
解决了没?我也遇到这个问题
更多关于uni-app targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径 请更改为应用运行路径的实战教程也可以访问 https://www.itying.com/category-93-b0.html
回复 忆笙秋: 解决了吗
targetSdkVersion设置>=29后在Android10+ 做了文件分区,https://ask.dcloud.net.cn/article/36199 参考这篇回答,plus.io.FileReader 是没办法获取系统公共目录下的文件的。
targetSdkVersion设置>=29后在Android10+ 做了文件分区,https://ask.dcloud.net.cn/article/36199 参考这篇回答,plus.io.FileReader 是没办法获取系统公共目录下的文件的。
在uni-app中,当targetSdkVersion
设置为29或更高时,Android 10(API 级别 29)及以上版本对于文件访问路径的权限和限制变得更加严格。特别是,直接访问外部存储路径(如/sdcard/
或/storage/emulated/0/
)通常会被限制,需要使用应用专属的存储目录或申请相应的存储访问权限。
为了解决这个问题,你可以考虑使用Android的Scoped Storage(范围存储)或者申请MANAGE_EXTERNAL_STORAGE
权限(但这通常不推荐,因为它可能会在未来的Android版本中被弃用)。更常见的做法是使用应用的内部存储或媒体存储API来访问文件。
以下是一个示例,展示如何在uni-app中保存和读取文件到应用的内部存储目录:
保存文件到内部存储
// 获取应用的内部存储目录
const fs = uni.getFileSystemManager();
const dirPath = `${uni.env.USER_DATA_PATH}/your_directory/`;
// 确保目录存在
fs.mkdir({
dirPath: dirPath,
recursive: true,
success: () => {
// 写入文件
const filePath = `${dirPath}your_file.txt`;
fs.writeFile({
filePath: filePath,
data: 'Hello, World!',
encoding: 'utf8',
success: () => {
console.log('File saved successfully');
},
fail: err => {
console.error('Failed to save file', err);
}
});
},
fail: err => {
console.error('Failed to create directory', err);
}
});
从内部存储读取文件
// 读取文件
const filePath = `${uni.env.USER_DATA_PATH}/your_directory/your_file.txt`;
fs.readFile({
filePath: filePath,
encoding: 'utf8',
success: res => {
console.log('File content:', res.data);
},
fail: err => {
console.error('Failed to read file', err);
}
});
注意事项
- 权限处理:虽然内部存储不需要额外的权限,但如果你需要访问外部存储,必须处理运行时权限。
- 路径管理:使用
uni.env.USER_DATA_PATH
来确保路径的正确性,这是uni-app提供的跨平台路径管理API。 - 兼容性:确保你的代码在不同版本的Android设备上都能正常工作,特别是考虑到不同版本的Android对存储访问的限制不同。
通过上述方法,你可以有效地解决targetSdkVersion
设置为29或更高时,Android 10+系统设备上的文件路径问题。