uniapp存储权限如何申请和使用

在uniapp开发中,如何正确申请和使用存储权限?具体需要哪些配置步骤?在Android和iOS平台上是否有差异?遇到权限被拒绝的情况应该如何处理?

2 回复

在uniapp中,存储权限申请需在manifest.json的App权限配置中添加android.permission.WRITE_EXTERNAL_STORAGE。使用时,通过uni.getSystemInfo判断平台,调用uni.authorize申请权限,再使用uni.saveFile或uni.getFileSystemManager进行文件操作。


在 UniApp 中,存储权限主要用于访问设备的外部存储(如 SD 卡),以读写文件。以下是申请和使用存储权限的步骤,包括代码示例。

1. 权限申请

  • Android 平台
    manifest.json 文件中配置权限,并动态申请权限(Android 6.0+ 需要)。
  • iOS 平台
    无需单独申请存储权限,但访问部分目录(如相册)需配置相册权限。

配置权限(manifest.json):

{
  "app-plus": {
    "distribute": {
      "android": {
        "permissions": [
          "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
          "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>"
        ]
      },
      "ios": {}
    }
  }
}

动态申请权限(Android):

使用 UniApp 的 uni.authorizeuni.requestPermission 方法。示例:

// 申请存储权限
uni.authorize({
  scope: 'scope.writePhotosAlbum', // 注意:UniApp 中存储权限通常通过相册权限间接处理
  success: () => {
    console.log('权限申请成功');
  },
  fail: (err) => {
    console.log('权限申请失败:', err);
    // 可引导用户手动开启权限
  }
});

// 或使用 requestPermission(部分版本支持)
uni.requestPermission({
  code: 'android.permission.WRITE_EXTERNAL_STORAGE',
  success: () => {
    console.log('动态权限已获取');
  }
});

2. 使用存储权限

申请权限后,可通过 UniApp 文件 API 读写设备存储:

// 写入文件示例
uni.downloadFile({
  url: 'https://example.com/file.jpg',
  success: (res) => {
    if (res.statusCode === 200) {
      uni.saveFile({
        tempFilePath: res.tempFilePath,
        success: (saveRes) => {
          console.log('文件保存路径:', saveRes.savedFilePath);
        }
      });
    }
  }
});

// 读取文件示例(需确保路径可访问)
uni.getFileInfo({
  filePath: 'file_path_here',
  success: (info) => {
    console.log('文件大小:', info.size);
  }
});

注意事项:

  1. Android 适配

    • 从 Android 10(API 29)开始,作用域存储(Scoped Storage)限制直接访问外部存储,建议使用 uni.saveFile 或媒体库 API。
    • 动态申请时,若用户拒绝,可提示手动在设置中开启。
  2. iOS 限制

    • 只能访问应用沙箱目录和用户授权的相册,使用 uni.chooseImage 等 API 时会自动触发相册权限申请。
  3. 统一处理
    使用 uni.getSetting 检查权限状态,根据结果引导用户操作。

总结:

  • 配置权限后,动态申请(Android)并处理用户拒绝情况。
  • 通过 UniApp 文件 API 安全读写,避免直接操作路径。
  • 测试时需在真机运行,模拟器可能无法完全模拟权限行为。

如需更复杂操作(如自定义文件路径),可结合 uni.getFileSystemManager() 使用,但需注意平台兼容性。

回到顶部