Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't get WRITE_SETTINGS permission

When I have a target API of 23 on Android M Preview 3, I cannot seem to acquire the Manifest.permission.WRITE_SETTTINGS permission.

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

Request permission doesn't bring up the dialog I would expect, but if I make the following call without this permission,

 RingtoneManager.setActualDefaultRingtoneUri(activity, RingtoneManager.TYPE_RINGTONE, ringUri); 

The call will except because I don't have the permission.

I'm not sure where to go from here. Is there a new ringtone API for 23? Or did this permission change just make it impossible for any non-system apps to change the ringtone?

like image 695
Justin Avatar asked Aug 18 '15 22:08

Justin


People also ask

How do I grant permission to write on Android?

Call Settings. System. canWrite() to see if you are eligible to write out settings. If canWrite() returns false , start up the ACTION_MANAGE_WRITE_SETTINGS activity so the user can agree there to allow your app to actually write to settings.

How do I get permission denied on Android?

On your phone, open the Settings app. Permission manager. Tap a permission type. If you allowed or denied permission to any apps, you'll find them here.


2 Answers

To use WRITE_SETTINGS, based on the docs:

  1. Have the <uses-permission> element in the manifest as normal.

  2. Call Settings.System.canWrite() to see if you are eligible to write out settings.

  3. If canWrite() returns false, start up the ACTION_MANAGE_WRITE_SETTINGS activity so the user can agree there to allow your app to actually write to settings.

In other words, writing to settings is now a double-opt-in (agree to install, agree separately in Settings to allow), akin to device admin APIs, accessibility services, etc.

Also note that I have not tried using these yet — this is based on research that I did yesterday on Android 6.0 changes.

like image 77
CommonsWare Avatar answered Oct 12 '22 23:10

CommonsWare


In addition to the answer from CommonsWare and the comment from Ogix, here is some dummy code:

private boolean checkSystemWritePermission() {     boolean retVal = true;     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {         retVal = Settings.System.canWrite(this);         Log.d(TAG, "Can Write Settings: " + retVal);         if(retVal){             Toast.makeText(this, "Write allowed :-)", Toast.LENGTH_LONG).show();         }else{             Toast.makeText(this, "Write not allowed :-(", Toast.LENGTH_LONG).show();             FragmentManager fm = getFragmentManager();             PopupWritePermission dialogFragment = new PopupWritePermission();             dialogFragment.show(fm, getString(R.string.popup_writesettings_title));         }     }     return retVal; } 

The Fragment PopupwritePermission then gives a window where the situation is explained. A click on the OK Button will open the Android System Menu where the Permission can be granted:

private void openAndroidPermissionsMenu() {     Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);     intent.setData(Uri.parse("package:" + getActivity().getPackageName()));     startActivity(intent); } 
like image 44
KP.dev Avatar answered Oct 12 '22 22:10

KP.dev