我很难理解android使用的运行时权限方法。对于那些正在阅读本文的人,我不是在这里问“如何调用运行时权限”..我能够显示一个权限对话框,如果它尚未被授予,甚至在片段中的onRequestPermissionsResult()中得到它的结果。
使用此代码
if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
FragmentCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, RQ_GET_LOCATION);
Log.e("permission", "asking permission");
return;
}
Log.e("permission", "permission already granted");
accessLocation();
在onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case RQ_GET_LOCATION:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.e("permission", "onRequestPermissionsResult : permission granted, access location here");
accessLocation();
}
else {
Log.e("permission", "onRequestPermissionsResult : permission denied");
}
break;
}
}
accessLocation()
内的代码是
private void accessLocation()
{
Log.e("permission", "accessing location permission");
Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null) {
userDetail.setLat(String.valueOf(mLastLocation.getLatitude()));
userDetail.setLat(String.valueOf(mLastLocation.getLongitude()));
}
else {
if (!isLocationEnabled()) {
mShowAlert();
}
}
}
到目前为止一直很好...... 但令我困扰的是,在accessLocation()
方法中,我在网上遇到误报错误
Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
说
调用需要用户可能拒绝的权限:代码应明确检查权限是否可用(使用
checkPermission
)或明确处理潜在的SecurityException
我知道当你不检查许可时会出现这种情况。只要我使用@SuppressWarnings("MissingPermission")
我不知道开发人员如何在他们的课堂上多次调用方法时实际处理这些错误。
要么我必须使用@SuppressWarnings("MissingPermission")
或? (我不知道)
假设我在上面的第一个代码块中请求了一个权限,就像我正在做的那样>弹出权限对话框>用户授予权限>流程转到onRequestPermissionsResult
并再次编写用于访问位置的代码,但这也会显示我未检查权限的误报错误。
要么我正在做一些可怕的事情,要么我认为我误解了权限模型或者有一些lint的错误(我真的不认为这是问题)..
我已经调查了this stackoverflow question和this studio bug,但我对那里的答案不满意。
请告诉我,我的错误是什么?
答案 0 :(得分:1)
首先:你没有做错任何事。您的代码将按预期工作。
我建议只是压制警告,因为它显然是错误的。
但是,如果要满足Lint要求,则必须将代码重构为以下架构
void doSomething(){
if(permission granted){
//do stuff (directly in here, do not delegate this to other methods)
}else{
//request permission
}
}
void onRequestPermissionsResult(...){
if(permission granted){
doSomething();
}
}
是的,如果之前未授予权限,则会导致重复检查。是的,结果代码不好读。但警告会消失。
运行时权限系统非常糟糕,我们无能为力。