Wie man einen Dateimanager für Android 15 minutes erstellt

Mit Android ist es möglich, Apps sehr schnell zu erstellen. Das klingt wie ein Werbeversprechen, oder? Wir lassen es auf einen Versuch ankommen und prfen, ob das wirklich stimmt! Wir werden einen Android-Dateimanager erstellen.

Beginnen wir mit der Erstellung einer Standard-“Hello World”-App, die aus einer Layout-Datei und einer passenden Aktivität bestehen wird. Da wir bereits wissen, was wir erstellen, nennen wir das Layout activity_list_files.xml und die Activity ListFileActivity. Wenn man mit Android Studio entwickelt, erscheint der Standard-Layout-Editor und zeigt die “Hello World”-App an. Jetzt ersetzen wir das Default-Layouts durch den folgenden Code:

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
  android:layout_width="match_parent" android:layout_height="match_parent">
  <ListView android:id="@android:id/list" android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

Jetzt haben wir ein sehr einfaches Layout, das nur aus einem einzigen Element besteht, einer ListView. Die ListView wird die Komponente sein, die unsere Dateien anzeigt. Mehr brauchen wir auch nicht. Um die View mit Daten zu befüllen kommt unsere Aktivität ins Spiel.

public class ListFileActivity extends ListActivity {

  private String path;

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

    // Use the current directory as title
    path = "/";
    if (getIntent().hasExtra("path")) {
      path = getIntent().getStringExtra("path");
    }
    setTitle(path);

    // Read all files sorted into the values-array
    List values = new ArrayList();
    File dir = new File(path);
    if (!dir.canRead()) {
      setTitle(getTitle() + " (inaccessible)");
    }
    String[] list = dir.list();
    if (list != null) {
      for (String file : list) {
        if (!file.startsWith(".")) {
          values.add(file);
        }
      }
    }
    Collections.sort(values);

    // Put the data into the list
    ArrayAdapter adapter = new ArrayAdapter(this,
        android.R.layout.simple_list_item_2, android.R.id.text1, values);
    setListAdapter(adapter);
  }

  @Override
  protected void onListItemClick(ListView l, View v, int position, long id) {
    String filename = (String) getListAdapter().getItem(position);
    if (path.endsWith(File.separator)) {
      filename = path + filename;
    } else {
      filename = path + File.separator + filename;
    }
    if (new File(filename).isDirectory()) {
      Intent intent = new Intent(this, ListFileActivity.class);
      intent.putExtra("path", filename);
      startActivity(intent);
    } else {
      Toast.makeText(this, filename + " is not a directory", Toast.LENGTH_LONG).show();
    }
  }
}

Schauen wir uns die Aktivität einmal genauer an. Zunächst einmal zum Kerngedanken, der hinter dieser Aktivität steht: Die Aktivität zeigt alle Dateien innerhalb eines bestimmten Pfades an. Wenn wir den Pfad wechseln, wechseln wir zu einer neuen Aktivität, die alle Dateien innerhalb des gewählten Pfades anzeigt. Einfach, oder? Um das zu erreichen, erweitern wir die ListActivity, die uns Methoden wie getListAdapter(), setListAdapter() und onListItemClick() zur Verfügung stellt, um mit der Liste in unserem Layout zu interagieren. Wenn also unsere Activity von Android gestartet wird und onCreate aufgerufen wird, ist das Erste, was wir tun (nach dem Setzen des Layouts): Den Pfad als Titel unserer Activity setzen. Im nächsten Schritt werden wir alle Dateien aus dem angegebenen Pfad lesen, aber es gibt einen Haken: Android sperrt einige Pfade für den Zugriff durch Apps. Das ist gewollt und notwendig, um zu verhindern, dass sich Apps gegenseitig ausspionieren (der “/data”-Ordner zum Beispiel enthält alle Datenbanken der Apps, einschließlich sensiblen Daten wie gespeicherten Anmeldedaten). Aus diesem Grund fügen wir dem Titel einen Hinweis hinzu und müssen überprüfen, ob File.list() tatsächlich ein Array zurückgibt. Die Javadoc besagt, daß nur Null zurückgegeben wird, wenn die Methode auf eine Datei aufgerufen wird, aber das gilt auch für unzugängliche Verzeichnisse.

Der untere Teil von onCreate ist ebenfalls relevant. Dort wird unser Datenadapter erstellt? Wir benutzen Androids ArrayAdapter, der es uns erlaubt, eine Liste zu übergeben und ihm mitzuteilen, wie er sie darstellen soll. Wirklich einfach und daher für viele Zwecke geeignet. Schließlich wird der onListItemClick eine neue Instanz unserer ListFileActivity starten, um einen weiteren Ordner anzuzeigen. Wenn man den Zurück-Knopf drückt, gelangt man zum vorherigen Ordner zurück, also der vorherigen Aktivität.

Die Erstellung eines sehr einfachen Dateibrowsers ist in sehr kurzer Zeit und mit nur wenigen Zeilen Code möglich. Natürlich lässt sich die App noch verbessern (z.B. wie ein wirkliches UX Konzept), aber es gibt bereits sehr gute Dateibrowser im Google Play Store (und es würde weit mehr als 15 Minuten dauern, deren Funktionen nachzuahmen).

Vielen Dank an Simeon M. und Laurent T. für den Hinweis auf kleinere Tippfehler!

Copyright © christophbrill.de, 2002-2025.