WRITE_SETTINGS-Berechtigung kann nicht abgerufen werden

Lesezeit: 6 Minuten

WRITE SETTINGS Berechtigung kann nicht abgerufen werden
Justin

Wenn ich eine Ziel-API von 23 auf Android M Preview 3 habe, kann ich anscheinend die Berechtigung Manifest.permission.WRITE_SETTTINGS nicht erwerben.

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

Berechtigung anfordern bringt nicht den Dialog, den ich erwarten würde, aber wenn ich den folgenden Aufruf ohne diese Berechtigung tätige,

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

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?

1646313188 231 WRITE SETTINGS Berechtigung kann nicht abgerufen werden
CommonsWare

Benutzen WRITE_SETTINGSbasierend auf den Dokumenten:

  1. Habe den <uses-permission> Element im Manifest wie gewohnt.

  2. Anruf Settings.System.canWrite() um zu sehen, ob Sie berechtigt sind, Einstellungen zu schreiben.

  3. 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.

Beachten Sie auch, dass ich noch nicht versucht habe, diese zu verwenden – dies basiert auf Nachforschungen, die ich gestern zu Android 6.0-Änderungen durchgeführt habe.

  • 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

WRITE SETTINGS Berechtigung kann nicht abgerufen werden
KP.dev

Zusätzlich zur Antwort von CommonsWare und dem Kommentar von Ogix ist hier ein 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;
}

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:

private void openAndroidPermissionsMenu() {
    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
    intent.setData(Uri.parse("package:" + getActivity().getPackageName()));
    startActivity(intent);
}

1646313189 660 WRITE SETTINGS Berechtigung kann nicht abgerufen werden
yshahak

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

1646313190 56 WRITE SETTINGS Berechtigung kann nicht abgerufen werden
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);
    }
}

1646313190 570 WRITE SETTINGS Berechtigung kann nicht abgerufen werden
Abhishek Garg

Ab Android Marshmellow müssen Sie Laufzeitberechtigungen verwenden, die auf mehr Sicherheit abzielen, oder die Berechtigung verwenden, wenn dies erforderlich ist Dokumentation

und für Write Settings Dokumentation ist Hier

Im Manifest hinzufügen

<uses-permission android:name="android.permission.WRITE_SETTINGS" />

In deiner Klasse

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);
    }
}

Und benutze es so

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();
        }

1646313190 33 WRITE SETTINGS Berechtigung kann nicht abgerufen werden
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.

1646313191 478 WRITE SETTINGS Berechtigung kann nicht abgerufen werden
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();
        }
    }

Erlaubnis manifestieren

<uses-permission  android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" />

923730cookie-checkWRITE_SETTINGS-Berechtigung kann nicht abgerufen werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy