【问题标题】:Android Request Permission CallbackAndroid请求权限回调
【发布时间】:2017-05-03 12:58:16
【问题描述】:

我正在尝试从 https://developers.google.com/android/guides/permissions 实现 Android 权限

几个问题: 1) 回调 onRequestPermissionResult - 参数 String[] 权限和 int[]grantResults 来自哪里? 2) 我不断获得 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);
}

一个不相关的问题...在获取 google map API 密钥时,是否需要设置 SHA-1 值或者是可选的,并且仅将密钥限制为 android。

谢谢。

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

【问题讨论】:

  • "参数 String[] 权限和 int[]grantResults 来自哪里?" -- String[] 应该包含您传递给requestPermissions() 的字符串。 int[] 包含这些权限的相应状态(例如,已授予)。就个人而言,我从不使用这些。 “这个 const 的值有什么关系?” -- 它需要在来自此活动或其片段的所有requestPermisions()startActivityForResult() 调用中有所不同。

标签: android google-maps


【解决方案1】:

公共类 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();

【讨论】:

  • 您可以在PERMISSION[ ]中添加任何权限,并可以使用方法verifyStoragePermissions()进行验证
【解决方案2】:

1) 请求代码是您将其命名为REQUEST_LOCATION,值为0。permissions 是您发送的请求。例如,您可以一次请求位置权限和读取短信权限,这样您就可以在权限字符串数组中获取它们。 grantResults 是每个请求的状态,例如,如果用户接受 Location 请求,它将为 1,如果他拒绝 Read SMS,它将为 0

2)我认为这意味着您拒绝了请求

3)这样,如果您从不同的地方多次请求,您可以确定哪个结果是针对哪个请求的

并回答您不相关的问题:不,这是可选的,如果您不希望其他应用程序使用您的密钥,则必须设置它

【讨论】:

    【解决方案3】:

    像这样获得你的运行时权限

        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
                    }
                }
            }
    

    【讨论】:

      【解决方案4】:

      1) 回调 onRequestPermissionResult - 参数 String[] 权限和 int[]grantResults 来自哪里?

      permissions 是您请求的权限列表,grantResults 是这些请求的结果。因此,由于您只请求了一个权限(ACCESS_FINE_LOCATION),您将在权限中返回 ACCESS_FINE_LOCATION,并在 grantResults 中返回 PackageManager.PERMISSION_GRANTED 或 PackageManager.PERMISSION_DENIED

      2) 我不断得到 grantResults 和 String[] 权限的空值

      这意味着用户没有在权限对话框中单击接受或拒绝。相反,他们通过单击对话框外部或退出应用程序来取消对话框。

      3) 我已将 const REQUEST_LOCATION 的值设置为 0 - 这个 const 的值是什么重要吗?

      不,这可以是任何东西

      【讨论】:

        猜你喜欢
        • 2017-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-03
        • 1970-01-01
        相关资源
        最近更新 更多