Не удается получить разрешение на запись параметров
когда у меня есть целевой API 23 на Android M Preview 3, я не могу получить Манифест.разрешение.Разрешение WRITE_SETTINGS.
requestPermissions(new String[]{Manifest.permission.WRITE_SETTINGS},
101);
разрешение запроса не вызывает диалог, который я ожидал бы, но если я сделаю следующий вызов без этого разрешения,
RingtoneManager.setActualDefaultRingtoneUri(activity, RingtoneManager.TYPE_RINGTONE, ringUri);
вызов будет за исключением того, что у меня нет разрешения.
Я не уверен, куда идти отсюда. Есть ли новый ringtone API для 23? Или это разрешение изменилось просто сделать это невозможно для любых несистемных приложений, чтобы изменить мелодию звонка?
7 ответов:
использовать
WRITE_SETTINGS, на основании документов:
есть
<uses-permission>элемент в манифесте, как обычно.вызов
Settings.System.canWrite()чтобы увидеть, если вы имеете право выписать параметры.если
canWrite()возвращаетfalse, запуск theACTION_MANAGE_WRITE_SETTINGSактивность таким образом, пользователь может согласиться, чтобы ваше приложение действительно писало в настройки.IOW, запись в настройки теперь это двойная опция (согласитесь установить, согласитесь отдельно в настройках разрешить), сродни API администратора устройства, службам доступности и т. д.
также обратите внимание, что я еще не пробовал использовать их-это основано на исследование, которое я сделал вчера на Android 6.0 изменения.
как дополнение к ответу от CommonsWare, и комментарию Ogix, здесь какой-то фиктивный код
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; }фрагмент PopupwritePermission дает окно, в котором объясняется ситуация. Щелчок по кнопке OK откроет системное меню Android, где разрешение может быть предоставлено:
private void openAndroidPermissionsMenu() { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + getActivity().getPackageName())); startActivity(intent); }
предыдущие ответы отличные, у меня есть только небольшое дополнение для получения результата для запроса разрешения.
public static void youDesirePermissionCode(Activity context){ boolean permission; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { permission = Settings.System.canWrite(context); } else { permission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_SETTINGS) == PackageManager.PERMISSION_GRANTED; } if (permission) { //do your code } else { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + context.getPackageName())); context.startActivityForResult(intent, MainActivity.CODE_WRITE_SETTINGS_PERMISSION); } else { ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_SETTINGS}, MainActivity.CODE_WRITE_SETTINGS_PERMISSION); } } }а потом в
Activity:@SuppressLint("NewApi") @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == MainActivity.CODE_WRITE_SETTINGS_PERMISSION && Settings.System.canWrite(this)){ Log.d("TAG", "MainActivity.CODE_WRITE_SETTINGS_PERMISSION success"); //do your code } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == MainActivity.CODE_WRITE_SETTINGS_PERMISSION && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //do your code } }
Это полный пример:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Settings.System.canWrite(context) { // Do stuff here } else { Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse(“package:” + getActivity().getPackageName())); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } }
разрешение
android.permission.WRITE_SETTINGSтеперь в группеsignature|appop|pre23|preinstalledкакandroid.permission.CHANGE_NETWORK_STATEиandroid.permission.SYSTEM_ALERT_WINDOWЭто означает, что вы получите его на sdk 22 и ниже. В новой версии вы должны быть оператором приложения.
упоминание ниже разрешения в AndroidManifest.XML
в действии используйте ниже, если еще для изменения настроек.
if(Settings.System.canWrite(this)){ // change setting here } else{ //Migrate to Setting write permission screen. Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + mContext.getPackageName())); startActivity(intent); }
как android Marshmellow, вам необходимо использовать разрешения во время выполнения, которые направлены на повышение безопасности, или использовать разрешение, когда это необходимо здесь documenatation
а для записи настроек документация есть здесь
в манифест добавить
<uses-permission android:name="android.permission.WRITE_SETTINGS" />в свой класс
private boolean checkSystemWritePermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(Settings.System.canWrite(context)) return true; else openAndroidPermissionsMenu(); } return false; } private void openAndroidPermissionsMenu() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + context.getPackageName())); context.startActivity(intent); } }и использовать его так
try { if (checkSystemWritePermission()) { RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri); Toast.makeText(context, "Set as ringtoon successfully ", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(context, "Allow modify system settings ==> ON ", Toast.LENGTH_LONG).show(); } } catch (Exception e) { Log.i("ringtoon",e.toString()); Toast.makeText(context, "unable to set as Ringtoon ", Toast.LENGTH_SHORT).show(); }
Comments