Pick any kind of file via an Intent in Android
Not for camera but for other files..
In my device I have ES File Explorer
installed and This simply thing works in my case..
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
How to Select File on android using Intent
the type of a file is .txt
Then use text/plain
as a MIME type. As Ian Lake noted in a comment, file/*
is not a valid MIME type.
Beyond that, delete getRealPathFromURI()
(which will not work). There is no path, beyond the Uri
itself. You can read in the contents identified by this Uri
by calling openInputStream()
on a ContentResolver
, and you can get a ContentResolver
by calling getContentResolver()
on your Activity
.
Restricting selectable file types via intent in Android
Pass multiple MIME types separate with |
like
i.setType("image/*|application/pdf|audio/*");
or create an array of MIME types like
String[] mimetypes = {"image/*", "application/*|text/*"};
and pass it as
i.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
Select File from file manager via Intent
You can use this:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE);
For samsung devices to open file manager use this:
Intent intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
intent.putExtra("CONTENT_TYPE", "*/*");
intent.addCategory(Intent.CATEGORY_DEFAULT);
For more reference checkout http://developer.android.com/guide/topics/providers/document-provider.html
Implementing a File Picker in Android and copying the selected file to another location
STEP 1 - Use an Implicit Intent
:
To choose a file from the device, you should use an implicit Intent
Intent chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
chooseFile.setType("*/*");
chooseFile = Intent.createChooser(chooseFile, "Choose a file");
startActivityForResult(chooseFile, PICKFILE_RESULT_CODE);
STEP 2 - Get the absolute file path:
To get the file path from a Uri
, first, try using
Uri uri = data.getData();
String src = uri.getPath();
where data
is the Intent
returned in onActivityResult()
.
If that doesn't work, use the following method:
public String getPath(Uri uri) {
String path = null;
String[] projection = { MediaStore.Files.FileColumns.DATA };
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
if(cursor == null){
path = uri.getPath()
}
else{
cursor.moveToFirst();
int column_index = cursor.getColumnIndexOrThrow(projection[0]);
path = cursor.getString(column_index);
cursor.close();
}
return ((path == null || path.isEmpty()) ? (uri.getPath()) : path);
}
At least one of these two methods should get you the correct, full path.
STEP 3 - Copy the file:
What you want, I believe, is to copy a file from one location to another.
To do this, it is necessary to have the absolute file path of both the source and destination locations.
First, get the absolute file path using either my getPath()
method or uri.getPath()
:
String src = getPath(uri); /* Method defined above. */
or
Uri uri = data.getData();
String src = uri.getPath();
Then, create two File
objects as follows:
File source = new File(src);
String filename = uri.getLastPathSegment();
File destination = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/CustomFolder/" + filename);
where CustomFolder
is the directory on your external drive where you want to copy the file.
Then use the following method to copy a file from one place to another:
private void copy(File source, File destination) {
FileChannel in = new FileInputStream(source).getChannel();
FileChannel out = new FileOutputStream(destination).getChannel();
try {
in.transferTo(0, in.size(), out);
} catch(Exception){
// post to log
} finally {
if (in != null)
in.close();
if (out != null)
out.close();
}
}
Try this. This should work.
Note: Vis-a-vis Lukas' answer - what he has done is use a method called openInputStream()
that returns the content of a Uri
, whether that Uri
represents a file or a URL.
Another promising approach - the FileProvider
:
There is one more way through which it is possible to get a file from another app. If an app shares its files through the FileProvider
, then it is possible to get hold of a FileDescriptor
object which holds specific information about this file.
To do this, use the following Intent
:
Intent mRequestFileIntent = new Intent(Intent.ACTION_GET_CONTENT);
mRequestFileIntent.setType("*/*");
startActivityForResult(mRequestFileIntent, 0);
and in your onActivityResult()
:
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent returnIntent) {
// If the selection didn't work
if (resultCode != RESULT_OK) {
// Exit without doing anything else
return;
} else {
// Get the file's content URI from the incoming Intent
Uri returnUri = returnIntent.getData();
/*
* Try to open the file for "read" access using the
* returned URI. If the file isn't found, write to the
* error log and return.
*/
try {
/*
* Get the content resolver instance for this context, and use it
* to get a ParcelFileDescriptor for the file.
*/
mInputPFD = getContentResolver().openFileDescriptor(returnUri, "r");
} catch (FileNotFoundException e) {
e.printStackTrace();
Log.e("MainActivity", "File not found.");
return;
}
// Get a regular file descriptor for the file
FileDescriptor fd = mInputPFD.getFileDescriptor();
...
}
}
where mInputPFD
is a ParcelFileDescriptor
.
References:
1. Common Intents - File Storage.
2. FileChannel
.
3. FileProvider
.
4. Requesting a Shared File.
select only specific file type using intent.getContent method
Try
intent.setType("audio/mpeg");
or
intent.setType("audio/mp3");
or try like this
Intent intent = null;
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
intent = new Intent(Intent.ACTION_GET_CONTENT);
}else {
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
}
// The MIME data type filter
intent.setType("audio/*")
Related Topics
Determine Addaction Click for Android Notifications
Setting Drawable Folder to Use for Different Resolutions
How to Put Media Controller Button on Notification Bar
Error Strictmode$Androidblockguardpolicy.Onnetwork
How to Scale/Resize Text to Fit a Textview
How to Make My App Receive Broadcast When Other Applications Are Installed or Removed
Get Context of Popupmenu Like Contextmenu
Best Practice for Nested Fragments in Android 4.0, 4.1 (<4.2) Without Using the Support Library
Bypass Android Usb Host Permission Confirmation Dialog
Android Webview "Tel:" Links Show Web Page Not Found
How to Check If Url Is Valid in Android
Why Use Android Picasso Library to Download Images
Android: Set Color of Checkbox
Error Inflating Class Android.Support.V7.Widget.Toolbar
Android.Content.Context.Getpackagename()' on a Null Object Reference