CHỈNH SỬA ( 02 tháng 1 năm 2012 ):
Tôi đã tạo một Dự án Thư viện Android mã nguồn mở nhỏ để hợp lý hóa quy trình này, đồng thời cung cấp trình khám phá tệp tích hợp sẵn (trong trường hợp người dùng không có trình khám phá). Nó cực kỳ đơn giản để sử dụng, chỉ cần một vài dòng mã.
Bạn có thể tìm thấy nó tại GitHub: aFileChooser .
NGUYÊN
Nếu bạn muốn người dùng có thể chọn bất kỳ tệp nào trong hệ thống, bạn sẽ cần bao gồm trình quản lý tệp của riêng mình hoặc khuyên người dùng tải xuống một tệp. Tôi tin rằng điều tốt nhất bạn có thể làm là tìm kiếm nội dung "có thể mở được" ở dạng Intent.createChooser()
như sau:
private static final int FILE_SELECT_CODE = 0;
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a File to Upload"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
// Potentially direct the user to the Market with a Dialog
Toast.makeText(this, "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}
}
Sau đó bạn sẽ nghe cho các tập tin được lựa chọn là Uri
ở onActivityResult()
như vậy:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
Log.d(TAG, "File Uri: " + uri.toString());
// Get the path
String path = FileUtils.getPath(this, uri);
Log.d(TAG, "File Path: " + path);
// Get the file instance
// File file = new File(path);
// Initiate the upload
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
Các getPath()
phương pháp trong tôi FileUtils.java
là:
public static String getPath(Context context, Uri uri) throws URISyntaxException {
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = { "_data" };
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow("_data");
if (cursor.moveToFirst()) {
return cursor.getString(column_index);
}
} catch (Exception e) {
// Eat it
}
}
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}