Der Anruf wird außer, weil ich nicht die Erlaubnis habe.
Ich bin mir nicht sicher, wohin ich von hier aus gehen soll. Gibt es eine neue Klingelton-API für 23? Oder hat diese Berechtigungsänderung es einfach für Nicht-System-Apps unmöglich gemacht, den Klingelton zu ändern?
CommonsWare
Benutzen WRITE_SETTINGSbasierend auf den Dokumenten:
Habe den <uses-permission> Element im Manifest wie gewohnt.
Wenn canWrite() kehrt zurück falseAnlaufen der ACTION_MANAGE_WRITE_SETTINGS Aktivität damit der Benutzer dort zustimmen kann, dass Ihre App tatsächlich in die Einstellungen schreiben darf.
Mit anderen Worten, das Schreiben in Einstellungen ist jetzt ein Double-Opt-In (der Installation zustimmen, separat in den Einstellungen zustimmen, um dies zuzulassen), ähnlich wie bei Geräteverwaltungs-APIs, Eingabehilfen usw.
Danke Markus! Lief wie am Schnürchen. developer.android.com/preview/features/runtime-permissions.html muss aktualisiert werden, wenn wir mehrere neue Möglichkeiten zum Anfordern von Berechtigungen haben werden. (Ich hatte Ihren Blog bereits vor dem Posten gelesen, aber diese Information offensichtlich nicht behalten, als ich sie brauchte.)
– Justin
19. August 2015 um 13:46 Uhr
Das hat tatsächlich funktioniert. Aber für den Endverbraucher ist das ein schlechter Ansatz. Gibt es Anzeichen dafür, dass Google dieses Verhalten ändert?
– Fhl
9. September 2015 um 7:58 Uhr
@Fhl: Ich weiß nicht, warum sie diese Route statt der regulären gegangen sind dangerous Laufzeitberechtigungsansatz, den sie mit anderen Dingen in Android 6.0 verfolgten. Ich werde mich wundern, wenn sich das in absehbarer Zeit ändert.
– CommonsWare
9. September 2015 um 11:08 Uhr
Sie können Ihre App wie folgt in der Absicht angeben: intent.setData(Uri.parse("package:" + Context.getPackageName()));
– Olegas Goncarovas
23. Oktober 2015 um 17:24 Uhr
Eine weitere zu beachtende Sache ist, dass es anscheinend einen Fehler in Android gibt, der dazu führt, dass eine zuvor installierte App, bei der der Benutzer im oben beschriebenen Dialog Schreibberechtigungen erteilt hat, wo der Kippschalter in die aktivierte Position gebracht wird, canWrite jedoch false zurückgibt. Damit die Methode canWrite() true zurückgibt, muss der Benutzer den Schalter aus- und wieder einschalten … Ich sehe dies in der Entwicklung, aber hoffentlich wird es nicht etwas sein, das Kunden sehen.
– Matt Wolfe
8. Januar 2016 um 19:43 Uhr
KP.dev
Zusätzlich zur Antwort von CommonsWare und dem Kommentar von Ogix ist hier ein Dummy-Code:
Das Fragment PopupwritePermission gibt dann ein Fenster, in dem die Situation erklärt wird. Ein Klick auf die Schaltfläche OK öffnet das Android-Systemmenü, in dem die Berechtigung erteilt werden kann:
Die vorherigen Antworten sind großartig, ich habe nur eine kleine Ergänzung, um auch das Ergebnis für die Erlaubnisfrage zu erhalten.
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);
}
}
}
Und dann im 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
}
}
Ich habe Ihren Code eingefügt, und er funktioniert einwandfrei, sogar die erteilte Berechtigung, aber der benutzerdefinierte Klingelton wird immer noch nicht zugewiesen und es besteht immer noch das Problem, dass die Write_Setting-Berechtigung verweigert wird.
– Zia Ur Rahman
19. November 2016 um 6:50 Uhr
ActivityCompat.requestPermissions (Kontext, neue Zeichenfolge[]{Manifest.permission.WRITE_SETTINGS}, ….); kann nicht benutzt werden. Es ist eine Sondergenehmigung. Wir können diese Erlaubnis nur mit einer Absicht beantragen, wie in der Dokumentation angegeben. Auch vor Marshmello wird die Berechtigung zum Zeitpunkt der Installation dauerhaft erteilt
– Anonym
17. Juli 2017 um 13:08 Uhr
@yshahak was ist deine Variable MainActivity.CODE_WRITE_SETTINGS_PERMISSION ?
– Bruno Bieri
3. Juni 2018 um 12:12 Uhr
@BrunoBieri ja du hast Recht, das habe ich weggelassen. Ich werde meine Antwort so bearbeiten, dass sie ausführlich ist.
– yshahak
4. Juni 2018 um 6:52 Uhr
Also was ist MainActivity.CODE_WRITE_SETTINGS_PERMISSION?
– Klammern
1. Dezember 2018 um 20:03 Uhr
Daniel Rauf
Dies ist ein vollständiges Beispiel:
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);
}
}
Abhishek Garg
Ab Android Marshmellow müssen Sie Laufzeitberechtigungen verwenden, die auf mehr Sicherheit abzielen, oder die Berechtigung verwenden, wenn dies erforderlich ist Dokumentation
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();
}
passig
Die Erlaubnis android.permission.WRITE_SETTINGS ist jetzt in der Gruppe signature|appop|pre23|preinstalled wie android.permission.CHANGE_NETWORK_STATE und android.permission.SYSTEM_ALERT_WINDOW
Dies bedeutet, dass Sie es auf SDK 22 und darunter erhalten. Bei neueren Versionen müssen Sie App-Operator sein.
Emaille Haque
Ich habe unten wie verwendet..
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();
}
}