【问题标题】:Ask Multiple Permissions Android询问多个权限 Android
【发布时间】:2017-08-02 17:40:48
【问题描述】:

我正在修改现有的 Face Tracker 应用 Android 的面部识别示例项目。我在请求多个永久权限时遇到问题。下面的方法是现有方法的修改版本,成功创建了一个弹出窗口来请求相机权限。我正在尝试使用存储权限复制它,但到目前为止我一直没有成功,我不确定这里需要更改什么。

 private void requestAllPermissions() {
    Log.w(TAG, "Camera + Storage permissions are not granted. Requesting permissions");

    final String[] permissions = new String[]{Manifest.permission.CAMERA};
    final String[] permissions2 = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};


    if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.CAMERA)) {
        ActivityCompat.requestPermissions(this, permissions, RC_HANDLE_CAMERA_PERM);
        return;
    }

    //new
    if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        ActivityCompat.requestPermissions(this, permissions2, RC_HANDLE_STORAGE_PERM);
        return;
    }


    final Activity thisActivity = this;

    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ActivityCompat.requestPermissions(thisActivity, permissions,
                    RC_HANDLE_CAMERA_PERM);
        }
    };

    View.OnClickListener listener2 = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ActivityCompat.requestPermissions(thisActivity, permissions2,
                    RC_HANDLE_STORAGE_PERM);
        }
    };

    Snackbar.make(mGraphicOverlay, R.string.permission_camera_rationale,
            Snackbar.LENGTH_INDEFINITE)
            .setAction(R.string.ok, listener)
            .show();

    Snackbar.make(mGraphicOverlay, R.string.permission_storage_rationale,
            Snackbar.LENGTH_INDEFINITE)
            .setAction(R.string.ok, listener2)
            .show();
}

【问题讨论】:

  • 为什么你有 四个 requestPermissions() 电话? requestPermissions() 采用一组权限名称,而不仅仅是一个。这应该合并到一个requestPermissions() 调用中。
  • 原始代码仅对相机有两个请求权限调用,我不确定为什么但复制了它。

标签: android permissions


【解决方案1】:

如果你想在一个对话框中询问所有权限,你应该只有一个字符串数组,像这样:

int ALL_PERMISSIONS = 101;

final String[] permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};

ActivityCompat.requestPermissions(this, permissions, ALL_PERMISSIONS);

【讨论】:

    【解决方案2】:

    为什么要多次请求权限。 requestpermission 方法接受权限数组。要请求任何权限,您可以使用以下代码并添加您需要的权限。这是您在访问与权限相关的任何数据之前通过请求它们来处理运行时权限的方式

    public  boolean isStoragePermissionGranted() {
    if (Build.VERSION.SDK_INT >= 23) {
    
        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED) {
            Log.v(TAG,"Permission is granted");
            return true;
        } else {
    
            Log.v(TAG,"Permission is revoked");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1);
            return false;
        }
    }
    else { //permission is automatically granted on sdk<23 upon installation
        Log.v(TAG,"Permission is granted");
        return true;
    }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 0:
                boolean isPerpermissionForAllGranted = false;
                if (grantResults.length > 0 && permissions.length==grantResults.length) {
                    for (int i = 0; i < permissions.length; i++){
                        if (grantResults[i] == PackageManager.PERMISSION_GRANTED){
                            isPerpermissionForAllGranted=true;
                        }else{
                            isPerpermissionForAllGranted=false;
                        }
                    }
    
                    Log.e("value", "Permission Granted, Now you can use local drive .");
                } else {
                    isPerpermissionForAllGranted=true;
                    Log.e("value", "Permission Denied, You cannot use local drive .");
                }
                if(isPerpermissionForAllGranted){
                    shoro();
                }
                break;
            }
        }
    

    一旦您这样做,对于 API >=23 的设备,您将在运行时弹出窗口,然后一旦用户接受或拒绝该权限,您的 onRequestPermissionsResult 方法就会被调用。所以在这里你必须处理你的检查用户是否授予应用程序权限。如果是,你可以继续你的逻辑

    【讨论】:

      【解决方案3】:

      你要做的就是把权限放在一个字符串数组中

      int PERMISSION_ALL = 1;
      String[] PERMISSIONS = {
              android.Manifest.permission.READ_CONTACTS,
              android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
              android.Manifest.permission.READ_EXTERNAL_STORAGE,
              Manifest.permission.ACCESS_FINE_LOCATION
      };
      

      然后检查权限使用

      public static boolean hasPermissions(Context context, String... permissions) {
          if (context != null && permissions != null) {
              for (String permission : permissions) {
                  if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                      return false;
                  }
              }
          }
          return true;
      }
      

      现在最后要做的事情是在 oncreate() 或 onStart() 中使用它

      if(!hasPermissions(this, PERMISSIONS)){
              ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
          }
      

      【讨论】:

        【解决方案4】:

        我今天遇到了这个问题,Aman Grover 的回答实际上对我有用,你只需要做以下事情

        final String[] permissions = new String[]{ 
            android.Manifest.permission.READ_CONTACTS, 
            Manifest.permission.READ_EXTERNAL_STORAGE
        };
        
        ActivityCompat.requestPermissions(this, permissions, 123);
        

        【讨论】:

          【解决方案5】:

          这是最简单的解决方案:

          将此代码添加到 MainActivity 的 onCreate 方法中

          //Requesting permissions
                  int PERMISSION_ALL = 1;
                  String[] PERMISSIONS = {
                          android.Manifest.permission.READ_CONTACTS,
                          android.Manifest.permission.RECORD_AUDIO,
                          android.Manifest.permission.CALL_PHONE,
                  };
          
                  if (!hasPermissions(this, PERMISSIONS)) {
                      ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
                  }

          现在,在你的主要活动类中添加这个函数

          public static boolean hasPermissions(Context context, String... permissions) {
              if (context != null && permissions != null) {
                  for (String permission : permissions) {
                      if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                          return false;
                      }
                  }
              }
              return true;
          }
          

          您可以添加许多您需要在应用程序启动时询问的权限。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-05
            • 2019-09-20
            • 1970-01-01
            • 1970-01-01
            • 2013-05-21
            相关资源
            最近更新 更多