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?
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.
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.
To use WRITE_SETTINGS, based on the docs:
Have the <uses-permission> element in the manifest as normal.
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.
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.
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); } If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With