Kiedy mam docelowy interfejs API 23 w systemie Android M Preview 3, nie mogę uzyskać uprawnienia Manifest.permission.WRITE_SETTTINGS.
requestPermissions(new String[]{Manifest.permission.WRITE_SETTINGS},
101);
Prośba o pozwolenie nie powoduje wyświetlenia okna dialogowego, którego oczekiwałbym, ale jeśli wykonam następujące wywołanie bez tego pozwolenia,
RingtoneManager.setActualDefaultRingtoneUri(activity, RingtoneManager.TYPE_RINGTONE, ringUri);
Zadzwonię, chyba że nie mam pozwolenia.
Nie wiem, dokąd się stąd udać. Czy istnieje nowy interfejs API dzwonków dla 23? A może ta zmiana uprawnień uniemożliwiła zmianę dzwonka żadnym aplikacjom niesystemowym?
źródło
dangerous
podejścia do uprawnień w czasie wykonywania, z innymi rzeczami w Androidzie 6.0. Zdziwię się, jeśli to się zmieni w najbliższym czasie.intent.setData(Uri.parse("package:" + Context.getPackageName()));
Oprócz odpowiedzi z CommonsWare i komentarza Ogix, oto trochę fałszywego kodu:
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; }
Fragment PopupwritePermission następnie wyświetla okno, w którym wyjaśniono sytuację. Kliknięcie przycisku OK spowoduje otwarcie menu systemu Android, w którym można udzielić pozwolenia:
private void openAndroidPermissionsMenu() { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + getActivity().getPackageName())); startActivity(intent); }
źródło
Poprzednie odpowiedzi są świetne, mam tylko niewielki dodatek do uzyskania wyniku również za prośbą o pozwolenie.
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); } } }
A potem w
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 } }
źródło
MainActivity.CODE_WRITE_SETTINGS_PERMISSION
?MainActivity.CODE_WRITE_SETTINGS_PERMISSION
?Oto kompletny przykład:
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); } }
źródło
Począwszy od Androida Marshmellow, musisz używać uprawnień uruchomieniowych, które mają na celu większe bezpieczeństwo, lub używać uprawnień, gdy jest to potrzebne, tutaj jest dokumentacja
a dokumentacja ustawień zapisu jest tutaj
W manifeście dodaj
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
W Twojej klasie
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); } }
I używaj tego w ten sposób
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(); }
źródło
Uprawnienie
android.permission.WRITE_SETTINGS
jest teraz w grupiesignature|appop|pre23|preinstalled
jakandroid.permission.CHANGE_NETWORK_STATE
iandroid.permission.SYSTEM_ALERT_WINDOW
Oznacza to, że otrzymujesz go na SDK 22 i niższych. W nowszej wersji musisz być operatorem aplikacji.
źródło
Użyłem poniżej jak ...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { boolean retVal = true; retVal = Settings.System.canWrite(this); if (retVal == false) { if (!Settings.System.canWrite(getApplicationContext())) { Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName())); Toast.makeText(getApplicationContext(), "Please, allow system settings for automatic logout ", Toast.LENGTH_LONG).show(); startActivityForResult(intent, 200); } }else { Toast.makeText(getApplicationContext(), "You are not allowed to wright ", Toast.LENGTH_LONG).show(); } }
Wyraźne pozwolenie
<uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" />
źródło
Wspomnij poniżej uprawnienia w AndroidManifest.xml
W aktywności użyj poniżej, jeśli inaczej, do zmiany ustawienia.
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); }
źródło
•
Kotlin Version in Simple Steps
Wykonaj następujące kroki:
1. Dodaj element użytkowania uprawnienia w
manifest.xml
normalnie:<uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" />
2. Tam, gdzie chcesz zmienić ustawienia, sprawdź uprawnienia do zapisu:
if (context.canWriteSettings) { // change the settings here ... } else { startManageWriteSettingsPermission() }
3. Dodaj również te linie kodu w przypadku prośby o pozwolenie:
private fun startManageWriteSettingsPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Intent( Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:${context.packageName}") ).let { startActivityForResult(it, REQUEST_CODE_WRITE_SETTINGS_PERMISSION) } } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQUEST_CODE_WRITE_SETTINGS_PERMISSION -> { if (context.canWriteSettings) { // change the settings here ... } else { Toast.makeText(context, "Write settings permission is not granted!", Toast.LENGTH_SHORT).show() } } } } val Context.canWriteSettings: Boolean get() = Build.VERSION.SDK_INT < Build.VERSION_CODES.M || Settings.System.canWrite(this) companion object { private const val REQUEST_CODE_WRITE_SETTINGS_PERMISSION = 5 }
źródło