WRITE_SETTINGS权限模糊

时间:2016-01-28 06:04:18

标签: android android-6.0-marshmallow

我正在为Android 6.0 Marshmallow构建我的应用程序,它需要 WRITE_SETTTINGS 权限。在搜索from here之后,我开始知道这称呼:

requestPermissions(new String[]{Manifest.permission.WRITE_SETTINGS},
              101);

不会显示对话框权限。因此,根据CommonsWare解决方案,我们应该检查是否Settings.System.canWrite() 返回true或false。因此,我应该将ACTION_MANAGE_WRITE_SETTINGS作为操作调用Activity。

但问题是当我调用此活动时,它显示我的应用程序已被授予权限,但方法Settings.System.canWrite()返回false。

我在这里遗漏了什么,或者我必须禁用它然后再次启用它。

5 个答案:

答案 0 :(得分:7)

在我的Nexus 6上使用Android 6.0.1(MMB29S)这段代码:

if (!android.provider.Settings.System.canWrite(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
    intent.setData(Uri.parse("package:dummy"));
    startActivity(intent);
}
仅当允许修改系统设置设置为已禁用时,

才会打开“设置”。例如,在全新安装后首次启动(不重新安装)

编辑(请参阅评论):某些设备可能会针对此代码进行错误处理,canWrite()始终会返回false,无论设置的值如何。< / p>

答案 1 :(得分:5)

b

对话: -

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (Settings.System.canWrite(context)) {

            //Write code to feature for eg. set brightness or vibrate device 
           /* ContentResolver cResolver = context.getContentResolver();
            Settings.System.putInt(cResolver, Settings.System.SCREEN_BRIGHTNESS,brightness);*/
        }
        else {
            showBrightnessPermissionDialog(context);
        }

例如。完整的亮度代码。

 private  static  void showBrightnessPermissionDialog(final Context context) {

    final AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setCancelable(true);
    final AlertDialog alert = builder.create();
    builder.setMessage("Please give the permission to change brightness. \n Thanks ")
            .setCancelable(false)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
                    intent.setData(Uri.parse("package:" + context.getPackageName()));
                   // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);
                    alert.dismiss();
                }
            });
    alert.show();
}

答案 2 :(得分:1)

我在为Android 6开发时遇到了类似的问题。这是因为,现在开发人员必须在运行时请求权限。我的解决方案就在这里 -

在onCreate中,显示权限对话框。假设方法的名称是 showPermissionsDialog()

//Global variable request code
private static final int WRITE_PERMISSION_REQUEST = 5000;

private void showPermissionsDialog() {
    if (Build.VERSION.SDK_INT == 23) {

      int hasWriteSettingsPermission = checkSelfPermission(Manifest.permission.WRITE_SETTINGS);
      if (hasWriteSettingsPermission != PackageManager.PERMISSION_GRANTED) {
        //You can skip the next if block. I use it to explain to user why I wan his permission.
        if (!ActivityCompat.shouldShowRequestPermissionRationale(HomeActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)) {
          showMessageOKCancel("You need to allow write settings",
              new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                  ActivityCompat.requestPermissions(HomeActivity.this, new String[]{Manifest.permission.WRITE_SETTINGS}, WRITE_PERMISSION_REQUEST);
                }
              });
          return;
        }
//The next line causes a dialog to popup, asking the user to allow or deny us write permission
        ActivityCompat.requestPermissions(HomeActivity.this, new String[]{Manifest.permission.WRITE_SETTINGS}, WRITE_PERMISSION_REQUEST);
        return;
      } else {
        //Permissions have already been granted. Do whatever you want :) 
      }
    }
}

//Now you only need this if you want to show the rationale behind  
//requesting the permission.      
    private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
    new AlertDialog.Builder(HomeActivity.this).setMessage(message).setPositiveButton("OK", okListener)
        .setNegativeButton("Cancel", null).show();
  }

//This method is called immediately after the user makes his decision to either allow 
  // or disallow us permision.
  @Override
  public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
      case WRITE_PERMISSION_REQUEST:
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
          //User pressed the allowed button
          //Do what you want :)
        } else {
          //User denied the permission
          //Come up with how to hand the requested permission
        }
      default:
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
  }

答案 3 :(得分:1)

事实证明,如果您在清单中声明CHANGE_NETWORK_STATE,即使未授予权限,允许WRITE_SETTINGS的切换也会默认为开启位置。您甚至不需要声明WRITE_SETTINGS来遇到此错误。

答案 4 :(得分:1)

按如下方式编写此方法:

public void writePermission() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.System.canWrite(getApplicationContext())) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent, 200);

        }
    }
}

然后在调用对话框之前调用方法(writePermission)

我希望这会有所帮助