Android6.0没有权限读取外部存储的问题

来源:互联网 发布:手机怎么连接电脑网络 编辑:程序博客网 时间:2024/05/22 11:51

Android6.0以上的手机都没有权限直接读取外部存储,即使在AndroidManifest.xml加上

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

也没有任何效果,最后查询国外论坛发现6.0以后很多权限都需要主动请求后才能使用,以下为解决方案:

public static boolean isGrantExternalRW(Activity activity) {    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.checkSelfPermission(            Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {        activity.requestPermissions(new String[]{                Manifest.permission.READ_EXTERNAL_STORAGE,                Manifest.permission.WRITE_EXTERNAL_STORAGE        }, 1);        return false;    }    return true;}

在需要使用的地方类似如下调用即可:

view.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if(!isGrantExternalRW(getActivity())){                    return;                }                //授权成功后的逻辑                ...            }        });

上面代码只是判断了是否授权,如果授权了就执行逻辑,如果没有授权则不执行,那么如果需要监听授权是否成功,则需要重写Activity中的onRequestPermissionsResult函数,如下示例:

@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);    if (requestCode == PERMISSIONS_CODE) {        for (int i = 0; i < permissions.length; i++) {            String permission = permissions[i];            int grantResult = grantResults[i];            if (permission.equals(Manifest.permission.READ_EXTERNAL_STORAGE)) {                if (grantResult == PackageManager.PERMISSION_GRANTED) {                    //授权成功后的逻辑                    ...                } else {                    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSIONS_CODE);                }            }        }    }}