【原创】解决React Native报错:(Android)/storage/emulated/0/Pictures (Permission denied)

blogdaren 2018-07-13 抢沙发 3535人次

问题背景:

使用 React-Native-Camera 组件拍照,结果权限报错:

3333.png

Code Snippets:

//拍摄照片
takePicture() {
    let target = this.props.toMemory ? { 
        target: Camera.constants.CaptureTarget.temp,
        captureQuality: Camera.constants.CaptureQuality["low"],
    } : { 
        target: Camera.constants.CaptureTarget.disk,
        captureQuality: Camera.constants.CaptureQuality["low"]
    };  

    this.camera.capture(target).then(function(data){
        alert("拍照成功!图片保存地址:\n" + data.path)
    }).catch(
        err => console.error(err)
    );
}

AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"                                                                                
    package="com.baiduproject">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:allowBackup="false"
      android:theme="@style/AppTheme">
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:windowSoftInputMode="adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
      </activity>
      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
    </application>
 
</manifest>

问题原因:

1. 用户拒绝对 APP 授予 storage 存储权限。

2. 在 < Android 6.0的设备上,权限只要写在AndroidManifest.xml里APP就会自动获得,此情形下check和request方法将始终返回true;但是在 >= Android 6.0的设备上,权限管理机制发生了较大的变化,除了要显示的在AndroidManifest.xml中声明必需权限以外,系统认为一些 "危险" 的权限还需要弹框供用户再次选择是否授权。

临时解决方案:

把 capture target 属性 由 disk 改为 temp即可 【target: Camera.constants.CaptureTarget.temp】

终极解决方案:

请移步这里有你想要的答案: https://github.com/yonahforst/react-native-permissions

版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。

本文链接:【原创】解决React Native报错:(Android)/storage/emulated/0/Pictures (Permission denied)

发表评论:

您的昵称:
电子邮件:
个人主页: