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

来源:互联网 发布:智慧的云计算 pdf 编辑:程序博客网 时间:2024/05/22 17:05

我们都知道当应用程序需要读取手机内部数据例如图片,或者存储数据到手机上例如保存用加密的登陆密码等等,这些操作需要在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及以上版本不能读取外部存储权限的问题。