Android Marshmallow:在运行时更改权限会导致应用崩溃

ABI*_*ABI 13 android android-permissions android-6.0-marshmallow

Marshmallow重新设计了获取权限.所以在调用需要权限的方法之前处理权限并且它工作正常,但它在以下场景中崩溃:

第1步:打开应用程序并提供所有必要的权限

第2步:单击主页按钮(所以应用程序在后台)

第3步:手动更改"设置"中的权限

第4步:从多任务启动应用程序,现在它因应用程序上下文变得无效而崩溃

观察到应用再次创建,不明白为什么会发生这种情况.任何纠正这个问题的建议都会受到欢迎!

Jim*_*tel 1

这是因为 Marshmallow 添加了额外的功能。您需要在运行时向用户请求。为此,请使用我制作的这个课程。然后在需要的地方使用它

public class AppPermission {

    public static boolean isMarshmallowPlusDevice() {
        return Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1;
    }

    @TargetApi(Build.VERSION_CODES.M)
    public static boolean isPermissionRequestRequired(Activity activity, @NonNull String[] permissions, int requestCode) {
        if (isMarshmallowPlusDevice() && permissions.length > 0) {
            List<String> newPermissionList = new ArrayList<>();
            for (String permission : permissions) {
                if (PackageManager.PERMISSION_GRANTED != activity.checkSelfPermission(permission)) {
                    newPermissionList.add(permission);
                }
            }
            if (newPermissionList.size() > 0) {
                activity.requestPermissions(newPermissionList.toArray(new String[newPermissionList.size()]), requestCode);
                return true;
            }
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将此代码放在需要用户许可的位置。

if (!AppPermission.isPermissionRequestRequired(SignInActivity.this, new String[]{"android.permission.GET_ACCOUNTS"},
        REQUEST_APP_PERMISSION)) {
    // Your code if permission available
}
Run Code Online (Sandbox Code Playgroud)

之后,在您的FragmentActivity输入此代码 -

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case REQUEST_APP_PERMISSION:
            for (int i = 0; i < permissions.length; i++) {
                String permission = permissions[i];
                int grantResult = grantResults[i];
                switch (permission) {
                    case "android.permission.GET_ACCOUNTS":
                        if (PackageManager.PERMISSION_GRANTED == grantResult) {
                            // Your code
                        }
                        break;
                }
            }
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码用于请求权限,GET_ACCOUNTS您可以将其更改为任何需要的内容。

  • 我面临的不是代码级问题,只是想确保当我手动更改“设置”中的权限时重新创建应用程序(在启动在后台运行的应用程序时,它会崩溃) (4认同)