Android developers often desire a way to present a user with a method of selecting a file from "external" storage. Android's Intent
system gives developers the ability to implicitly hook into other app's components, but if the user doesn't have a file explorer installed, the developer must instruct them to install one, or build one, themselves.
aFileChooser is an Android Library Project that simplifies this process.
Features:
- Streamlines the
Intent.ACTION_GET_CONTENT
Intent calling process - Provides a built-in file explorer
- Easily convert a URI into s java
File
object - Specify and determine MIME data types
- Easily retrieve image thumbnails for media files
- Follows Android conventions and is extremely simple to implement
Import aFileChooser and add it to your project as an Android Library Project. If you are unfamiliar with Android Library Projects, refer to the official documentation here.
Next, in your project, create an Activity
that extends
FileChooserActivity` and add it to your AndroidManifest.xml file.
Important The class extending FileChooserActivity
must have the intent-filter
set as seen bellow:
<activity
android:name=".FileChooserTestActivity"
android:label="Choose a file" >
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.OPENABLE" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
Note: The String
used for android:label
will be shown on the IntentChooser
dialog.
To initiate the file selection, simply call showFileChooser()
and listen for the selected file by overriding onFileSelect()
. E.g.:
public class FileChooserTestActivity extends FileChooserActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!isIntentGetContent()) {
showFileChooser();
}
}
@Override
protected void onFileSelect(File file) {
// Here you handle the file selection.
}
}
Important - FileChooserActivity
uses Intent.ACTION_GET_CONTENT
to show the embedded file explorer. Your Activity
must check the Intent
action
, to ensure that it is not ACTION_GET_CONTENT
.
public class FileChooserTestActivity extends FileChooserActivity {
// TAG for log messages.
private static final String TAG = "FileSelectorTestActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// We must check to ensure that the calling Intent is not Intent.ACTION_GET_CONTENT
if (!isIntentGetContent()) {
// Display the file chooser with all file types
showFileChooser("*/*");
}
}
@Override
protected void onFileSelect(File file) {
if (file != null) {
final Context context = getApplicationContext();
// Get the path of the Selected File.
final String path = file.getAbsolutePath();
Log.d(TAG, "File path: " + path);
// Get the MIME type of the Selected File.
final String mimeType = FileUtils.getMimeType(context, file);
Log.d(TAG, "File MIME type: " + mimeType);
// Get the Uri of the Selected File
// final Uri uri = Uri.fromFile(file);
// Get the thumbnail of the Selected File, if image/video
// final Bitmap bm = FileUtils.getThumbnail(context, uri, mimeType);
// Here you can return any data from above to the calling Activity
finish();
}
}
@Override
protected void onFileError(Exception e) {
Log.e(TAG, "File select error", e);
finish();
}
@Override
protected void onFileSelectCancel() {
Log.d(TAG, "File selections canceled");
finish();
}
@Override
protected void onFileDisconnect() {
Log.d(TAG, "External storage disconneted");
finish();
}
}
Paul Burke paulburke.co
Copyright 2012 Paul Burke
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.