Dosya bilgilerini alma

Bir istemci uygulaması, içerik URI'si olan bir dosyayla çalışmaya başlamadan önce uygulama, sunucu uygulamasından dosya hakkında, dosyanın veri türü ve dosya boyutu gibi bilgiler isteyebilir. Veri türü, istemci uygulamasının dosyayı işleyip işleyemediğini belirlemesine yardımcı olur. Dosya boyutu ise istemci uygulamasının dosya için arabelleğe alma ve önbelleğe alma ayarlarını yapmasına yardımcı olur.

Bu derste, bir dosyanın MIME türünü ve boyutunu almak için sunucu uygulamasının FileProvider etiketinin nasıl sorgulanacağı gösterilmektedir.

Bir dosyanın MIME türünü alma

Bir dosyanın veri türü, istemci uygulamasına dosyanın içeriğini nasıl işlemesi gerektiğini bildirir. İstemci uygulaması, içerik URI'sına göre paylaşılan bir dosyanın veri türünü almak için ContentResolver.getType() yöntemini çağırır. Bu yöntem dosyanın MIME türünü döndürür. FileProvider, varsayılan olarak dosyanın MIME türünü dosya adı uzantısından belirler.

Aşağıdaki kod snippet'i, sunucu uygulaması istemciye içerik URI'sını döndürdüğünde istemci uygulamasının, bir dosyanın MIME türünü nasıl aldığını gösterir:

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

Dosyanın adını ve boyutunu alma

FileProvider sınıfı, Cursor içindeki bir içerik URI'siyle ilişkilendirilmiş dosyanın adını ve boyutunu döndüren varsayılan query() yöntemine sahiptir. Varsayılan uygulama iki sütun döndürür:

DISPLAY_NAME
String olarak dosyanın adı. Bu değer, File.getName() tarafından döndürülen değerle aynıdır.
SIZE
long olarak belirtilen dosyanın bayt cinsinden boyutu. Bu değer, File.length() tarafından döndürülen değerle aynıdır

İstemci uygulaması, içerik URI'si haricinde tüm query() bağımsız değişkenlerini null olarak ayarlayarak bir dosya için hem DISPLAY_NAME hem de SIZE öğelerini alabilir. Örneğin, bu kod snippet'i bir dosyanın DISPLAY_NAME ve SIZE öğelerini alır ve her birini ayrı TextView içinde görüntüler:

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

İlgili daha fazla bilgi için aşağıdaki konulara bakın: