Programmablaufreihenfolge und Permission

  • Hallo Gemeinde,


    ich habe eine kleine App geschrieben, die eigentlich bereits funktioniert. Nun stosse ich in der Testphase auf ein Problem das vorher nicht auffällig war.
    Es geht um den ersten Aufruf nach der Installation. Also im Android Studio Emulator "Wipe Data" und "Cold Boot" durchgeführt bzw. in den Testgeräten die App deinstalliert und das erstellte Datenverzeichnis gelöscht.


    Nach der Installation der Debug App und Start derselben passiert folgendes:
    Zuallererst wird die Permission WRITE_EXTERNAL_STORAGE abgefragt. Fenster erscheint und ich erlaube den Zugriff. Das Programm läuft ohne Absturz weiter, jedoch kann der Programmteil im onCreate, welcher eine Datendatei erstellen soll, diese Datei noch nicht erstellen. Android wartet ja nicht auf die Erlaubnis des Benutzers, sondern arbeitet onCreate ja durch, und zwar in dem Moment eben noch ohne die erteilte Permission.
    Das heisst im weiteren Verlaufe meines Programms wird diese Datei nicht gefunden und kann somit nicht mit neuen Daten erweitert werden . Das ist schlecht! :cursing:
    Beim erneuten Starten läuft alles einwandfrei. Die Permission ist dann ja da. :saint:


    Meine Denkblokade ist.... Wo lege ich das erstmalige Erstellen denn hin, wenn nicht im onCreate Segment???


    Irgendwas an der Android Systematik habe ich da noch nicht so ganz verstanden... Wer weiss da Rat?

  • Hi,


    die developer Seiten habe ich durchstöbert, auch so einiges anderes im Netz gelesen. Das Problem ist auch mit einem anderen Hindernis verbunden das aufgefallen ist.
    Ich wollte ebenfalls vor der Permission Abfrage des Systems ein Dialog anzeigen das dem Benutzer weitere Informationen über die Berechtigungen gibt. Dazu habe ich ein AlertDialog genutzt. Und siehe da der AlertDialog erscheint und wird sofort von der Permission Abfrage des Systems überdeckt. (Stichwort: Modale Dialoge)… aber das nur am Rande. Bleiben wir erstmal bei einem Problem...


    Die Struktur meines Programmes sieht so aus:


    Imports etc...


    public class MainActivity extends AppCompatActivity implements View.OnClickListener
    //Variablen/Objekt Deklarationen
    Button butmor;...


    protected void onCreate(Bundle savedInstanceState) etc.
    //Permission prüfen
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
    Nix wird gemacht
    else
    AlertDialog mit Text für Userinformationen
    //Permisson anfragen
    requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_EXTERNAL_STORAGE_RESULT);
    end if


    //Objekte mit Layout verbinden
    butmor = (Button) findViewById(R.id.butmor);...


    //ein paar Daten Arrays und Variablen initialisieren
    ...


    //Datendatei lesen oder als leerdatei erstellen
    if !datei.exists
    datei erstellen
    else
    datei lesen
    end if


    //Buttons mit onclickListener verbinden
    butmor.setOnClickListener(this);...


    //einige Attribute setzen
    butmor.setBackgroundColor(0xFFFF4444);...


    //Listview erstellen/befüllen/anzeigen
    Adaper etc.

    //Andere Datendatei für Programmeinstellungen lesen oder erstellen
    if !datei.exists
    datei erstellen
    else
    datei lesen
    end if
    ----------------Ende onCreate


    //onCreate für Menue
    public boolean onCreateOptionsMenu(Menu menu) etc.

    //ein paar subroutinen für die Programmlogik
    public void …


    //Reaktionen auf Menueclicks
    public boolean onOptionsItemSelected(MenuItem item)
    switch case usw. für zwei activitys


    //Reaktionen auf Objektclicks
    public void onClick(View view)
    switch case usw. bei Bedienung der Eingabefelder


    ein Case zum speichern der eingegeben Daten
    ----------------Ende der Show

    Ich frage also zuerst die bestehenden Permissions ab, mache in dem If Zweig bei bestehender Permission aber nichts, da die folgenden Sachen ja dann eh durchlaufen werden. Nur im Else Zweig Frage ich die Permission an. (mit einem davorgesetzten AlertDialog, der aber sogleich von dem Systemfenster überlagert wird.


    Mein Problem ist nun, dass die beiden Dateioperationen, beim allerersten Mal halt ohne Permission abgearbeitet werden. Mit dem Ergebnis das diese Dateien nicht erstellt werden.


    Starte ich das Programm dann erneut, funzt natürlich alles Reibungslos.


    Ich hoffe das ich meine Struktur verständlich dargelegt habe, und ihr damit was anfangen könnt... würde mich über eine gute Idee sehr freuen.

  • Hi Snake3000,
    du kannst deinen Ablauf (Datei schreiben) in eine Funktion auslagern.
    Diese Funktion rufst du auf, wenn du die Berechtigung hast (im onCreate) (kannst du mit einer einfach If-Abfrage machen(zb. if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR)).
    Logischerweise wird der Teil überspringen, wenn du die Berechtigung noch nicht hast.
    Du kannst aber via der Methode onRequestPermissionsResult mitbekommen, ob die jemand die Berechtigung erlaubt hat.
    Ist das der Fall kannst du von dort aus auch nochmal die Funktion aufrufen.



    Steht aber auch alles im verlinkten Artikel von jogimuc. (siehe die Kapitel: Check for permissions und Handle the permissions request response)

  • Hi Xcreen,


    danke das war der Schubs in die richtige Richtung. Habe es umgebastelt und nun funzt es...


    Die Developer Artikel empfinde ich manchmal recht schwierig verständlich als Anfänger.


    Aber nun habe ich es so gelöst:
    Wie Du sagtest habe ich den Code zur Datei Erstellung in eine Funktion gelegt.
    Im onCreate habe ich sie, nun als Aufruf, drin gelassen. Damit habe ich zunächst nichts geändert, denn mit Permission geht es ja.
    Zusätzlich prüfe ich, wie Du es sagtest, das Vorhandensein der Permission am Ende vor dem Speichern nochmal ab. Wenn sie da ist rufe ich die Funktion nochmals auf.


    Klappt perfekt.


    Ich danke Dir recht herzlich. (Und Jogi, natürlich auch :) )


    Jetzt habe ich nur noch das kleine Schönheitsproblemchen mit dem AlertDialog den ich vor der Permission Abfrage aufrufe. Da muss ich noch etwas dran knobeln....

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!