【问题标题】:Marshmallow permissions should ask only if not already granted棉花糖权限仅在尚未授予时才应询问
【发布时间】:2016-09-30 09:18:24
【问题描述】:

我正在开发一个需要多个权限的应用程序,所以我添加了它并做了棉花糖代码,但问题是当我在棉花糖中重新打开一个应用程序时,它总是要求许可,我只想问它是否未授予。

请帮我编写代码,在此先感谢!

【问题讨论】:

  • 即使权限被拒绝,你也不想再次显示?
  • 如果它被拒绝,那么只有它不显示@King
  • 您可以使用 Shared Preference 来检查是否是第一次请求权限。
  • @Pratik 只需要检查一下,如果它已经被批准了
  • @king 我需要 SharedPreference 吗?

标签: android android-studio permissions android-6.0-marshmallow android-permissions


【解决方案1】:

只需检查权限,仅在必要时请求。

的帮助下检查权限
checkSelfPermission(Manifest.permission.READ_CONTACTS)

检查是否已授予权限

if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
    requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
    // app-defined int constant

    return;
}

然后处理权限

@Override
public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {
switch (requestCode) {
    case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            // permission was granted, yay! do the

        } else {
            // permission denied, Disable the
            // functionality that depends on this permission.
        }
        return;
    }
}}

【讨论】:

    【解决方案2】:

    权限系统已更改。但是这里有一个很好的解释如何正确处理它。

    https://developer.android.com/training/permissions/requesting.html

    这样,如果用户授予权限,对话框只会打开一次。如果他拒绝,您可以选择在下次请求许可时显示解释。

    他们还有一个值得阅读的最佳实践部分:

    https://developer.android.com/training/permissions/best-practices.html

    【讨论】:

      【解决方案3】:
      public Boolean marshmallowPermission(){
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
              if (checkPermission()) {
                  Toast.makeText(this,"Permission already granted.", Toast.LENGTH_SHORT).show();
              } else {
                  requestPermission();
                  //marshmallowRequest();
              }
          }
          return true;
      }
      @TargetApi(Build.VERSION_CODES.M)
      public boolean checkPermission(){
      
          int phone= checkSelfPermission(android.Manifest.permission.CALL_PHONE);
          if (phone == PackageManager.PERMISSION_GRANTED ){
              return true;
          } else {
              return false;
          }
      }
      
      @TargetApi(Build.VERSION_CODES.M)
      private void requestPermission(){
      
          if (shouldShowRequestPermissionRationale(android.Manifest.permission.CALL_PHONE)){
      
              Toast.makeText(this," Permission must be needed which allows you to access an app. Please allow  in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
              Intent intent = new Intent();
              intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
              Uri uri = Uri.fromParts("package", this.getPackageName(), null);
              intent.setData(uri);
              this.startActivity(intent);
      
          } else {
      
              requestPermissions(new String[]{android.Manifest.permission.CALL_PHONE},101);
          }
      }
      
      @Override
      public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
          switch (requestCode) {
              case 101:
                  if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
      
                      Toast.makeText(this,"Permission Granted, Now you can access an app.",Toast.LENGTH_LONG).show();
      
                  } else {
      
                      Toast.makeText(this,"Permission Denied, You cannot access call.", Toast.LENGTH_LONG).show();
      
                  }
                  break;
          }
      }
      

      【讨论】:

        【解决方案4】:

        按照以下步骤操作:

        • 创建一组您需要访问的权限。
        • 传递组/数组以检查是否授予权限

        示例代码供您参考:

        public static boolean hasPermissions(Context context, String[]permissions) {
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
            for (String permission : permissions) {
                if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                    return false;
                }
            }
        }
        return true;
        

        上面的代码将检查您的权限组,稍后通过这些权限要求一次

        int PERMISSION_ALL = 1; 
        //create all permissions array
        String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, //all your permissions};
        
        //Now check whether permissions are granted or not
        if(!hasPermissions(this, PERMISSIONS)){
           ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
        }
        

        希望这对你有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-12
          • 1970-01-01
          • 2016-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多