2017-05-03 82 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 
       } 
      } 
     }