【问题标题】:Android App crash when ask for permission请求许可时Android App崩溃
【发布时间】:2020-12-27 20:58:46
【问题描述】:

我的应用需要 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 个权限,应用程序在后台崩溃,但位置的权限窗口仍然打开,当我授予它并重新打开应用程序时,更改为该活动,我只需要授予位置权限,一切正常。为什么我的应用程序崩溃?当我只有位置权限时,它工作正常,插入录音权限后,它会关闭。当我在模拟器上运行它时,它不会崩溃。

【问题讨论】:

  • 显示你的异常堆栈跟踪

标签: java android permissions


【解决方案1】:

你应该 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

【讨论】:

    猜你喜欢
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多