1. 程式人生 > >Android6.0之後要修改設定中的系統開關的方法

Android6.0之後要修改設定中的系統開關的方法

Android6.0之後系統對於安全性問題做了很多設定,如:想修改系統 的橫豎屏,螢幕亮度等等和系統設定相關的問題,在網上收集到的一些請求許可權的方式是沒有用的,對於請求需要WRITE_SETTINGS許可權的需要用以下方式來實現:

Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
 intent.setData(Uri.parse("package:" + mContext.getPackageName()));
 startActivityForResult(intent, 1 );

跳轉到系統設定頁去開啟,但是在此之前,我們的程式碼中要做一些判斷,如下:

public  boolean haveStoragePermissions() {
        //判斷手機中android版本是不是6.0以上,如果是則需要請求許可權,否則不要
        if (Build.VERSION.SDK_INT >= 23) {
            if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_SETTINGS)
              == PackageManager.PERMISSION_GRANTED) {//檢查是否有此許可權,有則返回true
return true; } else { //跳轉至相應的設定介面進行設定 return false; } } else { //permission is automatically granted on sdk<23 upon installation return true; } }

設定完返回的時候判斷WRITE_SETTINGS許可權是否設定成功,成功則做響應的操作:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1) {
            if (Settings.System.canWrite(mContext)) {//判斷是否設定成功,返回true則設定成功
                //在此做響應的操作
            }
        }
    }

跳轉至設定介面之前先彈出dialog詢問使用者是否進行設定,具體程式碼如下:

public  boolean haveStoragePermissions() {
        //判斷手機中android版本是不是6.0以上,如果是則需要請求許可權,否則不要
        if (Build.VERSION.SDK_INT >= 23) {
            if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_SETTINGS)
              == PackageManager.PERMISSION_GRANTED) {//檢查是否有此許可權,有則返回true
                return true;
            } else {
                    //跳轉至相應的設定介面進行設定
                    AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
                dialog.setTitle(“設定許可權”);
                dialog.setMessage(“此功能需要開啟系統許可權,是否開啟?”);
                dialog.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {
                @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
          dialog.setPositiveButton(“確定”, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                        intent.setData(Uri.parse("package:" + mContext.getPackageName()));
                        startActivityForResult(intent, 1 );
                    }
                });
             dialog.create().show();
           return false;
            }
        }
        else { //permission is automatically granted on sdk<23 upon installation
            return true;
        }
    }

另一個特殊許可權請求SYSTEM_ALERT_WINDOW(設定懸浮窗,進行一些黑科技):
其他就不多寫了,只寫主要的,跳轉值系統設定介面程式碼:

new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);  
    intent.setData(Uri.parse("package:" + getPackageName()));  
    startActivityForResult(intent, 2);  

Activity返回後主要判斷是否開啟的方法如下:

@Override  
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    super.onActivityResult(requestCode, resultCode, data);  
    if (requestCode == 2) {  
        if (Settings.canDrawOverlays(this)) {  //返回true則許可權已經開啟
         //開啟許可權之後可以做的操作
        }  
    }  
}