ฉันใช้ตัวจัดการไฟล์ของบุคคลที่สามเพื่อเลือกไฟล์ (PDF ในกรณีของฉัน) จากระบบไฟล์
นี่คือวิธีเปิดกิจกรรม:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(getString(R.string.app_pdf_mime_type));
intent.addCategory(Intent.CATEGORY_OPENABLE);
String chooserName = getString(R.string.Browse);
Intent chooser = Intent.createChooser(intent, chooserName);
startActivityForResult(chooser, ActivityRequests.BROWSE);
นี่คือสิ่งที่ฉันมีในonActivityResult:
Uri uri = data.getData();
if (uri != null) {
if (uri.toString().startsWith("file:")) {
fileName = uri.getPath();
} else { // uri.startsWith("content:")
Cursor c = getContentResolver().query(uri, null, null, null, null);
if (c != null && c.moveToFirst()) {
int id = c.getColumnIndex(Images.Media.DATA);
if (id != -1) {
fileName = c.getString(id);
}
}
}
}
ข้อมูลโค้ดยืมมาจากคำแนะนำOpen Intents File Manager ที่มีอยู่ที่นี่:
http://www.openintents.org/en/node/829
จุดประสงค์if-elseคือความเข้ากันได้แบบย้อนกลับ ฉันสงสัยว่านี่เป็นวิธีที่ดีที่สุดในการรับชื่อไฟล์หรือไม่เนื่องจากฉันพบว่าตัวจัดการไฟล์อื่น ๆ ส่งคืนทุกสิ่ง
ตัวอย่างเช่นDocuments ToGo จะส่งคืนสิ่งต่อไปนี้:
content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf
ซึ่งผลตอบแทนgetContentResolver().query()
เพื่อให้สิ่งต่างๆน่าสนใจยิ่งขึ้นตัวจัดการไฟล์ที่ไม่มีชื่อ (ฉันได้รับ URI นี้จากบันทึกไคลเอนต์) ส่งคืนสิ่งที่ต้องการ:null
/./sdcard/downloads/.bin
มีวิธีที่ดีกว่าในการแยกชื่อไฟล์จาก URI หรือวิธีหนึ่งควรใช้การแยกวิเคราะห์สตริง