簡體   English   中英

Android:設備不接受WRITE_EXTERNAL_STORAGE權限

[英]Android: WRITE_EXTERNAL_STORAGE permission not accepted by device

我正在編寫的Android應用程序存在一個非常奇怪的問題。

在我的應用程序中,我意圖告訴手機的相機應用程序為我拍照。 拍攝完這張照片后,我想在設備的MediaStore內容提供商中注冊新拍攝的照片,以使其顯示在常規的“圖庫”應用中。

為此,我知道我需要WRITE_EXTERNAL_STORAGE權限,但是即使它在清單中,我也會收到一個權限被拒絕的異常。 我必須怎么做才能獲得此許可? 我正在運行Android 6.0.1。

這是清單中我的權限XML:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

這是導致異常的代碼:

       // insert photo into phone's main photo content provider
        ContentResolver cr = getActivity().getContentResolver();

        try {
            MediaStore.Images.Media.insertImage(cr, photoFile.getPath(),
                    "Image Capture", "Custom Image capture");
        } catch (FileNotFoundException foe) {
            Log.e(DEBUG, foe.getMessage());
        }

這是我得到的例外:

java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=2436, uid=10041 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()

編輯 :我可能應該提到:

現在,我的應用程序使用getExternalFilesDir(Environment.DIRECTORY_PICTURES) ,它返回路徑/sdcard/Android/data/<package>/files/Pictures來保存照片。 我希望他們去相機應用程序通常放在/sdcard/DCIM/Camera

您還應該將android:maxSdkVersion="18"到WRITE_EXTERNAL_STORAGE中。 您的代碼應如下所示:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />

關於您請求許可但未被用戶授予許可的問題。 看看我的答案@ https://stackoverflow.com/a/35574084/529691

看看是否有幫助。

您應該提示用戶向您提供權限:

    int externalPermissionCheck = ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (externalPermissionCheck==-1){
        askPermissionStorage();
    }


private void askPermissionStorage() {
    //for media
    if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.
            WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

        //insert explanation
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            //if you want to explaian to the user

        } else {//if no explanation needed
            ActivityCompat.requestPermissions(this, new
                            String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
        }
    }
}

上面是用於保存圖片\\視頻,這是用於攝像機權限的:

    int cameraPermissionCheck = ContextCompat.checkSelfPermission(this,
            Manifest.permission.CAMERA);
    if (cameraPermissionCheck == -1) {
        askPermissionCamera();
    }
private void askPermissionCamera() {
    //for camera
    if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.
            CAMERA) != PackageManager.PERMISSION_GRANTED) {
        //insert explanation
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.CAMERA)) {
            //if you want to explaian to the user

        } else {//if no explanation needed
            ActivityCompat.requestPermissions(this, new
                            String[]{Manifest.permission.CAMERA},
                    MY_PERMISSIONS_REQUEST_CAMERA);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM