在尝试向用户请求权限时如何避免制作意大利面条式代码?

问题描述

您能解释一下我该怎么做吗?我发现这完全是胡说八道。因此,我试图制作一个“欢迎屏幕”,在该屏幕中将要求用户授予一些位置权限。在我删除所有内容并再次启动之前,再次遇到相同的问题-当用户已经授予权限时, FusedLocationProviderClient 中的代码仍然想检查权限是否已被授予(!)。我做错了吗?看一些例子:

String[] mPermissions = {Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION};
FusedLocationProviderClient mClient;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_welcome_screen);
    mClient = LocationServices.getFusedLocationProviderClient(this);

    checkPermissions();
}

private void checkPermissions() {
    if (EasyPermissions.hasPermissions(this,mPermissions)) {
        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    Activity#requestPermissions
            // here to request the missing permissions,and then overriding
            //   public void onRequestPermissionsResult(int requestCode,String[] permissions,//                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for Activity#requestPermissions for more details.
            return;
        }
        mClient.getLastLocation().addOnSuccessListener(this,new OnSuccessListener<Location>() {
                    @Override
                    public void onSuccess(Location location) {
                        //TODO
                    }
                }
        );
    }
}

@Override
public void onPermissionsGranted(int requestCode,@NonNull List<String> perms) {
    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    Activity#requestPermissions
        // here to request the missing permissions,and then overriding
        //   public void onRequestPermissionsResult(int requestCode,//                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for Activity#requestPermissions for more details.
        return;
    }
    mClient.getLastLocation().addOnSuccessListener(this,new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {

                }
            }
    );
}

@Override
public void onPermissionsDenied(int requestCode,@NonNull List<String> perms) {}

如何让它一次运行而无需多个请求权限?

解决方法

我不确定我是否正确理解了这个问题,但是根据我的理解:

如果您不希望在授予权限后检查权限,则可以创建一个布尔值hasPermission,并在调用该方法进行检查之前,添加一个if语句。

if(!hasPermission) checkPermissions();

在checkPermissions方法内部,如果它检测到已授予权限,则只需将hasPermission = true设置即可,因为if条件将不再为true,因此它将不再进行检查。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...