React Native saveToCameraRoll 在 Android 上因“权限被拒绝”错误而失败
Posted
技术标签:
【中文标题】React Native saveToCameraRoll 在 Android 上因“权限被拒绝”错误而失败【英文标题】:React Native saveToCameraRoll failed with `Permission denied` error on Android 【发布时间】:2017-03-14 22:05:08 【问题描述】:说明
saveToCameraRoll 在 android 上因 Permission denied
错误而失败
复制
将 AWS S3 照片保存到设备相机胶卷突然失败
RNFS.downloadFile(DownloadFileOptions)
.promise
.then(() =>
CameraRoll.saveToCameraRoll(path, this.state.type) // path = /data/user/0/com.XXX.app/filesimage-xyz.jpg"
.then((data) =>
RNFS.unlink(path)
.then(() =>
console.log('Download and file unlink succeeded');
)
.catch((err) =>
console.error("RNFS unlink error: ", err.message);
);
)
.catch((error) =>
console.error("Save to Cameral roll error: ",error.message);
//error = code:"EUNSPECIFIED"
// framesToPop:1
// message:"Permission denied"
// stack:"Error: Permission denied↵
);
)
.catch((error) =>
console.error("RNFS.downloadFile! error: ", error.message);
);
在 android/app/src/main/AndroidManifest.xml 我有
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在其他几个权限中。
什么会导致权限被拒绝错误?在 Manifest 级别应该做什么以保存到 cameraRoll ?
附加信息
React Native 版本:[填写此内容:该错误是否在最新的 RN 版本中重现?] 检查 V41 平台:[填写此内容:ios、Android 还是两者?] 仅限 Android 操作系统:[填写此内容:MacOS、Linux 还是 Windows?] 开发 MacOS Sierra 开发工具:[填写:Xcode 或 Android Studio 版本,iOS 或 Android SDK 版本,如果适用] RN CLI + Android SDK【问题讨论】:
【参考方案1】:从 Android 6.0(API 级别 23)开始,用户在应用运行时授予应用权限,而不是在安装应用时。您可以使用PermissionAndroid API 让用户授予外部存储访问权限。
例子:
requestExternalStoragePermission = async () =>
try
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
title: 'My App Storage Permission',
message: 'My App needs access to your storage ' +
'so you can save your photos',
,
);
return granted;
catch (err)
console.error('Failed to request permission ', err);
return null;
;
【讨论】:
它有效,应该被标记为接受的答案,我相信!此外,我们可能需要执行Platform.OS
检查以及仅在Android 上需要权限请求。【参考方案2】:
你可以试试:
...
let permission = await Expo.Permissions.askAsync(Expo.Permissions.CAMERA_ROLL);
if (permission.status === 'granted')
await CameraRoll.saveToCameraRoll(fileUrl, "photo");
【讨论】:
以上是关于React Native saveToCameraRoll 在 Android 上因“权限被拒绝”错误而失败的主要内容,如果未能解决你的问题,请参考以下文章
react native 增加react-native-camera
更新 react-native-maps 以使用 create-react-native-app
react native 增加react-native-storage
React-Native 和 Expo:create-react-native-app 和 react-native init 之间的区别
什么是 react-native-cli 和 @react-native-community/cli?
React Native - 当 react-native 版本 > 0.55 时,无法通过 react-native-cli 创建新项目