Pobieranie informacji o pliku

Zanim aplikacja kliencka spróbuje pracować z plikiem, który ma identyfikator URI treści, może żądania informacji o pliku z aplikacji serwera, w tym typu danych pliku rozmiar pliku. Typ danych pomaga aplikacji klienckiej określić, czy potrafi obsłużyć plik. rozmiar pliku pomaga aplikacji klienckiej skonfigurować buforowanie i buforowanie pliku.

Z tej lekcji dowiesz się, jak wysłać zapytanie do serwera aplikacji serwera FileProvider, aby pobrać typ i rozmiar MIME pliku.

Pobieranie typu MIME pliku

Typ danych pliku wskazuje aplikacji klienckiej, w jaki sposób powinna obsługiwać zawartość pliku. Aby uzyskać typ danych udostępnianego pliku zgodnie z jego identyfikatorem URI treści, aplikacja kliencka wywołuje ContentResolver.getType() Ta metoda zwraca typ MIME pliku. Domyślnie FileProvider określa typ MIME pliku na podstawie .

Ten fragment kodu pokazuje, jak aplikacja kliencka pobiera typ MIME pliku raz aplikacja serwera zwróciła do klienta identyfikator URI treści:

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);
    ...

Pobieranie nazwy i rozmiaru pliku

Klasa FileProvider ma domyślną implementację funkcji query(), która zwraca nazwę i rozmiar pliku powiązanego z identyfikatorem URI treści w Cursor Domyślna implementacja zwraca 2 kolumny:

DISPLAY_NAME
Nazwa pliku, np. String. Ta wartość jest taka sama jak zwracana wartość do File.getName().
SIZE
Rozmiar pliku w bajtach (long). Ta wartość jest taka sama jak wartość. zwrócone przez: File.length()

Aplikacja kliencka może otrzymywać zarówno DISPLAY_NAME, jak i SIZE dla pliku, ustawiając wszystkie z argumentów query() do null oprócz identyfikatora URI treści. Na przykład ten fragment kodu pobiera DISPLAY_NAME i SIZE i wyświetla każdą z nich w osobnym wierszu TextView:

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)));
    ...

Dodatkowe informacje znajdziesz tutaj: