Trình chọn tệp Android [đã đóng]


115

Tôi muốn tạo một trình tải tệp lên. Và do đó tôi cần một trình chọn tệp nhưng tôi không muốn tự mình viết nó. Tôi tìm thấy trình quản lý tệp OI và tôi nghĩ nó phù hợp với tôi. Nhưng làm cách nào để buộc người dùng cài đặt trình quản lý tệp OI? Nếu tôi không thể, có cách nào tốt hơn để đưa trình quản lý tệp vào ứng dụng của mình không? Cám ơn




Câu trả lời:


267

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à UrionActivityResult()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.javalà:

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;
} 

1
Tôi thậm chí còn đi xa hơn nữa để hướng họ đến ứng dụng trên thị trường.
Kurtis Nusbaum

2
Nhưng tôi không thể tìm thấy FileUtils ....
Bear

2
@Bicou Cảm ơn bạn đã lưu ý. Sự thúc đẩy của bạn đã giúp tôi ngừng lười biếng và thực hiện một số thay đổi nhỏ. :-) Tôi vừa đẩy một bản cập nhật cho thư viện bao gồm giấy phép.
Paul Burke

22
Câu trả lời này không xem xét tiểu như thế này: "content: //com.android.providers.media.documents/document/image: 62".
wangqi060934

2
@ wangqi060934: làm thế nào bạn xoay sở để làm việc với tiểu như vậy? vui lòng chia sẻ kinh nghiệm của bạn để đạt được chức năng
Mehul Joisar

-3

Tôi đã sử dụng AndExplorer cho mục đích này và giải pháp của tôi là bật lên một hộp thoại và sau đó chuyển hướng trên thị trường để cài đặt ứng dụng bị lỗi:

StartCreation của tôi đang cố gắng gọi bộ chọn tệp / thư mục bên ngoài. Nếu nó bị thiếu, hãy hiển thị hàm installResultMessage.

private void startCreation(){
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_PICK);
    Uri startDir = Uri.fromFile(new File("/sdcard"));

    intent.setDataAndType(startDir,
            "vnd.android.cursor.dir/lysesoft.andexplorer.file");
    intent.putExtra("browser_filter_extension_whitelist", "*.csv");
    intent.putExtra("explorer_title", getText(R.string.andex_file_selection_title));
    intent.putExtra("browser_title_background_color",
            getText(R.string.browser_title_background_color));
    intent.putExtra("browser_title_foreground_color",
            getText(R.string.browser_title_foreground_color));
    intent.putExtra("browser_list_background_color",
            getText(R.string.browser_list_background_color));
    intent.putExtra("browser_list_fontscale", "120%");
    intent.putExtra("browser_list_layout", "2");

    try{
         ApplicationInfo info = getPackageManager()
                                 .getApplicationInfo("lysesoft.andexplorer", 0 );

            startActivityForResult(intent, PICK_REQUEST_CODE);
    } catch( PackageManager.NameNotFoundException e ){
        showInstallResultMessage(R.string.error_install_andexplorer);
    } catch (Exception e) {
        Log.w(TAG, e.getMessage());
    }
}

Điều này chỉ là chọn một hộp thoại và nếu người dùng muốn cài đặt ứng dụng bên ngoài từ thị trường

private void showInstallResultMessage(int msg_id) {
    AlertDialog dialog = new AlertDialog.Builder(this).create();
    dialog.setMessage(getText(msg_id));
    dialog.setButton(getText(R.string.button_ok),
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            });
    dialog.setButton2(getText(R.string.button_install),
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse("market://details?id=lysesoft.andexplorer"));
                    startActivity(intent);
                    finish();
                }
            });
    dialog.show();
}

Vì vậy, một trong những yêu cầu đối với người dùng ứng dụng của bạn là ... cài đặt AndExplorer ?!
Phantômaxx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.