Pemilih file Android [ditutup]

115

Saya ingin membuat pengunggah file. Dan karena itu saya membutuhkan pemilih file tetapi saya tidak ingin menulis ini sendiri. Saya menemukan pengelola file OI dan menurut saya itu cocok untuk saya. Tetapi bagaimana saya bisa memaksa pengguna untuk menginstal manajer file OI? Jika saya tidak bisa, apakah ada cara yang lebih baik untuk menyertakan pengelola file di aplikasi saya? Terima kasih

Beruang
sumber

Jawaban:

267

EDIT ( 02 Jan 2012 ):

Saya membuat Proyek Perpustakaan Android open source kecil yang menyederhanakan proses ini, sambil juga menyediakan penjelajah file bawaan (jika pengguna tidak memiliki satu hadiah). Ini sangat mudah digunakan, hanya membutuhkan beberapa baris kode.

Anda dapat menemukannya di GitHub: aFileChooser .


ASLI

Jika Anda ingin pengguna dapat memilih file apa pun di sistem, Anda perlu menyertakan pengelola file Anda sendiri, atau menyarankan pengguna untuk mendownloadnya. Saya yakin hal terbaik yang dapat Anda lakukan adalah mencari konten yang "dapat dibuka" dengan cara Intent.createChooser()seperti ini:

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

Anda kemudian akan mendengarkan file yang dipilih adalah Uridi onActivityResult()seperti:

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

The getPath()metode dalam saya FileUtils.javayaitu:

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;
} 
Paul Burke
sumber
1
Saya bahkan melangkah lebih jauh dengan mengarahkan mereka ke aplikasi di pasar.
Kurtis Nusbaum
2
Tetapi saya tidak dapat menemukan FileUtils ....
Beruang
2
@Bicou Terima kasih atas catatannya. Dorongan Anda membantu saya berhenti malas dan membuat beberapa perubahan kecil. :-) Saya baru saja mendorong pembaruan ke perpustakaan yang menyertakan lisensi.
Paul Burke
22
Jawaban ini tidak mempertimbangkan uri seperti ini: "content: //com.android.providers.media.documents/document/image: 62".
wangqi060934
2
@ wangqi060934: bagaimana Anda bisa bekerja dengan uri seperti itu? tolong bagikan pengalaman Anda untuk mencapai fungsi tersebut
Mehul Joisar
-3

Saya menggunakan AndExplorer untuk tujuan ini dan solusi saya adalah memunculkan dialog dan kemudian mengarahkan ulang ke pasar untuk menginstal aplikasi yang terlewat:

StartCreation saya mencoba memanggil pemilih file / direktori eksternal. Jika tidak ada panggilan tampilkan fungsi 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());
    }
}

Metode ini hanya mengambil dialog dan jika pengguna ingin menginstal aplikasi eksternal dari pasar

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();
}
andep
sumber
Jadi, salah satu persyaratan untuk pengguna aplikasi Anda adalah ... menginstal AndExplorer ?!
Phantômaxx