Android 6+ Permission concept and Location Strategies



Google如何看待Android 6+的权限这个奇怪的概念,用户必须接受位置策略的权限。我的意思是详细:新的权限概念应该显示一个授权权限弹出给用户,在那一刻,他想使用一个特殊的功能在应用程序中。这应该如何与locationManager.requestLocationUpdates(...)工作?手册上写着

你可能想要开始监听位置更新,只要你的应用程序启动,或只有在用户激活某个功能后。

如果我在应用启动时显示权限弹出框,这个权限概念就没有任何意义了,因为用户必须在不知道为什么的情况下接受一个权限。当我执行locationManager.requestLocationUpdates(...)只是当他点击位置按钮,然后位置管理器是不够快,以获得适当的位置,据我所知(这是很难测试,所以我不确定)。使用位置管理器时,Android 6+权限的正确实现概念是什么?

最好在启动时征求用户的位置许可。由于每次安装只需要请求一次许可,所以应该不会太烦人。如果用户允许你的权限,你就不需要担心其他事情,用户可以继续使用你的应用。但如果他拒绝,你最好向他展示一个弹出对话框,解释为什么你的应用需要这个权限才能继续。如果他仍然拒绝,你可以选择强迫他离开应用程序,或者限制你之前请求许可的功能。

查看官方文档

在启动时请求权限可以帮助您禁用与特定权限相关的任何功能。如果您愿意,您可以在真正需要的时候请求许可,并检查用户的响应。有三个基本方法:

  • checkSelfPermission(判断是否被授予特定权限)
  • shouldShowRequestPermissionRationale(获取是否应该显示带有请求权限理由的UI。只有当您没有权限,并且请求权限的上下文没有清楚地向用户传达授予该权限的好处时,您才应该这样做。
  • requestPermissions(请求授予此应用程序的权限。这些权限必须在您的清单中请求。

结合这三个方法,你可以创建一个工作流来处理动态请求权限,例如:

public boolean checkPermission(int requestCode, int permissionExplanation, OnRequestPermissionCallback listener, String... permissions) {
        boolean permissionGranted = true;
        for (String permission: permissions) {
            if(ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
                permissionGranted = false;
                break;
            }
        }
        if (!permissionGranted) {
            // Should we show an explanation?
            boolean shouldShowRequestPermissionRationale = true;
            for (String permission: permissions) {
                if(!ActivityCompat.shouldShowRequestPermissionRationale(this, permission)){
                    shouldShowRequestPermissionRationale = false;
                    break;
                }
            }
            if (shouldShowRequestPermissionRationale) {
                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
                ActivityUtils.showAlertInfoMessage(this, getString(permissionExplanation), getString(R.string.dialog_information), v -> {
                    ActivityCompat.requestPermissions(this, permissions, requestCode);
                }, false);
            } else {
                // No explanation needed, we can request the permission.
                ActivityCompat.requestPermissions(this, permissions, requestCode);
            }
            return false;
        }
        return true;
    }

你应该检查在onRequestPermissionsResult回调方法中授予的用户权限(注意:这个方法在活动中调用,因为我使用ActivityCompat的三个方法,如果你想从Fragment处理onRequestPermissionsResult,你需要使用FragmentCompat代替,你的片段必须实现包含抽象方法onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)FragmentCompat.OnRequestPermissionsResultCallback,查看此链接:https://developer.android.com/reference/android/support/v13/app/FragmentCompat.html)了解更多详细信息。

最新更新