2016-07-31 46 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()

相關問題