如何授予在Marshmallow上运行的Android应用程序的权限?

时间:2016-08-30 09:57:03

标签: java android permissions android-6.0-marshmallow

我有一个创建两个文件夹并在这两个文件夹中存储数据的应用程序。当我在Marshmallow下面的版本上运行此应用程序时,一切正常。但是当我在Marshmallow上运行相同的应用程序时,除非我授予权限,否则不会创建该文件夹通过进入应用程序设置手动。 这是我用来检查权限的代码: -

private boolean checkWritePermission(){
        int result = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (result == PackageManager.PERMISSION_GRANTED){
            Log.d("WRITE_PERMISSION","Permission granted");

            return true;

        } else {

            return false;

        }
    }

    private boolean checkReadPermission(){
        int result = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
        if (result == PackageManager.PERMISSION_GRANTED){

            Log.d("READ_PERMISSION","Permission granted");
            return true;

        } else {

            return false;

        }
    }

这是我用来请求权限的代码: -

private void requestReadPermission()
    {
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.READ_EXTERNAL_STORAGE)){

            Toast.makeText(context,"This permission allows you to read downloaded magazine",Toast.LENGTH_LONG).show();

        } else {

            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},PERMISSION_REQUEST_CODE_READ);
        }

    }

    private void requestWritePermission(){

        if (ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.WRITE_EXTERNAL_STORAGE)){

            Toast.makeText(context,"This permission allows you to download the magazine",Toast.LENGTH_LONG).show();

        } else {

            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},PERMISSION_REQUEST_CODE_WRITE);
        }
    }

    private void requestInternetPermission()
    {
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.INTERNET)){

        }else{
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.INTERNET},PERMISSION_REQUEST_CODE_INTERNET);
        }
    }

这是onRequestPermissionsResult的代码: -

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode)
    {
        case PERMISSION_REQUEST_CODE_READ:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {


            }else
            {

            }
            break;
        case PERMISSION_REQUEST_CODE_WRITE:
            if (grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {

            }else
            {

            }
            break;
        case PERMISSION_REQUEST_CODE_INTERNET:
            if (grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {

            }else
            {

            }
            break;




    }
}

我在oncreate中检查权限如下: -

 if (checkReadPermission() && checkWritePermission())
        {
           Log.d("ALL PERMISSIONS","All permissions granted");

        }else
        {
            requestInternetPermission();
            requestReadPermission();
            requestWritePermission();

        }

2 个答案:

答案 0 :(得分:1)

检查权限的代码有几个问题:

if (checkReadPermission() && checkWritePermission()) {
   Log.d("ALL PERMISSIONS","All permissions granted");
} else {
    requestInternetPermission();
    requestReadPermission();
    requestWritePermission();
}
  1. 您应该立即要求所有权限,而不是一个一个
  2. 您首次检查的权限是Manifest.permission.INTERNET。这是一个易受攻击的许可,因此总是被授予,这就是为什么你总是得到许可。
  3. 您只能获得permission-group.STORAGE的一项许可。这是请求:Manifest.permission.READ_EXTERNAL_STORAGEManifest.permission.WRITE_EXTERNAL_STORAGE
  4. 尝试使用此代码:

    if (checkWritePermission()) {
       Log.d("ALL PERMISSIONS","All permissions granted");
    } else {
        requestWritePermission();
    }
    

答案 1 :(得分:0)

Github中有一些方便的权限检查库。

我正在使用PermissionDispatcher。看看吧。

https://github.com/hotchemi/PermissionsDispatcher