การดึงข้อมูลไฟล์

ก่อนที่แอปไคลเอ็นต์จะพยายามทำงานกับไฟล์ที่มี URI เนื้อหา แอปสามารถ ขอข้อมูลเกี่ยวกับไฟล์จากแอปเซิร์ฟเวอร์ รวมถึงประเภทข้อมูลของไฟล์และ ขนาดไฟล์ ประเภทข้อมูลจะช่วยให้แอปไคลเอ็นต์พิจารณาว่าจะจัดการกับไฟล์ได้หรือไม่ และ ขนาดไฟล์จะช่วยให้แอปไคลเอ็นต์ตั้งค่าการบัฟเฟอร์และแคชไฟล์ได้

บทเรียนนี้จะสาธิตวิธีค้นหาแอปของเซิร์ฟเวอร์ FileProvider เพื่อเรียกข้อมูลประเภทและขนาด MIME ของไฟล์

ดึงข้อมูลประเภท MIME ของไฟล์

ประเภทข้อมูลของไฟล์จะเป็นตัวบอกให้แอปไคลเอ็นต์ทราบว่าไฟล์ควรจัดการกับเนื้อหาของไฟล์อย่างไร โดยวิธีการมีดังนี้ ประเภทข้อมูลของไฟล์ที่แชร์ตาม URI เนื้อหา การเรียกใช้แอปไคลเอ็นต์ ContentResolver.getType() เมธอดนี้จะส่งคืน ประเภท MIME ของไฟล์ โดยค่าเริ่มต้น แอตทริบิวต์ FileProvider ระบุประเภท MIME ของไฟล์จาก นามสกุลไฟล์

ข้อมูลโค้ดต่อไปนี้จะแสดงให้เห็นว่าแอปไคลเอ็นต์เรียกไฟล์ประเภท MIME เพียงครั้งเดียว แอปเซิร์ฟเวอร์แสดงผล URI เนื้อหาไปยังไคลเอ็นต์แล้ว

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

ดึงข้อมูลชื่อและขนาดของไฟล์

คลาส FileProvider มีการใช้งานการตั้งค่าเริ่มต้น query() ที่แสดงผล ชื่อและขนาดของไฟล์ที่เชื่อมโยงกับ URI เนื้อหาใน Cursor การใช้งานเริ่มต้นจะแสดง 2 คอลัมน์ดังนี้

DISPLAY_NAME
ชื่อไฟล์ที่เป็น String ค่านี้เหมือนกับค่าที่แสดงผล โดย File.getName()
SIZE
ขนาดของไฟล์ในหน่วยไบต์ ในรูปแบบ long ค่านี้จะเหมือนกับค่า File.length() ส่งคืน

แอปไคลเอ็นต์สามารถรับทั้ง DISPLAY_NAME และ SIZE สำหรับไฟล์โดยการตั้งค่าทั้งหมด ของอาร์กิวเมนต์ของ query() ไปยัง null ยกเว้น URI เนื้อหา ตัวอย่างเช่น ข้อมูลโค้ดนี้จะดึงส่วน DISPLAY_NAME และ SIZE และแสดงแต่ละรายการแยกกัน 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)));
    ...

ดูข้อมูลที่เกี่ยวข้องเพิ่มเติมได้ที่