uni-app 使用 plus.io.requestFileSystem 读取本地文件时,安卓10以上系统无法读取

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

uni-app 使用 plus.io.requestFileSystem 读取本地文件时,安卓10以上系统无法读取

1 回复

在Android 10及以上系统中,由于Google引入了Scoped Storage(分区存储)机制,应用对外部存储的访问权限受到了更严格的限制。这导致在使用uni-app的plus.io.requestFileSystem接口读取本地文件时可能会遇到权限问题。为了解决这个问题,你可以尝试以下步骤和代码示例来确保在Android 10及以上系统上能够正确读取本地文件。

步骤一:请求存储权限

首先,确保你的应用已经请求并获得了必要的存储权限。在manifest.json中配置必要的权限:

"plus": {
    "distribute": {
        "android": {
            "permissions": [
                "android.permission.READ_EXTERNAL_STORAGE",
                "android.permission.WRITE_EXTERNAL_STORAGE"
            ]
        }
    }
}

步骤二:动态请求权限(必要时)

在Android 6.0及以上版本中,还需要动态请求权限。你可以在App.vueonLaunch方法中检查并请求权限:

#ifdef APP-PLUS
plus.android.requestPermissions(['android.permission.READ_EXTERNAL_STORAGE', 'android.permission.WRITE_EXTERNAL_STORAGE'], function(event) {
    if (event.deniedAlways.length > 0 || event.denied.length > 0) {
        console.error('存储权限被拒绝');
    } else {
        console.log('存储权限已授予');
    }
});
#endif

步骤三:使用MediaStore API(针对Android 10及以上)

对于Android 10及以上版本,建议使用MediaStore API来访问外部存储,以避免直接路径访问被限制的问题。然而,plus.io.requestFileSystem是基于文件路径的API,可能无法直接适配MediaStore。作为替代方案,你可以考虑使用原生模块或插件来实现这一功能。

示例:使用原生模块读取文件

如果你需要深入定制,可以考虑编写原生模块来封装MediaStore的访问逻辑。以下是一个简化的原生模块示例(Java),用于读取文件内容:

// Java代码示例,封装在原生模块中
public String readFileFromMediaStore(Context context, Uri uri) {
    try (InputStream inputStream = context.getContentResolver().openInputStream(uri);
         BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line).append("\n");
        }
        return stringBuilder.toString();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

注意:由于plus.io.requestFileSystemMediaStore的兼容性问题,直接使用plus.io API可能无法解决问题。建议考虑使用原生模块或寻找已适配的第三方插件来实现功能。上述代码仅为示例,具体实现需根据实际需求调整。

回到顶部