Android 权限检查不工作

Android permissionCheck not working

AndroidManifest.xml :

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

代码:

button.setOnClickListener {
var permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
  toast("success")
} else {
  toast("fail")}}

为什么会这样 return "fail"?

对于 Android 6.0+targetSdk=23 你必须考虑请求 运行-time 权限。权限 android.permission.ACCESS_FINE_LOCATION 被认为是危险的,因此您必须在 运行 时请求它。有关概述,请参阅 Normal and Dangerous Permissions

您需要做的是在 运行 时间询问它,例如

来自开发者指南

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

Requesting Permissions at Run Time

上阅读更多内容

在这种情况下,您应该像这样请求权限:ActivityCompat.requestPermissions(thisActivity, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE); 你应该在 onRequestPermissionsResult 回调中得到答案。 然后,如果用户授予权限,下次您将使用 checkSelfPermission 方法时,您将获得 success.

有关详细信息,请阅读:https://developer.android.com/training/permissions/requesting.html

您似乎在 api 级别也 >=23 的设备上使用目标 sdk >=23 和 运行 应用程序。因此,由于 api 23 有新的流程来获得权限。权限分为两类,正常和危险。应该在 运行 时间内询问危险权限,如下所示: ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_LOCATION);

这将为用户显示系统对话框:

所以用户选择的结果将返回给public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)

使用您传入的请求代码 ActivityCompat.requestPermissions,在我的例子中是 MY_PERMISSIONS_REQUEST_LOCATION

权限的名称将在 String permissions[] 中,用户的选择将相应地在 int[] grantResults 中,可以是 PackageManager.PERMISSION_GRANTED 或 PERMISSION_DENIED.

此外,最好在询问之前向用户解释为什么需要该权限。

在此处查看更多信息:Requesting Permissions at Run Time

您可以检查权限 after/in Android 6.0

public class MainActivity extends AppCompatActivity {

    private final int PERMISSIONS_CODE = 1001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       Button button = (Button) findViewById(R.id.button1);
       button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {

                ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION,}, PERMISSIONS_CODE);

            } else {

                // You can do you operation directly. If you added permissions in AndroidManifest...
                // Or visit following link to read about permission check.
                // 

            }
        }
    });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case PERMISSIONS_CODE:
            if (grantResults.length > 0 && grantResults[grantResults.length-1] == PackageManager.PERMISSION_GRANTED) {
                Log.d("permission", "accepted");
            } else {
                Log.d("permission", "denied");
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            break;
    }
}

}

编码愉快...

对于 Android 6.0 和你的 targetSdkVersion >=23 ,你应该在 运行 时请求许可,我有两个建议: 1、你可以在模型gradle文件中更改你的targetSdkVersion,例如:

targetSdkVersion=22

但是,我不推荐使用这种方法。 2、这个return 'fail'表示你没有这个权限,你应该 考虑如果你有请求但用户拒绝,在这你可以显示一个对话框告诉使用,为什么你需要这个权限,然后请求你想要的权限,你可以使用下面的代码:

   private boolean check(){
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED){
            //you have this permession
            return true;
        }else{
            //don't hava permession ,you shoud check if you can request
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
                //the use refuse you request this permission ,the system well't show request dialog,you shoul show a dialog tu explain why you need this permission
                //and guide he go to system setting open this permission.
            }else {
                // you can request permission direct
                //requestCode is a integer code,that you can use is in onRequestPermissionsResult
                ActivityCompat.requestPermissions(this, Manifest.permission.ACCESS_FINE_LOCATION, requestCode);

            }

        }
        return false;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //in this you can listen the request result
        if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
            //user Agree permission
        }else{
            //user reject permission
        }
    }

对不起,我只知道java,所以,这段代码是jave。希望这可以帮助你解决这个问题。

请求权限对我来说太混乱了,EasyPermissions 解决了我所有的问题

清单:

compile 'pub.devrel:easypermissions:0.4.2'

代码:

button.setOnClickListener {
    if (EasyPermissions.hasPermissions(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
        toast("yes !")
    } else {
        EasyPermissions.requestPermissions(this, getString(R.string.location_perm), 1, Manifest.permission.ACCESS_FINE_LOCATION )
    }}

第一次尝试就完美了

    public static int CAMERA_PERMISSSION_CODE = 1;
        public static int STORAGE_PERMISSSION_CODE = 2;
        public static int FINE_LOCATION_PERMISSSION_CODE = 3;
        public static int COARSE_LOCATION_PERMISSSION_CODE = 3;
        public static int READ_PHONESTATE_PERMISSSION_CODE = 4;




 private void askForunTimePermissions() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {


            if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {


                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSSION_CODE);

            } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {


                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_PERMISSSION_CODE);
            } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {

                requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, FINE_LOCATION_PERMISSSION_CODE);
            } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.ACCESS_COARSE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, COARSE_LOCATION_PERMISSSION_CODE);
            } else if (ContextCompat.checkSelfPermission(PermissionsActivity.this,
                    Manifest.permission.READ_PHONE_STATE)
                    != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, READ_PHONESTATE_PERMISSSION_CODE);
            } else {



            }


        }


    }


   @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        try {
            if (requestCode == CAMERA_PERMISSSION_CODE) {

                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }


            } else if (requestCode == STORAGE_PERMISSSION_CODE) {

                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }


            } else if (requestCode == FINE_LOCATION_PERMISSSION_CODE) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }

            } else if (requestCode == COARSE_LOCATION_PERMISSSION_CODE) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }

            } else if (requestCode == READ_PHONESTATE_PERMISSSION_CODE) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    askForunTimePermissions();
                } else {
                    askForunTimePermissions();
                }

            }

        } catch (Exception e) {
            Toast.makeText(PermissionsActivity.this, "No permission requests matched", Toast.LENGTH_SHORT).show();
        }
    }


//call this method where u want
  askForunTimePermissions();