[OFFEN] Probleme in den Speicher schreiben

kukuk

kukuk

App-Anbieter (kostenlos)
29
Hallo alle zusammen, ich habe hier wieder etwas ganz kurioses entdeckt.
Ich bin sogar soweit gegangen und habe mir wieder Android Studio 2.3.2 installiert, weg von der Beta, was sich allerdings rausstellte, das es daran nicht lag.

Ich konnte ohne Probleme meine App aus führen. Dann habe ich die App deinstalliert und mit Android Studio wieder ausgeführt und zack geht gar nichts mehr. Bei jeder Funktion eine Exception.
Ich habe jetzt nach und nach alle Funktionen, die eine Exception verursachen ausgeklammert, sodass die App dann wieder "lief".
Ich habe alles kontrolliert und konnte keinen Fehler finden. Doch dann ist mir aufgefallen, das meine App keinen einzigen Ordner anlegt. Da bin ich stuzig geworden. Durch zufall bin ich in den Berechtigungen gelangt und habe festgestellt, das die Speicher Berechtigung auf einmal deaktiviert war. Nach aktivieren des Schalters läuft die App als wenn nichts gewesen wäre.

1. Hat einer eine Idee wie sowas kann?
2. Ist es möglich, beim Start der App dieses Android Eigene Zulassen Abbrechen Fenster einblenden zu lassen damit man den Speicher aktivieren kann, sollte dieser deaktivert sein?
3. Wenn man die App aus dem Store installiert, ist die Berechtigung für den Speicher dann automatisch an?
 
Moin,

der Haken in den Berechtigungen (den man manuell setzen kann) wird bei jeder Neuinstallation wieder auf den Defaultwert (disabled) gesetzt soweit ich weiß.

Du kannst allerdings seit Android 6 (?) die Berechtigungen zu dem Zeitpunkt abfragen, wenn sie auch wirklich benötigt werden. Somit werden keine 100 unnötigen Berechtigungen gesetzt. Folgend ein kleines Beispiel aus einem meiner kleinen Projekte (aufs Nötigste runtergebrochen). Falls da was nicht stimmen sollte oder besser zu lösen sein sollte - bitte melden:

Code:
// ask for permissions if they arent granted
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    // ask to set permission
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
} else {
    // Mach hier was, wenn die Berechtigung verfügbar ist.
}

Im Beispiel frage ich z.B. nach einer Berechtigung zum Schreiben auf den Speicher des Smartphones (WRITE_EXTERNAL_STORAGE).
Hoffe ich habe dein Problem richtig verstanden. :)
 
  • Danke
Reaktionen: kukuk und swa00
Hallo kukuk,

Du musst grundsätzlich die von dir benötigten Permissions ab M via Source-Code
beim User anfordern.
Ist dies mal geschehen und die App wird wieder deinstalliert, dann das gleiche Spiel von Vorne.

Du kannst es so wie oben erklärt machen oder du verwendest Dexter
GitHub - Karumi/Dexter: Android library that simplifies the process of requesting permissions at runtime.


P.S deine Exceptions haben Dir im übrigen im ErrorLog von AS das auch so hingeschrieben
(Permission required) - Das Ausklammern hättest du dir sparen können.
Oder du gibst grundsätzlich den Errorstring in einem Log aus , wenn eine Exception vorliegt
 
  • Danke
Reaktionen: kukuk und lordzwieback
Mir blieb nix anderes übrig wie ausklammern, weil übern logcat mir nur ausgegeben würde, das irgendein Array null ist und das bei 50 Funktionen
 
das irgendein Array null ist und das bei 50 Funktionen

Sowas habe ich noch nie gehört , dass AS dir kein ArrayOutOfIndex herausgibt.
Kann es sein , dass du ein wenig den Überblick in deinem Source verloren hast ? :)

Ist jetzt deine Frage beantwortet ?

Du gehst nämlich nicht auf unsere Antworten ein
 
Zuletzt bearbeitet:
Danke ja. Meine Fragen sind beantwortet worden.

@lordzwieback: Das ist genau das was ich meinte. Ich werde das jetzt mal implementieren für alle Permissions die ich Verwende.


Gibt es denn eine Möglich die Ausführung des Codes zu pausieren, bis das Fenster mit den Permissions auf zulassen gedrückt wurde und dann die Code Ausführung fortzusetzen?
 
Gibt es denn eine Möglich die Ausführung des Codes zu pausieren, bis das Fenster mit den Permissions auf zulassen gedrückt wurde und dann die Code Ausführung fortzusetzen?

Was heisst pausieren ?

Wenn der User abbricht , dann kannst du ein finish() machen.
Ohne Berechtigung geht es halt nicht weiter - macht ja auch kaum Sinn
 
Die OnCreate wird geladen....
Es kommt allerdings dadurch zu einem Fehler und die App stürzt ab, da es noch keine Speicher Berechtigung gibt.
Man kann auf Zulassen klicken und die App muss man dann erneut starten. Das ist blöd.

Ich habe diesen Listener gefunden ^^:

Code:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE}, 101);


@override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
   switch (requestCode) {
      case 101:
         if (grantResults[1] == PackageManager.PERMISSION_GRANTED) {
            toast_information("WRITE_EXTERNAL_STORAGE ACCEPTED1");
         } else {
            //not granted
         }
         break;
      default:
         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
   }
}
 
Zuletzt bearbeitet:
Dann ist dein Aufbau ein wenig falsch .

a) Im onCreate fragst du die Permission ab
b) Und erst , wenn dort der ListenerCallback die Berechtigung durch den User erhalten hat , machst du weiter
ansonsten beendest du die App

Ein Bsp mit Dexter

Code:
 Dexter.withActivity(this)
                .withPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .withListener( new MultiplePermissionsListener()
                {

                    @Override
                    public void onPermissionsChecked(MultiplePermissionsReport report)
                    {
                      List abgelehnt = report.getDeniedPermissionResponses();
                      if (abgelehnt.size() > 0)
                      {
                       System.exit (0);
                      }
                      else
                      {
                        //  Hier geht es  weiter
                      }
                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token)
                    {
                        token.continuePermissionRequest();

                    }
                }).check();


Anm : Du schreibst in deinem Profil , dass du App-Anbieter bist - Hast du bis jetzt noch keine APp draussen , die auch unter >= M läuft ?
 
Habs jetzt Mal getestet, wenn ich meine Apps aus dem PlayStore installiere, sind die Berechtigungen automatisch gesetzt. Nur beim testen ist dies nicht der Fall.

Gab bis bis jetzt auch noch keine Meldung das die Apps befinden Usern nicht Laufen würden.

Die Apps laufen alle ab Android 2.3
 
Berechtigungen sind ab M niemals gesetzt -
Es kommt natürlich darauf an , welche Permission du verlangst - Internet z.b. benötigt keine Berechtigung .
 
Die die ich verwende sind automatisch gesetzt.
Write External Storage
Read Phone State

Die anderen Permissions tauchen gar nicht in den Berechtigungen auf.
 
Wo gesetzt ? auf deinem Marshmellow / Nougat Device ? Ist das gerootet ?

Oder sprichst du von deiner Manifest ?

PS Write/read external storage ist niemals direkt gesetzt, das ist ein sicherheitsmerkmal von
Marshmellow / Nougat stock roms
 
  • Danke
Reaktionen: lordzwieback
Nach der Installation aus dem PlayStore sind beide Haken definitiv gesetzt. Habs jetzt bei einem Nexus 5X, 6P, Google Pixel und einem HTC One m9 getestet. Die Geräte haben mindestens Android 7. Kein der Telefone ist geröstet.

Deswegen hatte auch noch keiner meiner User Probleme!

Nur wenn ich die App deinstalliere und über Android Studio laufen lassen, ist die Berechtigung nicht gesetzt und es kommt zu meinem geschilderten Fehler.
 
Also dann hast du ein Phänomen , was ich nicht kenne und eigentlich auch so nicht sein darf.:)

Und dann würde mich natürlich an dieser Stelle schon mal interessieren , wie Du es geschafft hast,
alle Restrikitiven von Android zu umgehen :)

Du bist dir aber sicher , dass die user vorher die app auch deinstalliert haben ??
 
@swa00: Wenn man mit einer kleineren Android Version kompiliert, dann muss man "glücklicherweise" nicht alle Permissions für die neuen Android Versionen abfragen.

Ein Kunde von uns hat beispielsweise eine App im Store, welche Ende 2014 von uns programmiert wurde. Bei Updates kompilieren wir immer noch mit der API 21 und müssen deswegen die Permissions nicht abfragen.

@kukuk : Kann es sein, dass du deine API hochgesetzt hast? Sonst wüsste ich auch nicht weiter.
 
@Kardroid

ich habe es eben nochmal ausprobiert . minSdkVersion 19 -> installation auf Nougat -> Write Permission erforderlich

Oder meintest du targetSdkVersion ? (die steht bei mir natürlich dezeit auf 25 :)
 
@Kardroid war das nicht so, dass ich mit beliebiger Version kompelieren kann, aber das target kleienr 6.0 sein muss?

lg. Dagobert
 
@DagobertDokate

Das würde aber im Umkehrschluss bedeuten , dass mit der App nix mehr auf >= 6.0 wäre - richtig ?
(Dann würde die Erklärung von kukuk wieder nicht zutreffen)

Er schreibt nämlich eindeutig , dass bei seinen Apps die Write-Permissions auf M / N Devices automatisch gesetzt worden sind.
 
Zuletzt bearbeitet:
Soweit ich weiß nicht. Denn target heißt ja nicht maxSdk, sondern das es für die Platform entwickelt wurde.
Hier mal ein Post, leider nicht mit den Votes die ich erhofft habe^^
Android 6 target sdk=23 permissions on install

Aber wer heute noch ein veraltetes Rechtesystem implementiert, der ähm... muss selbst wissen was er tut^^
Warum möchte man noch das alte Rechtesystem benutzen?!
 
  • Danke
Reaktionen: markus.tullius

Ähnliche Themen

S
Antworten
4
Aufrufe
944
Sempervivum
S
R
Antworten
3
Aufrufe
1.564
Ritartet
R
B
Antworten
6
Aufrufe
1.002
jogimuc
J
Zurück
Oben Unten