Dosya bilgilerini alma

Bir istemci uygulaması, içerik URI'sine sahip olduğu bir dosyayla çalışmaya başlamadan önce sunucu uygulamasından dosya hakkında bilgi istemesi (dosyanın veri türü ve dosya boyutu. Veri türü, istemci uygulamasının dosyayı işleyip işleyemediğini belirlemesine yardımcı olur ve dosya boyutu, istemci uygulamasının dosya için arabelleğe alma ve önbelleğe alma ayarlarını yapmasına yardımcı olur.

Bu ders, sunucu uygulamasının Dosyanın MIME türünü ve boyutunu almak için FileProvider.

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 belirtir. Şunları almak için: içerik URI'sine göre paylaşılan bir dosyanın veri türü; istemci uygulaması ContentResolver.getType() Bu yöntem, dosyanın MIME türüne göre değişir. Varsayılan olarak FileProvider, dosyanın MIME türünü dosya adı uzantısı.

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

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ı, varsayılan olarak şunu döndüren query() yöntemi: bir içerik URI'sıyla ilişkilendirilmiş dosyanın adı ve boyutu Cursor. Varsayılan uygulama iki sütun döndürür:

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

İstemci uygulaması, tümünü ayarlayarak bir dosya için hem DISPLAY_NAME hem de SIZE alabilir query() , İçerik URI'si hariç null. Örneğin, bu kod snippet'i bir dosyanın DISPLAY_NAME ve SIZE ve her birini ayrı 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)));
    ...

Daha fazla ilgili bilgi için aşağıdaki kaynakları inceleyebilirsiniz: