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

6 回复

解决了没?我也遇到这个问题

更多关于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);
    }
});

注意事项

  1. 权限处理:虽然内部存储不需要额外的权限,但如果你需要访问外部存储,必须处理运行时权限。
  2. 路径管理:使用uni.env.USER_DATA_PATH来确保路径的正确性,这是uni-app提供的跨平台路径管理API。
  3. 兼容性:确保你的代码在不同版本的Android设备上都能正常工作,特别是考虑到不同版本的Android对存储访问的限制不同。

通过上述方法,你可以有效地解决targetSdkVersion设置为29或更高时,Android 10+系统设备上的文件路径问题。

回到顶部