繁体   English   中英

请求许可时Android应用程序崩溃

[英]Android App crash when ask for permission

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

您应该使用所有所需权限的数组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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM