java - 如何在android 6及以上版本中使用permissionDispatcher库在运行时请求 `onResume()`中的权限

标签 java android android-permissions permission-denied

我想在每次 Activity 进入屏幕时请求用户的位置(我认为这里唯一的选择是 Activity 的 onResume() 方法)并且我想(并且应该)支持 Android 6 的新功能运行时权限模型。

我正在使用permissionDispatcher图书馆,它工作得很好。问题是this issue suggests ,如果我在 onResume() 方法中调用一个请求权限的函数,而用户拒绝该权限,它将陷入无限循环。

但我的问题是,由于我想在 Activity 的每次出现时获取用户的位置,除了使用 onResume() 方法(因此,获取如果用户拒绝权限,就会陷入无限循环)。

这是我的代码示例:

    @NeedsPermission(Manifest.permission.ACCESS_FINE_LOCATION)
    void startLocationUpdate() {
        mLocationLoadingDialog.show();
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
    }

    @OnShowRationale(Manifest.permission.ACCESS_FINE_LOCATION)
    void showRationalForFineLocation(final PermissionRequest request) {
        new AlertDialog.Builder(this)
                .setMessage("this app needs your permission to get your location")
                .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        request.proceed();
                    }
                })
                .setNegativeButton("no way", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        request.cancel();
                        exitApp();
                    }
                })
                .setCancelable(false)
                .show();
    }

    @OnPermissionDenied(Manifest.permission.ACCESS_FINE_LOCATION)
    void showDeniedForFINELOCATION() {
        exitApp();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        RequestSelectorActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);

    }

    private void exitApp() {
        new AlertDialog.Builder(this)
                .setCancelable(false)
                .setMessage("you didn't allow us to know where you are, so the application will exit")
                .setPositiveButton("ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        moveTaskToBack(true);
                        android.os.Process.killProcess(android.os.Process.myPid());
                        System.exit(1);
                    }
                }).show();
    }

针对我的情况我能做什么?

最佳答案

除非权限非常必要,以至于我们必须在没有权限的情况下关闭 Activity,否则我不建议在 onResume() 中请求权限。

如果您在没有设置“不再询问”标志的情况下拒绝权限,则调用 onResume() 的次数与您必须请求权限的次数相同。

我确实理解,如果您考虑所有可能的情况,您可能希望将其放入 onResume() 中,但认为在某些用例中它也可能会惹恼用户。

我建议你把请求部分放在onStart()而不是onResume()

关于java - 如何在android 6及以上版本中使用permissionDispatcher库在运行时请求 `onResume()`中的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38683430/

相关文章:

java - 从 Tomcat 控制负载均衡器的路由

android webview 不加载移动版

android - 谷歌播放服务更新

android - 在软连字符处换行

Android USB 设备权限和 Intent 过滤器

java - 向其他 Activity 发送数据后,Intent 对象显示 null

java - 从 netty ByteBuf 获取字符串

java - lucene 一元词和二元词的频率

android - 执行需要粗略位置许可的网络扫描

java - Android 位置的多个运行时权限