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ść doFile.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: