Android file chooser [closed] Android file chooser [closed] android android

Android file chooser [closed]


EDIT (02 Jan 2012):

I created a small open source Android Library Project that streamlines this process, while also providing a built-in file explorer (in case the user does not have one present). It's extremely simple to use, requiring only a few lines of code.

You can find it at GitHub: aFileChooser.


ORIGINAL

If you want the user to be able to choose any file in the system, you will need to include your own file manager, or advise the user to download one. I believe the best you can do is look for "openable" content in an Intent.createChooser() like this:

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

You would then listen for the selected file's Uri in onActivityResult() like so:

@Overrideprotected 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() method in my FileUtils.java is:

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


I used AndExplorer for this purpose and my solution is popup a dialog and then redirect on the market to install the misssing application:

My startCreation is trying to call external file/directory picker. If it is missing call show installResultMessage function.

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

This methos is just pick up a dialog and if user wants install the external application from market

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