请求许可时,Android App崩溃

时间:2020-09-09 12:11:42

标签: java android permissions

我的应用程序需要2个权限=位置和录制音频。我检查是否被批准,如果没有,我寻求许可。我要求允许的代码看起来像这样=

if (Build.VERSION.SDK_INT >= 23) {

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // ask for permission
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    } else {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, locationListener);
    }

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
        // ask for permission
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 2);
    }
}

我的onRequestPermissionsResult方法看起来像这样=

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

        switch(requestCode) {
            case 1:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, locationListener);

                }
            }

            case 2:
                permissionToRecordAccepted  = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                break;

        }
    }

当我在手机上安装apk并更改为需要这2个权限的活动时,该应用会在后台崩溃,但是当我授予它并重新打开该应用时,位置权限窗口仍处于打开状态,更改为该活动,我只需要授予“位置”权限,一切就可以正常进行。为什么我的应用程序崩溃?当我只有位置许可时,它可以正常工作,在插入音频记录许可后,它将关闭。当我在模拟器上运行它时,它不会崩溃。

1 个答案:

答案 0 :(得分:2)

您应该requestPermissions一次拥有所有必要权限的数组,并且有两个单独的调用-当您的应用已经在后台(因为出现了具有位置权限的对话框)时,将调用第二个调用

最简单的解决方法是在这种情况下将return添加到适当的位置进行检查(没有异常的堆栈跟踪,很难猜测)

if (Build.VERSION.SDK_INT >= 23) {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // ask for permission
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        return; // return in here
    } else {
    ///... rest of code

更好的方法是总结所有必需的权限,然后一次调用requestPErmissions

if (Build.VERSION.SDK_INT >= 23) {
    boolean needLocPerm = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED;
    boolean needAudioPerm = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED;

    String[] permsArray = null;
    if(needAudioPerm && needLocPerm ){
        permsArray = new String[]{Manifest.permission.RECORD_AUDIO,
                                 Manifest.permission.ACCESS_FINE_LOCATION};
    }
    else if(needAudioPerm){
        permsArray = new String[]{Manifest.permission.RECORD_AUDIO};
    }
    else if(needLocPerm ){
        permsArray = new String[]{Manifest.permission.ACCESS_FINE_LOCATION};
    }
    if(permsArray!=null && permsArray.length>0)
        ActivityCompat.requestPermissions(this, permsArray, 123);
    else locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, locationListener);
}

此代码改进之后,您应该重构您的onRequestPermissionsResult方法并检查授予了哪些权限(检查String[] permissionsint[] grantResults数组)

没有异常的堆栈跟踪,这只是猜测,除了上述问题之外,一切看起来都很好,但是有可能您的异常被另一种方法进行的调用激发了,例如onPause

相关问题