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 vonFile.getName()
zurückgegebenen Wert. SIZE
-
Die Größe der Datei in Byte als
long
. Dieser Wert entspricht dem vonFile.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: