我的应用程序需要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个权限的活动时,该应用会在后台崩溃,但是当我授予它并重新打开该应用时,位置权限窗口仍处于打开状态,更改为该活动,我只需要授予“位置”权限,一切就可以正常进行。为什么我的应用程序崩溃?当我只有位置许可时,它可以正常工作,在插入音频记录许可后,它将关闭。当我在模拟器上运行它时,它不会崩溃。
答案 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[] permissions
和int[] grantResults
数组)
没有异常的堆栈跟踪,这只是猜测,除了上述问题之外,一切看起来都很好,但是有可能您的异常被另一种方法进行的调用激发了,例如onPause