2017-05-03 83 views
0

我試圖從https://developers.google.com/android/guides/permissionsAndroid的請求允許回調

幾個疑問句的實現Android權限: 1)回調onRequestPermissionResult - 哪裏都是從參數的String []的權限和int [] grantResults? 2)我一直得到null值爲grantResults和String []權限 3)我已經設置了const REQUEST_LOCATION的值爲0 - 這個const的值是什麼?

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 
    // Check Permissions Now 
    ActivityCompat.requestPermissions(this, 
     new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
     REQUEST_LOCATION); 
} else { 
    // permission has been granted, continue as usual 
    Location myLocation = 
LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
} 

一個無關的疑問句......當得到一個谷歌地圖API密鑰設置SHA-1值,它需要或者是可選的,只是限制到Android的關鍵。

謝謝。

public void onRequestPermissionsResult(int requestCode, 
             String[] permissions, 
             int[] grantResults) 
+0

「裏是參數String []權限和int [] grantResults從?「 - 'String []'應該包含你傳遞給'requestPermissions()'的字符串。 int []包含這些權限的相應狀態(例如,授予)。就個人而言,我從不使用這些。 「這個const的價值是什麼?」 - 它需要在來自該活動或其片段的所有'requestPermisions()'和'startActivityForResult()'調用中有區別。 – CommonsWare

回答

2

公共類RequestUserPermission {

private Activity activity; 


// Storage Permissions 
private static final int REQUEST_PERMISSION = 1; 
private static String[] PERMISSIONS = { 
     Manifest.permission.READ_EXTERNAL_STORAGE, 
     Manifest.permission.WRITE_EXTERNAL_STORAGE, 
}; 

public RequestUserPermission(Activity activity) { 
    this.activity = activity; 
} 

public boolean verifyStoragePermissions() { 
    // Check if we have write permission 
    int permissionWrite = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    int permissionRead = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE); 

    if ((permissionWrite != PackageManager.PERMISSION_GRANTED) || 
      (permissionRead != PackageManager.PERMISSION_GRANTED)) { 
     // We don't have permission so prompt the user 
     ActivityCompat.requestPermissions(
       activity, 
       PERMISSIONS, 
       REQUEST_PERMISSION 
     ); 
     return false; 
    }else{ 
     return true; 
    } 
} 

public void providePermission(){ 
    verifyStoragePermissions(); 
} 

public void forceFullOpenPermission(){ 
    if(!verifyStoragePermissions()){ 
     Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
     Uri uri = Uri.fromParts("package", activity.getPackageName(), null); 
     intent.setData(uri); 
     activity.startActivityForResult(intent, REQUEST_PERMISSION); 
    } 
} 

您的活動

RequestUserPermission requestUserPermission = new 
RequestUserPermission(DashBoard.this); 
    requestUserPermission.verifyStoragePermissions(); 

如果要有力開放許可

requestUserPermission.forceFullOpenPermission(); 
+0

您可以在PERMISSION []中添加任何權限,並且可以使用方法verifyStoragePermissions()進行驗證。 –

0

1)請求代碼是您指定的代碼REQUEST_LOCATION,值爲0. permissions是您發送的請求。例如,您可以同時請求位置權限和讀取SMS權限,以便您可以在權限字符串數組中獲取它們。和grantResults是例如每個請求的狀態,如果用戶接受位置請求,這將是1,如果他拒絕閱讀SMS這將是0

2)我認爲這意味着你已經拒絕了這一要求

3)如果你有多次要求,你可以確定哪個結果是哪個請求

和你無關的問題的答案:它是可選的,如果你不想讓其他應用程序使用你的密鑰,你必須設置即

0

1)回調onRequestPermissionResult - where是參數String []權限和int [] grantResults從?

權限是您請求的權限列表,grantResults是這些請求的結果。所以,因爲你只申請一個許可(ACCESS_FINE_LOCATION),你會回來的權限ACCESS_FINE_LOCATION,並且或者PackageManager.PERMISSION_GRANTED或PackageManager.PERMISSION_DENIED在grantResults

2)我不斷收到空值grantResults和的String []權限

這意味着用戶未在權限對話框中單擊接受或拒絕。相反,他們通過點擊對話框或者離開應用程序來取消對話框。

3)我已經將const REQUEST_LOCATION的值設置爲0 - 這個const值是多少?

沒有,這可以是任何東西

0

讓你的運行時間許可,這樣

if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == 
        PackageManager.PERMISSION_GRANTED && 
        ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == 
          PackageManager.PERMISSION_GRANTED) { 
        // Permission already Granted 
        //Do your work here 
//Perform operations here only which requires permission 
      } else { 
       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1); 
      } 

,如果許可尚未授予覆蓋onRequestPermission結果這樣

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
      if (requestCode == 1) { 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
          //Permission Granted 
          //Do your work here 
//Perform operations here only which requires permission 
       } 
      } 
     }