Die Verwaltung von Dateien und das Arbeiten mit verschiedenen Speicherarten in Android ist eine grundlegende Fähigkeit für Entwickler, um Anwendungen effizient zu gestalten. Besonders wenn es um externen Speicher geht, ist es entscheidend, den Status dieses Speichers vor dem Versuch, auf ihn zuzugreifen, zu überprüfen. Dies gewährleistet nicht nur eine bessere Fehlerbehandlung, sondern auch eine zuverlässigere Benutzererfahrung. In diesem Kapitel betrachten wir, wie man auf externen Speicher zugreifen kann, um Dateien zu lesen und zu schreiben, und zeigen, wie man den Zustand des externen Speichers vor der Nutzung überprüft.
Zu Beginn sollte ein neues Projekt in Android Studio erstellt werden. Wir nennen es "ExternalStorageFile", wählen die Standardoptionen für Phone & Tablet aus und entscheiden uns für eine leere Aktivität. Wir verwenden das gleiche Layout wie im vorherigen Rezept, sodass der Code einfach kopiert und eingefügt werden kann. Andernfalls kann das Layout aus dem ersten Schritt des vorherigen Rezepts verwendet werden, das sich mit dem Lesen und Schreiben einer Textdatei im internen Speicher befasst.
Um auf den externen Speicher zugreifen zu können, müssen wir zuerst die entsprechenden Berechtigungen in der AndroidManifest.xml hinzufügen. Dies stellt sicher, dass die App über die nötigen Rechte verfügt, um auf den externen Speicher zuzugreifen. Anschließend müssen in der Hauptaktivität (ActivityMain.java) globale Variablen definiert werden, die den Dateinamen und die EditText-Komponente enthalten.
Ein wesentlicher Bestandteil dieser Vorgehensweise ist die Prüfung der Verfügbarkeit des externen Speichers, um sicherzustellen, dass wir darauf zugreifen können. Dies geschieht mit den Methoden isExternalStorageWritable() und isExternalStorageReadable(). Die Methode isExternalStorageWritable() prüft, ob der externe Speicher im Status MEDIA_MOUNTED vorliegt, was bedeutet, dass er sowohl lesbar als auch beschreibbar ist. Die Methode isExternalStorageReadable() stellt sicher, dass der externe Speicher im Status MEDIA_MOUNTED oder MEDIA_MOUNTED_READ_ONLY ist, was bedeutet, dass wir Daten lesen können, selbst wenn sie nur schreibgeschützt sind.
Sobald diese Überprüfungen vorgenommen wurden, kann die Datei tatsächlich geschrieben oder gelesen werden. Das Schreiben einer Datei erfolgt über die Methode writeFile(), die überprüft, ob der externe Speicher beschreibbar ist, bevor sie versucht, die Datei zu erstellen. Sollte dies nicht der Fall sein, wird eine Fehlermeldung angezeigt. Beim Lesen der Datei mit der Methode readFile() wird eine ähnliche Überprüfung durchgeführt, wobei der Inhalt der Datei in einem StringBuilder gespeichert und schließlich in das EditText-Feld eingefügt wird.
Der Hauptunterschied zwischen dem Arbeiten mit internem und externem Speicher liegt in der Notwendigkeit, den Zustand des externen Speichers vor dem Zugriff zu überprüfen. Der eigentliche Vorgang des Lesens und Schreibens unterscheidet sich nicht wesentlich zwischen internem und externem Speicher. Der einzige Unterschied besteht darin, dass wir im Fall des externen Speichers den Pfad mit der Methode Environment.getExternalStorageDirectory() angeben müssen, anstatt ihn hart zu kodieren. Dies ist wichtig, da der Pfad zum externen Speicher je nach Android-Version und Gerätemodell variieren kann.
Ein weiterer wichtiger Punkt ist die Verwaltung von öffentlich zugänglichen Ordnern im externen Speicher. Die Methode getExternalStoragePublicDirectory() ermöglicht es, bestimmte öffentliche Ordner wie den Musik- oder Klingelton-Ordner zu erhalten. Diese Methode ist nützlich, wenn eine App mit Mediendateien interagieren muss, die in einem allgemein zugänglichen Ordner gespeichert sind.
Wie bei jedem Speicher ist auch beim externen Speicher der verfügbare Platz ein entscheidender Faktor. Durch die Verwendung der Methode getFreeSpace() können Entwickler sicherstellen, dass genug Speicherplatz vorhanden ist, bevor sie eine Datei speichern. Wenn der benötigte Speicherplatz nicht verfügbar ist, kann der Benutzer informiert werden, dass nicht genug Platz vorhanden ist, um die Datei zu speichern.
Die Verwaltung von Dateien geht jedoch über das einfache Lesen und Schreiben hinaus. Die File-Klasse stellt viele hilfreiche Methoden bereit, wie zum Beispiel das Löschen von Dateien. Sollte die Datei, die wir in unserem Beispiel erstellt haben, nicht mehr benötigt werden, kann sie mit der Methode delete() gelöscht werden. Darüber hinaus unterstützt die File-Klasse auch die Verwaltung von Verzeichnissen. Wenn neue Verzeichnisse erstellt oder bestehende Verzeichnisse entfernt werden müssen, können dies mit den Methoden mkdir() und delete() erfolgen.
In einigen Fällen möchten Entwickler verhindern, dass ihre Mediendateien in die Android-Galerie aufgenommen werden. Dies kann erreicht werden, indem eine leere .nomedia-Datei im selben Verzeichnis wie die Mediendateien platziert wird. Diese Maßnahme sorgt dafür, dass die Dateien von der Media Scanner-Software von Android ignoriert werden und nicht in den standardmäßigen System-Galerien erscheinen.
Zusätzlich zu den grundlegenden Dateioperationen bietet Android zwei Optionen, um Dateien in einem Projekt einzubinden: die raw- und Assets-Ordner. Die raw-Dateien werden im Ressourcenverzeichnis /res/raw gespeichert und können durch die Verwendung des Identifikators R.raw aufgerufen werden. Diese Option eignet sich gut für Medien wie MP3-, MP4- oder OGG-Dateien. Die Assets-Dateien hingegen sind im Dateisystem der APK-Datei gespeichert, und ihre Namen können zur Laufzeit dynamisch abgerufen werden. Dies ist besonders nützlich, wenn Dateien zur Laufzeit erstellt oder geändert werden müssen.
Der Zugriff auf den externen Speicher und die effiziente Verwaltung von Dateien ist also nicht nur eine grundlegende Fähigkeit für die App-Entwicklung, sondern auch ein wesentliches Element, um die Benutzererfahrung zu verbessern. Durch die ordnungsgemäße Handhabung des externen Speichers und durch das Verständnis seiner Funktionsweise können Entwickler Anwendungen erstellen, die sowohl zuverlässig als auch benutzerfreundlich sind.
Wie man zwischen Aktivitäten in Android wechselt und Daten überträgt
In der Welt der Android-Entwicklung sind Aktivitäten grundlegende Bausteine für die Benutzeroberfläche einer Anwendung. Jede Aktivität repräsentiert eine einzelne Bildschirmansicht und kann unabhängig voneinander gestartet und beendet werden. Das Wechseln zwischen Aktivitäten sowie das Übertragen von Daten zwischen ihnen ist eine der zentralen Aufgaben bei der Entwicklung interaktiver Anwendungen. Im Folgenden wird der Prozess erläutert, wie man eine zweite Aktivität erstellt und wie Daten zwischen zwei Aktivitäten übergeben werden.
Zunächst muss eine zweite Aktivität erstellt werden. Dazu öffnet man das Projekt in Android Studio und navigiert zu „File | New | Activity | Blank Activity“. Im daraufhin angezeigten Dialogfeld für die Anpassung der Aktivität kann der Name der neuen Aktivität entweder beibehalten oder geändert werden. Zum Beispiel könnte die zweite Aktivität „SecondActivity“ genannt werden, was sie von der ersten Aktivität „MainActivity“ unterscheidet. Nach der Erstellung der zweiten Aktivität wird es notwendig, die Logik für den Wechsel von der ersten zur zweiten Aktivität zu implementieren.
Im ersten Schritt wird die MainActivity.java-Datei geöffnet, und eine neue Methode hinzugefügt, um die zweite Aktivität zu starten:
Diese Methode nutzt ein „Intent“-Objekt, um eine neue Instanz der zweiten Aktivität zu starten. Ein „Intent“ ist ein Kommunikationsmittel zwischen verschiedenen Komponenten einer Android-Anwendung, das es ermöglicht, Aktivitäten zu starten oder Daten zwischen Aktivitäten zu übertragen.
Sobald diese Funktion in der MainActivity.java implementiert ist, geht es weiter mit der Erstellung des entsprechenden Layouts. In der activity_main.xml-Datei wird ein Button hinzugefügt, der beim Klicken die Methode onClickSwitchActivity aufruft und somit die zweite Aktivität öffnet. Wenn der Button nun betätigt wird, wird die zweite Aktivität angezeigt.
Nun ist es notwendig, eine Möglichkeit hinzuzufügen, die zweite Aktivität zu schließen und zur ersten zurückzukehren. Dies wird durch das Hinzufügen eines Buttons in der zweiten Aktivität erreicht. In der Datei SecondActivity.java wird eine neue Methode hinzugefügt:
Die Methode „finish()“ schließt die zweite Aktivität und kehrt zum vorherigen Bildschirm (der ersten Aktivität) zurück. In der layout-Datei der zweiten Aktivität (activity_second.xml) wird dann ein Button hinzugefügt, der diese Methode ausführt. Dadurch wird eine typische Situation in der realen Welt simuliert, bei der eine Aktivität gestartet, eine Aktion durchgeführt und die Aktivität anschließend geschlossen wird.
Es ist wichtig zu verstehen, dass das Schließen der Aktivität nicht automatisch zu einer bestimmten Aktivität zurückführt, sondern vielmehr der sogenannten „Back Stack“-Logik folgt, die von Android verwaltet wird. Android speichert die Reihenfolge der Aktivitäten im Hintergrund, sodass beim Drücken der Zurück-Taste die zuletzt aufgerufene Aktivität wiederhergestellt wird.
Ein weiterer Schritt, den viele Entwickler in ihre Anwendungen integrieren, ist die Übertragung von Daten zwischen Aktivitäten. Im vorliegenden Fall möchten wir Textdaten von der MainActivity zur SecondActivity übergeben. Dies geschieht über das „Intent“-Objekt, das es uns ermöglicht, zusätzliche Daten hinzuzufügen. Wir erweitern die onClickSwitchActivity-Methode, um Text aus einem EditText-Feld zu extrahieren und an die zweite Aktivität zu senden:
Das „putExtra()“-Verfahren des „Intent“-Objekts fügt die Daten als Key-Value-Paar hinzu. In diesem Fall verwenden wir „Intent.EXTRA_TEXT“ als Schlüssel, um den Text zu übergeben. Die zweite Aktivität kann dann auf diese Daten zugreifen, indem sie die Methode „getIntent()“ verwendet und den übergebenen Text abruft:
Dies stellt sicher, dass der übergebene Text in der zweiten Aktivität angezeigt wird. Der Schlüssel bei der Arbeit mit Datenübertragungen zwischen Aktivitäten ist es, den gleichen Schlüssel zu verwenden, wenn man auf die Daten zugreift. In diesem Fall haben wir „Intent.EXTRA_TEXT“ sowohl beim Hinzufügen der Daten als auch beim Abrufen der Daten verwendet.
Es ist erwähnenswert, dass die „Intent“-Klasse mehr als nur einfache String-Daten überträgt. Sie unterstützt auch die Übertragung anderer primitiver Datentypen wie Integer, Boolean und sogar komplexerer Objekte wie Arrays oder Serializable-Objekte. Dies bietet eine flexible Möglichkeit, nahezu jede Art von Daten zwischen Aktivitäten zu senden.
Ein weiterer wichtiger Aspekt ist, dass nicht nur einfache Daten zwischen Aktivitäten gesendet werden können. Die „Intent“-Klasse ermöglicht auch die Übertragung komplexerer Datentypen, wie etwa benutzerdefinierte Objekte oder Listen, indem man die Daten serialisiert. Diese Flexibilität ist besonders hilfreich, wenn eine Anwendung mit größeren Datensätzen oder spezifischeren Datenstrukturen arbeitet.
Das Verhalten von Aktivitäten in Android ist darauf ausgelegt, den Entwickler in die Lage zu versetzen, verschiedene Aufgaben zu organisieren, zu trennen und zu koordinieren. Jede Aktivität stellt ein eigenes Modul dar, das mit anderen Aktivitäten interagieren kann, um die Benutzererfahrung zu verbessern und gleichzeitig den Code zu strukturieren und übersichtlich zu halten. Das Wechseln zwischen Aktivitäten und die Übertragung von Daten ist daher ein fundamentales Konzept in der Android-Entwicklung und bildet die Grundlage für die meisten interaktiven Anwendungen.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский