【问题标题】:Android 6.0 closing app after requesting permissions causes permissions to be asked for 3 times eachAndroid 6.0 请求权限后关闭应用程序导致权限被请求 3 次
【发布时间】:2016-02-25 02:00:33
【问题描述】:

我在尝试更新我的应用程序以使用 Android 6.0 权限时遇到了一个奇怪的错误(我认为)。我的代码如下:

public void requestPerms2() 
    boolean gratedPermissions = false;
    PackageManager pm = this.getPackageManager();

    int hasPerm1 = PackageManager.PERMISSION_GRANTED; //Assume granted on low level
    if(android.os.Build.VERSION.SDK_INT > 15) {
        hasPerm1 = pm.checkPermission(
                Manifest.permission.READ_EXTERNAL_STORAGE,
                this.getPackageName());
    }
    int hasPerm2 = pm.checkPermission(
            Manifest.permission.RECORD_AUDIO,
            this.getPackageName());

    if(hasPerm1 != PackageManager.PERMISSION_GRANTED){
        String [] neededPerms = {some.path.here.Manifest.permission.READ_EXTERNAL_STORAGE};
        ActivityCompat.requestPermissions(this, neededPerms , 1);
        gratedPermissions = true;
    }

    if(hasPerm2 != PackageManager.PERMISSION_GRANTED){
        String [] neededPerms = {some.path.here.Manifest.permission.RECORD_AUDIO};
        ActivityCompat.requestPermissions(this, neededPerms , 1);
        grantedPermissions = true;
    }
    if(grantedPermissions)
        System.exit(0);
}

这是在从 onCreate 调用的方法中,并且肯定只被调用一次(我取出了一些调试语句)。但是,它会每次提示用户 3 次权限。我尝试过改变请求的权限,并且每次总是询问 3 次。如果我注释掉 System.exit(0),它会完美运行,并且每次权限都会询问用户一次。

理想情况下,我希望在获得权限并强制重新启动后关闭应用程序,因为权限在应用程序重新启动后才会生效。有什么方法可以做到这一点而不要求用户每次允许权限 3 次?

【问题讨论】:

  • 您没有使用ContextCompat.checkSelfPermission() 有什么原因吗?那里不需要版本检查。
  • 如果您需要这两个权限,是否有特殊原因不将您的requestPermissions() 整理在一起?它故意需要一系列权限
  • 我已经尝试了这两种方法并得到了相同的结果(它会在使用整理的 requestPermissions 时同时请求这两个权限 3 次)。在这种情况下,我不想使用数组,这样如果用户只拒绝了一个权限,他们只会被要求提供那个权限(也许 requestPermissions() 会自动处理这个?)

标签: android permissions android-6.0-marshmallow


【解决方案1】:

我只是将其作为评论,但我还不够有名气:( 如果您请求的权限需要重启,Android 将自动重启您的应用并调用 onCreate。然后你可以使用回调:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){
    if(requestCode == 101)
    {
        if( (grantResults[0] == PackageManager.PERMISSION_DENIED) || (grantResults[1] == PackageManager.PERMISSION_DENIED) ) {
            Toast.makeText(getApplicationContext(),"Unable to get permissions for ...",Toast.LENGTH_LONG).show();
        }
    }
}

然后检查是否已授予适当的权限。 这将消除完全退出应用程序的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多