Android 6+权限概念和位置策略

时间:2016-09-26 18:08:50

标签: android permissions android-6.0-marshmallow locationmanager

Google如何认为这个具有Android 6+权限的奇怪概念适用于用户必须接受位置策略权限的情况。我的意思是:新的权限概念应该向用户显示一个授予权限弹出窗口,在那一刻他想要在应用程序中使用特殊功能。这应该如何与locationManager.requestLocationUpdates(...)一起使用? manual

  

您可能希望尽快开始侦听位置更新   应用程序启动,或仅在用户激活某个功能后启动。

因此,如果我在应用启动时显示权限弹出窗口,则此权限概念将毫无意义,因为用户必须在不知道原因的情况下接受权限。当我按下位置​​按钮时执行locationManager.requestLocationUpdates(...),那么就我所知,位置管理器的速度不够快,无法获得正确的位置(这很难测试,所以我不确定)。 使用位置管理器时,Android 6+权限的正确实现概念是什么?

2 个答案:

答案 0 :(得分:1)

最好在启动时向用户请求获取位置的权限。由于您只需要在每次安装时只询问一次权限,因此不应该太烦人。如果用户允许您的许可,您不必担心其他任何事情,用户可以继续使用您的应用。但如果他否认它,最好向他展示一个弹出对话框,解释为什么你的应用需要此权限才能继续。如果他仍然拒绝,您可以选择强制他离开应用程序或限制您之前要求获得许可的功能。

请参阅此official doc

答案 1 :(得分:0)

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

  • 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,我会使用onRequestPermissionsResult中的三种方法来自Fragment的{​​1}}您需要使用FragmentCompat而您必须使用包含抽象方法FragmentCompat.OnRequestPermissionsResultCallback的{​​{1}}实现onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults),请查看以下链接:{{ 3}})了解更多细节。