Dateiinformationen abrufen

Bevor eine Clientanwendung versucht, mit einer Datei zu arbeiten, für die sie einen Inhalts-URI enthält, kann sie Informationen zur Datei von der Serveranwendung anfordern, einschließlich des Datentyps und der Dateigröße. Anhand des Datentyps kann die Clientanwendung feststellen, ob sie die Datei verarbeiten kann. Die Dateigröße hilft der Clientanwendung beim Einrichten der Zwischenspeicherung und des Cachings für die Datei.

In dieser Lektion wird gezeigt, wie Sie den FileProvider der Serveranwendung abfragen, um den MIME-Typ und die Größe einer Datei abzurufen.

MIME-Typ einer Datei abrufen

Der Datentyp einer Datei gibt für die Client-App an, wie sie mit dem Dateiinhalt umgehen soll. Die Client-App ruft ContentResolver.getType() auf, um den Datentyp einer freigegebenen Datei anhand ihres Inhalts-URI abzurufen. Diese Methode gibt den MIME-Typ der Datei zurück. Standardmäßig bestimmt eine FileProvider den MIME-Typ der Datei anhand ihrer Dateiendung.

Das folgende Code-Snippet zeigt, wie eine Clientanwendung den MIME-Typ einer Datei abruft, nachdem die Serveranwendung den Inhalts-URI an den Client zurückgegeben hat:

Kotlin

    ...
    /*
     * Get the file's content URI from the incoming Intent, then
     * get the file's MIME type
     */
    val mimeType: String? = returnIntent.data?.let { returnUri ->
        contentResolver.getType(returnUri)
    }
    ...

Java

    ...
    /*
     * Get the file's content URI from the incoming Intent, then
     * get the file's MIME type
     */
    Uri returnUri = returnIntent.getData();
    String mimeType = getContentResolver().getType(returnUri);
    ...

Name und Größe einer Datei abrufen

Die Klasse FileProvider hat eine Standardimplementierung der Methode query(), die den Namen und die Größe der Datei zurückgibt, die einem Inhalts-URI in einem Cursor zugeordnet ist. Die Standardimplementierung gibt zwei Spalten zurück:

DISPLAY_NAME
Der Name der Datei als String-Wert. Dieser Wert entspricht dem von File.getName() zurückgegebenen Wert.
SIZE
Die Größe der Datei in Byte als long. Dieser Wert entspricht dem von File.length() zurückgegebenen Wert.

Die Client-App kann sowohl das DISPLAY_NAME als auch das SIZE für eine Datei abrufen, indem alle Argumente von query() mit Ausnahme des Inhalts-URI auf null gesetzt werden. Mit diesem Code-Snippet werden beispielsweise die DISPLAY_NAME und SIZE einer Datei abgerufen und jeweils im separaten TextView angezeigt:

Kotlin

    /*
     * Get the file's content URI from the incoming Intent,
     * then query the server app to get the file's display name
     * and size.
     */
    returnIntent.data?.let { returnUri ->
        contentResolver.query(returnUri, null, null, null, null)
    }?.use { cursor ->
        /*
         * Get the column indexes of the data in the Cursor,
         * move to the first row in the Cursor, get the data,
         * and display it.
         */
        val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
        val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)
        cursor.moveToFirst()
        findViewById<TextView>(R.id.filename_text).text = cursor.getString(nameIndex)
        findViewById<TextView>(R.id.filesize_text).text = cursor.getLong(sizeIndex).toString()
        ...
    }

Java

    ...
    /*
     * Get the file's content URI from the incoming Intent,
     * then query the server app to get the file's display name
     * and size.
     */
    Uri returnUri = returnIntent.getData();
    Cursor returnCursor =
            getContentResolver().query(returnUri, null, null, null, null);
    /*
     * Get the column indexes of the data in the Cursor,
     * move to the first row in the Cursor, get the data,
     * and display it.
     */
    int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
    int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
    returnCursor.moveToFirst();
    TextView nameView = (TextView) findViewById(R.id.filename_text);
    TextView sizeView = (TextView) findViewById(R.id.filesize_text);
    nameView.setText(returnCursor.getString(nameIndex));
    sizeView.setText(Long.toString(returnCursor.getLong(sizeIndex)));
    ...

Weitere Informationen finden Sie hier: