[안드로이드 개발 포인트] 안드로이드 6.0 이상 버전에서 외부 저장 권한을 읽을 수 없는 문제 해결

우리는 응용 프로그램이 휴대전화 내부 데이터, 예를 들어 그림을 읽거나 휴대전화에 데이터를 저장해야 한다는 것을 알고 있다. 예를 들어 암호화된 로그인 비밀번호를 저장하는 등이다. 이런 조작은 안드로이드 매니페스트에 있어야 한다.다음 권한이 xml에 등록되어 있습니다.

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

확실히 그렇지만 이렇게 해서는 위의 문제를 해결할 수 없다.안드로이드 6.0 이상의 시스템에서는 이러한 방법이 통하지 않습니다. 그러면 우리는 어떻게 해야만 이런 권한을 얻을 수 있습니까?
우선 안드로이드 매니페스트에서xml은 위의 두 가지 권한을 등록하고 PermissionUtils라는 클래스를 정의합니다.
package com.kaipingzhou.signer.utils;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;

/**
 * Created by     on 2017/4/2 22:43.
 * qq [email protected]
 *   :  Android 6.0         
 */

public class PermissionUtils {

    private static String[] PERMISSIONS_CAMERA_AND_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.CAMERA};

    /**
     *     6.0                 
     *
     * @param activity
     * @param requestCode
     * @return
     */
    public static boolean isGrantExternalRW(Activity activity, int requestCode) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            int storagePermission = activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            int cameraPermission = activity.checkSelfPermission(Manifest.permission.CAMERA);

            if (storagePermission != PackageManager.PERMISSION_GRANTED ||
                    cameraPermission != PackageManager.PERMISSION_GRANTED) {
                activity.requestPermissions(PERMISSIONS_CAMERA_AND_STORAGE, requestCode);
                return false;
            }
        }
        return true;
    }
}

다음은 가장 중요한 단계입니다. 위의 코드를 호출합니다. 다음은 제가 예를 하나 드리겠습니다. 다른 것은 모두 유사합니다.
if (PermissionUtils.isGrantExternalRW(LoginActivity.this, 1)) {
                        //  
                        Login(loginId, loginPsd);
}

참고: 이 방법으로는 충분하지 않습니다. onRequestPermissionsResult() 메서드를 다시 작성해야 합니다.
@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Login(loginId, loginPsd);
                } else {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            ToastUtil.showToast(getApplicationContext(), "         ~");
                        }
                    });
                }
                break;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

이렇게 하면 안드로이드 6.0과 그 이상의 버전에서 외부 저장 권한을 읽을 수 없는 문제를 완벽하게 해결할 수 있다.

좋은 웹페이지 즐겨찾기