Android file chooser

AndroidFile UploadFile IoFilechooserAndroid Afilechooser

Android Problem Overview


I want to make a file uploader. And I hence I need a file chooser but I don't want to write this by myself. I find OI file manager and I think it suits me. But how can I force user to install OI file manager? If I cannot , is there a better way to include a file manager in my app? Thx

Android Solutions


Solution 1 - Android

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:

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

Solution 2 - Android

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBearView Question on Stackoverflow
Solution 1 - AndroidPaul BurkeView Answer on Stackoverflow
Solution 2 - AndroidandepView Answer on Stackoverflow