2016-07-31 95 views
0

我想在每次活动进入屏幕时请求用户的位置(我认为我的唯一选项是活动的onResume()方法)并且我想(也应该)支持android 6的新运行时权限模型。如何在运行时使用permissionDispatcher库在Android 6及以上版本中请求`onResume()`权限

我使用的是permissionDispatcher库,它的工作原理非常完美。问题是this issue suggests,如果我调用一个请求onResume()方法中的权限并且用户拒绝该权限的函数,它将陷入一个无限循环。

但我的问题是,因为我想获得用户的位置在活动的每一个外观,我想不出除了使用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(); 
    } 

我能为我的情况怎么办?

回答

2

直到除非权限是必需的,否则我们必须在没有权限的情况下关闭活动,我不建议在onResume()中请求权限。

如果您拒绝某个权限而不再询问标志设置为true,那么您必须多次调用onResume()多次,才能请求权限。

我明白,如果你考虑所有可能的情况下,你可能想把它放在onResume(),但认为它可能会惹恼用户在一些使用情况。

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

相关问题