ก่อนที่แอปไคลเอ็นต์จะพยายามทำงานกับไฟล์ที่มี 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))); ...
ดูข้อมูลที่เกี่ยวข้องเพิ่มเติมได้ที่