gpt4 book ai didi

java - 即使在运行时请求许可后,也会出现误报 lint 许可错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:01:15 25 4
gpt4 key购买 nike

我很难理解 android 使用的运行时权限方法。对于那些正在阅读这篇文章的人,我不是在这里问“如何调用运行时权限”。如果它还没有被授予,我能够显示一个权限对话框,甚至在 fragment 中的 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);

说的是

Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with checkPermission) or explicitly handle a potential SecurityException

我知道当您不检查权限时就会出现这种情况。一旦我使用 @SuppressWarnings("MissingPermission")

注释方法,就会出现此错误

我不知道当开发人员不得不在他们的类中多次调用方法时,他们实际上是如何处理此类错误的。要么我必须使用 @SuppressWarnings("MissingPermission") 要么? (我不知道)

假设我请求一个权限,就像我在上面的第一个代码块中所做的那样 > 权限对话框弹出 > 用户授予权限 > 流程转到 onRequestPermissionsResult 然后我再次编写用于访问位置的代码,但这将还向我显示未检查权限的误报错误..

要么我在做一些糟糕的事情,要么我认为我误解了权限模型,或者 lint 存在一些错误(我真的不认为这是问题所在)..

我已经研究过 this stackoverflow questionthis studio bug但我对那里的答案不满意。

所以请告诉我我做错了什么?

最佳答案

首先:你没有做错任何事。您的代码将按预期工作。


我建议只取消警告,因为它显然是错误的。


但是,如果您想满足 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();
}
}

是的,如果之前没有授予权限,这将导致双重检查。是的,生成的代码难读。但警告会消失。

运行时权限系统很糟糕,我们对此无能为力。

关于java - 即使在运行时请求许可后,也会出现误报 lint 许可错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37642254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com