26
2017
09

【Android开发点滴】解决安卓6.0以上版本不能读取外部存储权限的问题

我们都知道当应用程序需要读取手机内部数据例如图片,或者存储数据到手机上例如保存用加密的登陆密码等等,这些操作需要在AndroidManifest.xml中注册以下权限:

<!--读写磁盘的权限-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

确实如此,可是这样并不能解决上面的问题。在Android 6.0及以上的系统中以上方法是行不通的,那么我们又该怎么做才能获取这些权限呢?

首先还是要在AndroidManifest.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 275557625@qq.com * 作用:解决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);
    }

这样就完美地解决了Android 6.0及以上版本不能读取外部存储权限的问题。

上一篇:Da 下一篇:【Android开发点滴】Android Studio常用快捷键