权限对话框自动退出android

时间:2016-12-13 14:21:22

标签: android android-6.0-marshmallow android-permissions

我正在开发Marshmallow权限支持,我已经在我的应用中实现了它。但是在请求权限时我发现了一种奇怪的行为。

问题

当我第一次启动我的应用程序时,一切顺利,在主页上,向用户显示一个请求ACCESS_FINE_LOCATION的权限对话框。用户拒绝权限,拒绝我显示另一个对话框,解释为什么需要权限,并重新考虑拒绝权限的选项(我是当然和重试选项)。用户按下我确定选项,然后通过反压退出应用程序。现在,如果再次启动应用程序,同一活动将再次尝试请求权限,因为用户未标记“从不再询问”。但这一次,对话框会在用户做出选择之前自动消失。

要求许可的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(mPermissionsRequired[0]) == PackageManager.PERMISSION_DENIED) {
    PermissionUtils.requestPermissions(this, mPermissionsRequired, KeyConstant.PERMISSION_LOCATION_REQUEST_CODE);
} else {
    ((BBApplication) getApplicationContext()).startLocationUpdates();
}

回调:

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

    Log.v ("gaurav", "Requestcode: " + requestCode + " Permission code: " + KeyConstant.PERMISSION_LOCATION_REQUEST_CODE + " Permission length: " + permissions.length);
    if (requestCode == KeyConstant.PERMISSION_LOCATION_REQUEST_CODE) {
        for (int i = 0; i < permissions.length; i++) {
            String permission = permissions[i];
            if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                boolean showRationale = shouldShowRequestPermissionRationale(permission);
                if (!showRationale) {
                    // user denied flagging NEVER ASK AGAIN
                    // you can either enable some fall back,
                    // disable features of your app
                    // or open another dialog explaining
                    // again the permission and directing to
                    // the app setting

                } else {
                    PermissionUtils.showPermissionDescriptionDialog(this, KeyConstant.PERMISSION_LOCATION_REQUEST_CODE, this);
                }
                // user denied WITHOUT never ask again
                // this is a good place to explain the user
                // why you need the permission and ask if he want
                // to accept it (the rationale)

            } else if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                switch (i) {
                    case 0:
                        ((BBApplication) getApplicationContext()).startLocationUpdates();
                        break;
                }
            }
        }
    }
}

每次都会触发此回调,但是如果对话框自动消失,我会在回调中观察权限数组为零长度。我相信这是由于这个问题中解释的原因:Duplicate permission request after orientation change

但令我困惑的是,当活动被销毁并再次创建时,为什么会出现这种情况。另外,在对话框消失后的logcat中,我看到以下日志:

12-13 19:31:10.854 779-945/? W/ActivityManager: startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { cmp=in.til.popkorn.debug/in.til.popkorn.ui.activities.HomePageActivity (has extras) }

我不确定此日志是否与问题相关。我很感激对此有所帮助。如果需要更多代码,请告诉我。

更新:

Permission Utils代码:

public static void requestPermissions(Activity activity, String[] permissions, int requestCode) {

    // Request permissions.
    ActivityCompat.requestPermissions(activity, permissions, requestCode);
}

1 个答案:

答案 0 :(得分:0)

在我的脑海深处,我知道我的代码存在一些问题,当问题在样本应用程序上无法重现时就会得到确认。有2个呼叫用于启动活动,因此较新的呼叫总是强制执行先前的权限回调。检查第二个电话解决了我的问题。