Tôi đang sử dụng trình quản lý tệp của bên thứ ba để chọn tệp (trong trường hợp của tôi là PDF) từ hệ thống tệp.
Đây là cách tôi khởi chạy hoạt động:
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);
Đây là những gì tôi có trong 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);
}
}
}
}
Đoạn mã được mượn từ hướng dẫn Open Intents File Manager có sẵn tại đây:
http://www.openintents.org/en/node/829
Mục đích của if-elselà khả năng tương thích ngược. Tôi tự hỏi liệu đây có phải là cách tốt nhất để lấy tên tệp không vì tôi đã phát hiện ra rằng các trình quản lý tệp khác trả lại tất cả mọi thứ.
Ví dụ, Documents ToGo trả về một cái gì đó như sau:
content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf
trên đó getContentResolver().query()trả về null.
Để làm cho mọi thứ thú vị hơn, trình quản lý tệp không tên (tôi nhận được URI này từ nhật ký ứng dụng khách) đã trả lại một cái gì đó như:
/./sdcard/downloads/.bin
Có cách nào ưu tiên hơn để trích xuất tên tệp từ URI hay cách nào nên dùng đến phân tích cú pháp chuỗi không?