Lesen / Schreiben einer Textdatei - SD-Karte

TorstenM1979

Mitglied
Hallo,

ich bin gerade etwas am Verzweifeln. Ich versuche mich an meiner ersten Android-App, es soll ein ganz einfacher Vokabeltrainer werden. Ich kann zwar Java ansich ganz gut programmieren, habe aber mit Android absolut keine Erfahrungen. Daher fällt es mir schwer, bestimmte Aspekte wie Android-Version, SDK-Version, etc. richtig einzuordnen.

Im Netz gibt es sehr viele Anfragen und auch "Lösungen", wie man sich die notwendigen Rechte holt, um Dateien zu lesen bzw. zu schreiben. Aber die Lösungen, so scheint es mir jedenfalls, sind immer davon abhängig, welche Softwareversionen man selbst verwendet. Bitte korrigiert mich, falls ich falsch liege.

Ich habe im Manifest versucht, die Schreib- und Leserechte anzufordern und bekam den Hinweis, dass
Code:
android.permission.READ_EXTERNAL_STORAGE
und
Code:
android.permission.WRITE_EXTERNAL_STORAGE
obsolete seien. Ich solle doch den
Makefile:
MediaStore
benutzen. Nun ist eine einfache Textdatei keine Mediendatei.

Könnte mir irgendjemand einen Link oder ein Beispiel geben, mit dem ich ein Verzeichnis auf der SD Karte erstellen und im Anschluss eine Textdatei schreiben kann?

Vielen Dank im Voraus
Torsten
 
Wenn nur Deine App auf die Daten zugreifen darf/soll schreibe doch in den App-spezifischen Speicher. Da brauchst Du auch keine Berechtigungen anfordern

 
Hm...

also als Einsteiger ist es echt nicht leicht, die Beschreibungen des SDKs sind aus meiner Sicht nicht ausreichend. Aber gut, hiermit https://ourcodeworld.com/articles/r...e-external-storage-permission-work-in-android habe ich es geschafft - denke ich jedenfalls, sicher bin ich mir nicht. Es kam eine Einstellung, dass ich den Dateizugriff manuell gestatten muss. Sollte also passen.

Nun möchte ich Verzeichnisse und Dateien erstellen. Aber hier scheint etwas noch nicht zu passen, ich kann im Debugger mit F8 drüber gehen, keine Exception. Alles gut denke ich mir, aber es wurde weder ein Verzeichnis noch eine Datei erstellt.

Was mache ich hier nun falsch?


VG Torsten
 
@walex: So hatte ich es anfangs auch gemacht, hat auch wunderbar funktioniert. Nun möchte ich es aber erstmal vermeiden, eine Eingabemöglichkeit zum Anlegen von neuen Vokabeln zu programmieren (zuvor waren die Vokabeln hart kodiert). Ich will also am Rechner die Vokabeln in eine XML-Datei schreiben, von der App aus lesen und auch den Lernfortschritt darin speichern.

VG Torsten
 
Hallo,

so hatte ich es erst auch gemacht. Hat wunderbar funktioniert. Ich will aber erstmal keine Möglichkeit zum Anlegen von neuen Vokabeln programmieren. Mir ist es vorerst lieber, wenn ich die Vokabeln per XML Datei einlese. Das Speichern ist dann für den Lernfortschritt notwendig.

VG Torsten
 
Java:
intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
das ist erst ab Android 11 APi 30 verfügbar
 
Zuletzt bearbeitet:
Hallo,

ich habe eine statische Variable in meiner MainActivity-Klasse:

Java:
public static final File ExternalStorage = new File(Environment.getExternalStorageDirectory().toString(), "/Vokabelkiste");

und zwei Methoden:

Code:
@RequiresApi(api = Build.VERSION_CODES.R)
private void initializeExternalStorage() {
    try {
        ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.MANAGE_EXTERNAL_STORAGE }, 1);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            if (isExternalStorageManager(ExternalStorage)) {
                // we have access, all fine
            } else {
                var intent = new Intent();
                var uri = Uri.fromParts("package", this.getPackageName(), null);

                intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
                intent.setData(uri);
                startActivity(intent);
            }
        }

        this.createPathIfNotExists();
    } catch (Exception exception) {
        throw new RuntimeException("External storage could not be initialized", exception);
    }
}

Code:
private void createPathIfNotExists() throws Exception {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        if (Files.exists(Paths.get(ExternalStorage.toURI()))) {
            return;
        }

        Files.createDirectory(Paths.get(ExternalStorage.toURI()));
    }
}

Mit der ersten Methode prüfe bzw. hole ich mir die Rechte zum Schreiben auf die SD Karte. Die zweite Methode soll ein Verzeichnis erstellen, falls es noch nicht existiert.


VG Torsten
 
Java:
private void createPathIfNotExists() throws Exception {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // sollte R sein
   
...
File file = new File(Environment.getExternalStorageDirectory() + "/" + "test");
boolean folderCreated = file.mkdir();

    }
}
Wie schon gesagt get der Code erst ab API 30 Android 11.
darunter nicht.
 
Wenn ich in die Moduleigenschaften meines Projektes rein schaue, steht dort <Compile Sdk Version> = 33 und Android 13.0 Tiramisu. Sollte das nicht passen?

VG Torsten
 
Hallo,

so hatte ich es erst auch gemacht. Hat wunderbar funktioniert. Ich will aber erstmal keine Möglichkeit zum Anlegen von neuen Vokabeln programmieren. Mir ist es vorerst lieber, wenn ich die Vokabeln per XML Datei einlese. Das Speichern ist dann für den Lernfortschritt notwendig.

VG Torsten
Verstehe ich jetzt nicht. Irgendwoher müssen ja die (ersten) Vokabeln kommen, entweder liefert Du in der App bei der Installation welche mit (z. B. im assets folder, dann auch gerne per xml) oder der Nutzer muss welche eingegeben. Warum must Du die Vokabeln unbedingt in einem öffentlichen Verzeichnis halten, warum reicht da nicht das App- spezifische?
 
Weil er die Datei wohl für eimen In und Export dem User zur Verfügung stellten willen. Fur das reine Arbeiten würde sicher der App Speicherbereich reichen.
 
Richtig, die ersten Vokabeln waren hart-kodiert und anschließend im App-Verzeichnis gespeichert. Das hart kodieren funktioniert auf Dauer natürlich nicht. Mit Visual Studio Code lassen sich Xml Dateien wunderbar schreiben und gegen eine Xsd prüfen. Das würde mir alles erstmal reichen.

VG Torsten
 
Die Hauptfrage war wie du die XML Datei der App (APK) mitgeben willst?

Oder soll der User erst nach dem App installieren die Datei selber erstellen?

Ich gehe mal davon aus das die App erstmal nur für dich ist. Und du dir selber eine Datei in einen Ordner der SD Karte selber im Vorfeld angelegt hast.
 
Ich gehe mal davon aus das die App erstmal nur für dich ist. Und du dir selber eine Datei in einen Ordner der SD Karte selber im Vorfeld angelegt hast.
Eben, das denke ich auch. Und dann ist m.E. das Einfachste, diese Datei in den Asset-Felder zu kopieren und daraus zu laden. Keine Berechtigung und sondtige Klimmzüge mehr nötig
 
Eben, das denke ich auch. Und dann ist m.E. das Einfachste, diese Datei in den Asset-Felder zu kopieren und daraus zu laden. Keine Berechtigung und sondtige Klimmzüge mehr nötig
Er will auf die Datei auch schreibend zugreifen also müsste er sie auch erstmal aus den Assets in den App Speicherbereich zu Laufzeit kopieren.

Zweitens scheint er ohne das er die APP neu kompiliert wird, die Vokabeln erweitern wollen.
Und wie er selber in Post #7 sagte will er erst mal keine Eingabe der Vokabeln in der App schreiben.


Er wird wohl die Datei auch vom außerhalb der App Bearbeiten wollen. ZB am PC.
 
G' Morgen,

sorry, bin gerade aus dem Urlaub zurück. Also nochmal langsam 🙂

1) Ich möchte am PC eine XML Datei editieren, in der die Vokabeln inkl. möglicher Übersetzungen zu finden sind. Diese will ich dann immer wieder mal erweitern und auf das Smartphone kopieren. Entweder auf die SD Karte, oder in den internen Bereich. Mittels Windows Explorer ginge das ja auch.

2) Die App soll in der Lage sein, diese XML zu lesen und zu schreiben. Schreiben deswegen, weil ich mir auch den Lernfortschritt speichern will bzw. muss. Ich will die gelernten Vokabeln natürlich "nach hinten" schieben, damit die nicht ständig abgefragt werden. Macht ja wenig Sinn.

Um erstmal mit dem Lernen voranzukommen, würde mir das so absolut ausreichen. Ich muss keine Vokabeln am Smartphone anlegen oder verändern, das Editieren am Rechner ist erstmal völlig ausreichend.


VG Torsten
 
Wenn das Deine Anforderungen sind ist es m.E. das einfachste, den internen App-Speicher zu nehmen.
Die Datei kannst Du auf dem PC editieren und - wie Du ja selbst schreibts - in dieses Verzeichnis schieben.
Dieses Verzeichnis ist ohne eine Berechtigungsanforderung lese- und schreibbar für Deine App, da kannst Du dann auch weitere Dateien ablegen.
 
Das wäre dann
Java:
Galaxy A21s\Interner Speicher\Android\data\Vokabelkiste\Vokabeln.xml
?
eher

<Dein_Device>\Interner Speicher\Android\data\<dein_packagename>\files

Aber ich muss zugeben: Ich habe das noch nie über den Windows-Explorer gemacht sondern nehme dazu immer den 'Device File Explorer' von Android Studio 🙂
 
Okay, ich versuche das mal. Sobald ich diesen Fehler hier beseitigt bekomme. Also ganz ehrlich, solche Probleme kenne ich bisher nicht:

Java:
Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.internal.jdk7.JDK7PlatformImplementations found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.internal.jdk7.JDK7PlatformImplementations$ReflectSdkVersion found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.internal.jdk8.JDK8PlatformImplementations found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.internal.jdk8.JDK8PlatformImplementations$ReflectSdkVersion found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.io.path.ExperimentalPathApi found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.io.path.PathRelativizer found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.io.path.PathsKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.io.path.PathsKt__PathReadWriteKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.io.path.PathsKt__PathUtilsKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.jdk7.AutoCloseableKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.jvm.jdk8.JvmRepeatableKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.random.jdk8.PlatformThreadLocalRandom found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.streams.jdk8.StreamsKt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$1 found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$2 found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$3 found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$4 found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.text.jdk8.RegexExtensionsJDK8Kt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.time.jdk8.DurationConversionsJDK8Kt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)

Go to the documentation to learn how to Fix dependency resolution errors.

Ich kann nicht einmal mehr ein neues /leeres Projekt aufsetzen :-(

Keine Ahnung, warum jetzt dieser Fehler auftritt. Was muss ich tun?

VG Torsten
 
Du hast dependencies auf zwei verschiedene kotlin-stdlibs.

Vermutlich eine im classpath, die andere als plugin 🙂

Zeig mal deine build.gradle files...
 
Java:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '8.0.2' apply false
    id 'com.android.library' version '8.0.2' apply false
}

plugins {
id 'com.android.application'
}

Code:
plugins {
    id 'com.android.application'
}

android {
    namespace 'de.tmende.vokabelkiste'
    compileSdk 33

    defaultConfig {
        applicationId "de.tmende.vokabelkiste"
        minSdk 24
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    buildFeatures {
        viewBinding true
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'androidx.navigation:navigation-fragment:2.6.0'
    implementation 'androidx.navigation:navigation-ui:2.6.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

Das sind die beiden von einem neuen, leeren Projekt.
 
Ok.
dependencies {

implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.navigation:navigation-fragment:2.6.0'
implementation 'androidx.navigation:navigation-ui:2.6.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
Egänze mal die dependencies mit
Code:
    modules {
        module("org.jetbrains.kotlin:kotlin-stdlib-jdk7") {
            replacedBy("org.jetbrains.kotlin:kotlin-stdlib", "kotlin-stdlib-jdk7 is now part of kotlin-stdlib")
        }
        module("org.jetbrains.kotlin:kotlin-stdlib-jdk8") {
            replacedBy("org.jetbrains.kotlin:kotlin-stdlib", "kotlin-stdlib-jdk8 is now part of kotlin-stdlib")
        }
    }

Einfach in die dependencies über den ersten implementation-Eintrag kopieren. Anschliessend gradle-sync und build.
 
Vielen dank, das hat funktioniert.

Mit dem Lesen scheint es aber nicht zu funktionieren, ich habe eine xml-Datei unter
Java:
Galaxy A21s\Interner Speicher\Android\data\de.tmende.vokabelkiste\files\de-DE-es-ES.xml
abgelegt, bekomme beim Lesen aber eine Exception
Code:
java.io.FileNotFoundException: /data/user/0/de.tmende.vokabelkiste/files/de-DE-es-ES.xml: open failed: ENOENT (No such file or directory)

Den Pfad ermittle ich mit
Code:
getApplicationContext().getFilesDir();

Ich vermute mal, ich bin im falschen Pfad?

VG Torsten
 
Vielen dank, das hat funktioniert.

Mit dem Lesen scheint es aber nicht zu funktionieren, ich habe eine xml-Datei unter
Java:
Galaxy A21s\Interner Speicher\Android\data\de.tmende.vokabelkiste\files\de-DE-es-ES.xml
abgelegt, bekomme beim Lesen aber eine Exception
Code:
java.io.FileNotFoundException: /data/user/0/de.tmende.vokabelkiste/files/de-DE-es-ES.xml: open failed: ENOENT (No such file or directory)

Den Pfad ermittle ich mit
Code:
getApplicationContext().getFilesDir();

Ich vermute mal, ich bin im falschen Pfad?

VG Torsten
Ja, das ist der falsche Pfad. Der müsste so aussehen:
Java:
/data/data/<dein_packagename>/files
Ich sage ja - mit dem Windows-Explorer habe ich das nie probiert. Schon mal über Android Studio versucht?
 
Klar.
Ich habe da am Rand ein Label mit 'Device File Explorer'.
Wenn das bei Dir nicht da ist öffne einfach im Menu 'Help->Find Action' mit dem Stichwort 'Device File Explorer'
 
Ah, habe es schon gefunden. Mit der automatischen Ermittlung des Pfades geht es nicht, aber mit einem hart kodieren Pfad. Reicht erstmal aus.

Vielen, vielen, vielen, vielen Dank für deine Unterstützung - unbezahlbar ;-)

VG Torsten
 
Eines möchte ich noch zu diesem Speicher Path noch erwähnt haben.
Beim Deinstallieren der App wird auch der Ordner gelöscht mit Inhalt.
Also dein Xml wird nach dem Deinstall nicht mehr da sein.
 
Da die technischen Dinge soweit abgeschlossen scheinen, möchte ich noch ein paar Dinge erwähnen, die mir bei diesem Thread durch den Kopf gegangen sind. Diese sind aber nur dann interessant, wenn es bei der App um mehr geht als eben nur eine Spielerei oder den Eigennutzen.

Usability

Wenn man eine App an Dritte geben möchte, dann ist die Usability wichtig. Nutzer sollen die App ja problemlos nutzen können. Dazu gehört, dass es möglichst Intuitiv sein muss.

SD Karte
Es ist für Dich durchaus interessant, Daten über eine SD Karte mit dem Computer auszutauschen. Das ist aber ein Weg, der nicht immer geht.
a) Viele Smartphones haben keine Möglichkeit, eine SD Karte einzubinden. Und bei vielen Smartphones, die diese Möglichkeit haben, ist das zugleich auch der Platz für die zweite SIM Karte (Und man hat teilweise nur ein Einschub, d.h. man nimmt dann immer die SIM Karte mit raus wenn man die SD Karte einlegen oder herausnehmen möchte).
b) Die SD Karte enthält Daten. Daher sollte eigentlich jeder Anwender diese Karte verschlüsseln. Zumindest mein Android Handy hatte damals diese Funktionalität. Sobald dies der Fall ist, ist der Datenaustausch zumindest erschwert.

Kabelverbindung
Das Handy einfach anzuschließen an einen Computer ist schon besser. Aber auch hier ist die Usability sehr schlecht. Man muss den Ordner mit den Daten erst einmal finden. Und das kann durchaus unterschiedlich sein. Einige Anbieter erlauben es, Anwendungen auf die SD Karte auszulagern und schon ist der Pfad eine andere.
Und man muss das auch alles erst einmal eingerichtet bekommen. Je nach Anbieter kann das auch relativ problematisch werden.

Daher macht es durchaus Sinn, sich andere Wege zu überlegen.

Nutzung eines gemeinsamen Netzes
Was ich von diversen Anwendungen kenne (z.B. bei einer Keepass Anwendung) ist die Möglichkeit, dass die Anwendung einen kleinen Webserver aktivieren kann. Dann ist das Handy über eine URL erreichbar. Wenn dann die Geräte im gleichen Netzwerk sind, dann kann man auf dem Computer die URL angeben und hat dann guten Zugriff auf die Daten um z.B. Backups herunter zu laden oder Daten hinzu zu fügen und so.
Aber diese Lösung hat auch einiges an Komplexität und ist Fehleranfällig.
a) So kann es sein, dass der WLAN Router direkte Kommunikation aus Sicherheitsgründen nicht zulässt.
b) die Komplexität auf Entwicklerseite ist nicht gerade gering - hier muss man sowas erst einmal in der App einbinden (auch wenn es da durchaus Libraries gibt, die einem viel Arbeit abnehmen). Und zum anderen gibt es technische Einschränkungen (die aber ok sind. App muss dann halt im Vordergrund aktiv sein für diesen Datenaustausch).

Cloud Nutzung
Aus meiner Sicht ist es sinnvoll, einfach auf die Cloud zu setzen. Die großen Cloud Anbieter haben zum einen gute APIs um auf diese zuzugreifen und zum anderen ist es etwas, das in der Regel von allen genutzt wird. Und die Daten sind nicht so sicherheitsrelevant, als das dies hier wichtig wird.

Web Server
Eine Lösung kann natürlich auch ein eigener Webserver sein, mit denen sich die App verbindet. Das kann eine relativ gute Möglichkeit sein auch für weitere Ideen. So kannst Du dann "Vokabel-Packs" anbieten oder so. Und Du hast dann eine bessere Kundenbindung. Kunden haben dann einen Account bei Dir (Geht auch ohne Registrierung. Du kannst z.B. eine Anmeldung über Google Account erlauben. Dann muss ein Kunde da kaum etwas machen. Es läuft nur auf eine einfache Anmeldung hinaus.)

Das einfach nur als eine kleine Liste. Das ist aber nur ein kleines Brainstorming und jede Idee müsste man sich im Detail genauer überlegen. Und da könnte man dann auch recherchieren: Wie machen das denn andere Apps? Was für Erwartungshaltungen haben Anwender? Was kennen die bereits?

Bei diesen schnellen Gedanken möchte ich es dann aber auch belassen. Es soll halt nur eine Denkanregung sein falls die App dann auch mal veröffentlicht werden soll.
 
Und ein SD-Karte kann (wie andere beteiligte Komponenten auch) aus einem x-beliebigen Grund teilweise/komplett ausfallen. Von daher sollte man andere Speicherplätze als Reserve einplanen.
 
Und ein SD-Karte kann (wie andere beteiligte Komponenten auch) aus einem x-beliebigen Grund teilweise/komplett ausfallen. Von daher sollte man andere Speicherplätze als Reserve einplanen.
Richtig
aber den Paht den der TE benutzen will und tut, ist nicht die echte Physikalische SDKarte sondern die Emulierte Karte. Die fest verbaut ist, nicht ausgetauscht werden kann.
 

Neue Themen


Zurück
Oben