Write to external Storage

  • 31 Antworten
  • Letztes Antwortdatum
Ich danke dir für deine Hilfe.
Aber es geht jetzt nicht mehr.

ich glaube es macht nur noch Sinn für Windows in .net zu enwickeln. Da gibt so eine scheiße nicht.

Ich mache Schluss für heute. Andoid ist seit Version 8.0 das schlimmste und unübersichtlichstes System was man sich vorstellen kann. Mit jeder neuen Version und mit jeder neuer Gradle Version läuft nix mehr. Ich kann nicht mehr.
 
Hallo ich habe zwar noch nicht den ganzen thread gelesen.
Zum ersten Post wenn du willst das keine permission User Abfrage notwendig ist muss das target auf 22 stehen . Nur will Googl play min 26 kannste somit nicht darüber vertreiben
 
@jogimuc
Das Problem besteht darin das er bei seinem Smartphone (Android 10) nicht auf den external storage schreiben kann. Bei virtuellen Geräten kleiner Android 10 geht es. Die Permission Abfrage geht und ist auch nicht das Problem.

@kukuk
Nicht verzweifeln hier gibt es oft Hilfe. Die Probleme mit den Updates kenne ich. Daher mache ich mir vorher immer eine Sicherung vom Projektordner (Dateiebene) damit ich bei Problemen auf das letzte funktionierende zurückgreifen kann.

Wenn ich was Zeit bekomme packe ich mir Android 10 in den Emulator und teste das mal. Leider bin ich in Urlaub. Kann also was dauern.
 
  • Danke
Reaktionen: kukuk
Ich habe jetzt wieder Android 9 auf mein Handy geflasht.

Ich kann jetzt auch meine AAR Bibliothek einbinden und eine signierte APK erstellen.

Um ein Projekt mit einer selbsterstellten AAR zu erstellen muss man im Gradle Fenster rechts assemble Release in der Bibliothek auswählen.

Ich habe nämlich rausgefunden, das bei allen andern Build Optionen in der AAR auch eine JAR mit einkompiliert wird. Somit kommt es dann zu dem Fehler
 
Zuletzt bearbeitet:
Hallo habe es mal im Emulator getestet. Läuft unter Api 29 und auch darunter.

Mit Environment.getExternalStorageDirectory() greifst du auf „Storage/emulated/0“ zu.
Den du ab Emulator API 28 nicht mehr im DateiFileExplorer sehen kannst.

Geschrieben wird die Datei aber scheinbar trotzdem denn die Methode „mkdir()“ gibt true zurück.

Beachte aber auch das meistens erst nach der Permissen User Abfrage das Schreiben auf den Speicherbereich erst beim zweiten App Start stattfindet.

Code:
public class MainActivity extends AppCompatActivity {

    boolean b;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

// Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

            } else {
                 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1234);

            }
        } else {
            dateierstellen();
        }


    }

    void dateierstellen(){
        File file = new File(Environment.getExternalStorageDirectory()+"/test/");
        if (!file.isDirectory()) {
            b = file.mkdir();
            Toast.makeText(getApplicationContext(), "Datei :   " + b, Toast.LENGTH_SHORT).show();
            b = file.delete();
            Toast.makeText(getApplicationContext(), "Datei gelöscht :   " + b, Toast.LENGTH_SHORT).show();
        }
    }



    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == 1234) {
            Log.i("resultcode",""+requestCode);
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.i("resultcode","dateierstellen  "+requestCode);
                dateierstellen();
            }
            else {
                Toast.makeText(getApplicationContext(),  "Permission Denied", Toast.LENGTH_SHORT).show();
            }
        }
    }

}
 
  • Danke
Reaktionen: enrem und kukuk
Danke dir für deine große Mühe.

Ich denke auch mal andere Leute können deine Permission Abfrage gut gebrauchen.

Auch wenn ich jetzt wieder auf Pie bin, kann ich deine Permission Abfrage gut gebrauchen.

Den kurioserweiße muss ich auch bei MinSDK22 eine Permission Abfrage durchführen, da die Berechtigung im System auf False steht.
 
Hallo das hat mit der MinSDK Version nichts zu tun.


Was du willst ist das TargetSDK, hatte ich an Anfang aber auch schon gesagt.


Mit
compileSdkVerion 28
minSdkVersion 15
targetSdkVersion 22


würdest du keine Abfrage bekommen, nur kannst du es so nicht mehr bei Google Play hochladen.


[doublepost=1556036994][/doublepost]

@enrem

Das Problem besteht darin das er bei seinem Smartphone (Android 10) nicht auf den external storage schreiben kann. Bei virtuellen Geräten kleiner Android 10 geht es. Die Permission Abfrage geht und ist auch nicht das Problem

Das stimmt also nicht den er hatte doch Probleme mit den Premission.

und der Code ist von hier .
Request App Permissions | Android Developers
 
Den kurioserweiße muss ich auch bei MinSDK22 eine Permission Abfrage durchführen, da die Berechtigung im System auf False steht.

Vor API 21 reichte es wenn du die Permission ins AndroidManifest gepackt hast.

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

Geräte bis API 20 funktionierten damit. Neuere Geräte ab API 21 stürzten ab, da diese nun eine zur Laufzeit erzeugte Permission forderten. Da hat dir ja Jogimuc ein Beispiel gebracht.

Für dich bedeutet es, das du für Geräte ab API 21 diese von Jogimuc verwenden must. Hier im Link siehst du ab welcher API die PermissionRequest zur Verfügung steht.

PermissionRequest | Android Developers

Ich habe nun meine APP auch im Emulator (API 28) laufen. Und es geht wie jogimuc es geschildert hat.

Mit Environment.getExternalStorageDirectory() greifst du auf „Storage/emulated/0“ zu.
Den du ab Emulator API 28 nicht mehr im DateiFileExplorer sehen kannst.

Leider wird im Emulator kein Storage/emulated/0 angezeigt. Wusste ich auch noch nicht. Aber du kannst dir den ES-Dateiexplorer installieren und somit auf den Storage/emulated/0 zugreifen.

Wenn du später die App im PlayStore zur Verfügung stellen möchtest, musst du dir überlegen ab welcher API-Version (minSdkVersion) die App funktionieren soll.

minSdkVersion – Die minSdkVersion gibt an, welcher Android API Level mindestens benötigt wird, damit die App ausgeführt werden kann. Sie legt fest auf welchen Android Systemen die App installiert werden kann. Ist für die minSdkVersion kein Wert gesetzt, wird als mindest Android API Level der Wert 1 angenommen. Zur Laufzeit kann es dann auf älteren Android Systemen zu Abstürzen kommen, wenn auf eine API zugegriffen wird, die nicht auf dem Zielsystem vorhanden ist.

Quelle:
Programmier Tutorial: Apps für Android entwickeln – Teil 5: Die Struktur des erstellten Android Studio Projekts im Detail

Ich hoffe ich habe jetzt nicht an deiner Frage vorbei geredet.
 

Anhänge

  • emulated_permission.png
    emulated_permission.png
    35,9 KB · Aufrufe: 253
@enrem
Vor API 21 reichte es wenn du die Permission ins AndroidManifest gepackt hast.
nein vor API 23

Ab einer targetSdkVersion 23 brauchst du die Abfrage des Users zur Laufzeit vorher nicht.

Wenn du später die App im PlayStore zur Verfügung stellen möchtest, musst du dir überlegen ab welcher API-Version (minSdkVersion) die App funktionieren soll.

minSdk hat da wenig damit zu tun das ist das Target und TargetSDK unter 26 geht mit Googel play nicht mehr.

Für dich bedeutet es, das du für Geräte ab API 21 diese von Jogimuc verwenden must

nein ab API 23


entscheident ist das Target nicht minsdk für die Permission
 
Zuletzt bearbeitet:
@jogimuc
Ups, ich bin von 21 ausgegangen weil die ab der API 21 Zur Verfügung stand. Danke für die Korrektur.

minSdk hat da wenig damit zu tun das ist das Target und TargetSDK unter 26 geht mit Googel play nicht mehr.

Ich bin etwas verwirrt. minSdkVersion setzt die unterste Grenze der API. Nur Geräte über dieser API können im PlayStore dann meine App sehen und herunter laden. Oder verstehe ich das falsch ?

Die minSdkVersion
Während die compileSdkVersion die neuste verfügbare API bestimmt, setzt der Entwickler mit minSdkVersion die untere Grenze der zu verwendenden API. Der Entwickler teilt mit diesem Wert zum Beispiel dem Google Play Store mit, ob eine App auf dem Gerät des Users ausgeführt werden kann oder nicht. Verwendet der Nutzer also zum Beispiel ein Gerät, welches eine Android Version benutzt, die unter dem minSdkVersion Wert liegt, kann die App auf diesem Gerät nicht installiert werden. Dabei ist wichtig zu bedenken, dass auch Dependencies und Support Libraries Werte für die minSdkVersion haben können. In diesem Fall kann der minSdkWert der App grunsätzlich erst einmal nicht niedriger sein, als der minSdkVersion Wert der Dependencies. Zwar kann diese Regel mit der Funktion toolsVerrideLibrary überschrieben werden. Dieses Vorgehen wird jedoch allgemein nicht empfohlen und bei einer Verwendung der Funktion sollten ausführliche Tests durchgeführt werden.

Die targetSdkVersion
Die letzte und interessanteste Funktion ist targetSdkVersion. Hier wird nämlich die eigentliche Forward Compatibility der App sichergestellt. Das wird erreicht, indem Verhaltens- oder Programmänderungen durch neue Versionen in der App nicht ausgeführt werden, bis die targetSdkVersion auf den neuen Wert verändert wird. Dank dieser Funktion kann in complileSdkVersion immer die neuste API für die Entwicklung festgelegt werden, ohne dass diese Einfluss auf den Programmablauf hätte. Änderungen in der App, die sich aufgrund einer Änderung der targetSdkVersion ergeben, werden in der Regel im Play Store und in der App Beschreibung angegeben. Da ein Update auf eine neue targetSdkVersion für den User in der Regel immer interessante Änderungen und Verbesserungen mit sich bringt, sollte der Entwickler das Update nicht verzögern. Dennoch sollte man auch kein vorschnelles Update auf eine neue Version erzwingen. Es ist in der Regel sicherer und besser, vorher ausführlich zu testen, um fehlerhafte Apps und verärgerte User zu vermeiden.

Quelle:
Die richtige Wahl der Android compilesdkversion, minsdkversion & targetsdkversion - Appmatics | App-Testing und mobile Web-Testing
 
Ich bin etwas verwirrt. minSdkVersion setzt die unterste Grenze der API. Nur Geräte über dieser API können im PlayStore dann meine App sehen und herunter laden. Oder verstehe ich das falsch ?

Das stimmt schon nur das Target legt fest wie es sich verhalten soll. Also ob so arbeiten soll als wäre unter API 22 geschrieben worden. Da brauchte man noch keine User Abfrage.

Da sich auch ab Android 8 Api 26 einiges geändert hat und Google die alten Sachen nicht mehr unterstützen will haben sie auch das TargetSdk auf 26 angehoben .


Somit musst du die User abfrage machen wenn du es über Google vertreiben willst.
 
  • Danke
Reaktionen: kukuk und enrem
Da kann man ja ein ganzes Buch mit füllen nur über die Permission Abfrage.

Ich habe es aber jetzt verstanden. Dachte immer, das das minSDK relevant ist. Ist aber falsch. Jetzt verstehe ich auch warum es nicht ging.


Danke dir / euch.
 
Zurück
Oben Unten