在运行时请求权限,Android M +

Har*_*ris 5 permissions android runtime-permissions

首先,我知道这是一个重复的问题,但我已经解决了其他类似问题的答案,并且无法找到任何这些解决方案的成功.

我开发了一个应用程序,它完全适用于我的测试设备,这是一个运行Android L(5.0.1)的三星S4,但我希望这个应用程序也适用于较新版本的Android.

我知道Android M +的请求权限已经更改,因此必须在运行时询问它们,但是当我尝试实现此权限时,对话框永远不会出现,因此永远不会要求所需的权限.

我要求的许可是ACCESS_FINE_LOCATION.

以下是我的清单文件中的相关代码:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)

如果尚未批准我要求许可的地方:

if (ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

    startGeofenceMonitoring();

} else {
    askForPermission(android.Manifest.permission.ACCESS_FINE_LOCATION,LOCATION);
}
Run Code Online (Sandbox Code Playgroud)

askForPermission函数(稍微修改了Google的示例):

private void askForPermission(String permission, Integer requestCode) {
    if (ContextCompat.checkSelfPermission(MapsActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(MapsActivity.this, permission)) {

            //This is called if user has denied the permission before
            //In this case I am just asking the permission again
            ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);

        } else {

            Log.d(TAG, "askForPermission: " + permission);

            ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
        }
    } else {
        Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
    }
}
Run Code Online (Sandbox Code Playgroud)

和onRequestPermissionsResult函数:

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

    Log.d(TAG, "onRequestPermissionsResult: " + requestCode);

        switch (requestCode) {
            case 1:
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    Log.d(TAG, "onRequestPermissionsResult: request");

                    Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();

                    startGeofenceMonitoring();
                }
                break;
        }
}
Run Code Online (Sandbox Code Playgroud)

正如我所说,请求权限的对话框永远不会出现,但是我的控制台告诉我这ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);是被调用的,经过大量的研究后我仍然不确定为什么它不起作用.我认为唯一可能的原因是此活动是显示Google地图地图的片段活动.我确实尝试在另一个活动中请求权限,但完全相同的事情发生.

谢谢.

编辑

所以我刚刚在一个完全新鲜的项目中测试了我发布的代码,它运行得很好并显示了对话框.我现在真的很困惑是什么阻止了这个对话框在我当前的项目中显示.

小智 3

final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
Run Code Online (Sandbox Code Playgroud)
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
Run Code Online (Sandbox Code Playgroud)
private void requestPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
        ActivityCompat
                .requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_ASK_PERMISSIONS);
    }
}
Run Code Online (Sandbox Code Playgroud)
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ASK_PERMISSIONS:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission Granted
                Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT)
                        .show();
            } else {
                // Permission Denied
                Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT)
                        .show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}
Run Code Online (Sandbox Code Playgroud)