Skip to content

SteadfastInnovation/NoNonsense-FilePicker

 
 

Repository files navigation

NoNonsense-FilePicker

Flattr this

  • Extendable for other sources
  • Can select multiple items
  • Directories or files
  • Create directory in the picker

Yet another file picker library?

I needed a file picker that had two primary properties:

  1. Easy to extend: I needed a file picker that would work for normal files on the SD-card, and also for using the Dropbox Sync API.
  2. Able to create a directory in the picker.

This project has both of those qualities. As a bonus, it also scales nicely to work on any phone or tablet. The core is placed in abstract classes so it is easy and clear how to extend the picker to create your own.

The library includes an implementation that allows the user to pick files from the SD-card. But the picker could easily be extended to get its file listings from another source, such as Dropbox, FTP, SSH and so on.

By inheriting from an Activity, the picker is able to be rendered as full screen on small screens and as a dialog on large screens. It does this through the theme system, so it is very important for the activity to use the correct theme.

How to include in your project (with Gradle)

Just add the dependency to your build.gradle:

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    compile 'com.nononsenseapps:filepicker:+'
}

That will make sure you are using the latest version at all times.

How to include with Maven:

Something like this should work:

<dependency>
  <groupId>com.nononsenseapps</groupId>
  <artifactId>filepicker</artifactId>
  <version>1.1.3</version>
  <type>aar</type>
</dependency>

What next?

That’s up to you. The whole point is for the library to be extendable. But if you just want a picker and don’t have any special requirements, read on for info on how to use the provided SD-card file picker.

Include permission in your manifest

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Include the file picker activity

You must set the theme on the activity. You can subclass it to customize but it is required. The intent filter is optional depending on your use case.

<activity
   android:name="com.nononsenseapps.filepicker.FilePickerActivity"
   android:label="@string/app_name"
   android:theme="@style/FilePicker.Theme">
   <intent-filter>
      <action android:name="android.intent.action.GET_CONTENT" />
      <category android:name="android.intent.category.DEFAULT" />
   </intent-filter>
</activity>

Starting the picker in your app

// This always works
Intent i = new Intent(context, FilePickerActivity.class);
// This works if you defined the intent filter
// Intent i = new Intent(Intent.ACTION_GET_CONTENT);

// Set these depending on your use case. These are the defaults.
i.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false);
i.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, false);
i.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_FILE);

startActivityForResult(i, FILE_CODE);

Handling the result

If you have a minimum requirement of Jelly Bean (API 16) and above, you can skip the second method.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == FILE_CODE && resultCode == Activity.RESULT_OK) {
        if (data.getBooleanExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false)) {
            // For JellyBean and above
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                ClipData clip = data.getClipData();

                if (clip != null) {
                    for (int i = 0; i < clip.getItemCount(); i++) {
                        Uri uri = clip.getItemAt(i).getUri();
                        // Do something with the URI
                    }
                }
            // For Ice Cream Sandwich
            } else {
                ArrayList<String> paths = data.getStringArrayListExtra
                            (FilePickerActivity.EXTRA_PATHS);

                if (paths != null) {
                    for (String path: paths) {
                        Uri uri = Uri.parse(path);
                        // Do something with the URI
                    }
                }
            }

        } else {
            Uri uri = data.getData();
            // Do something with the URI
        }
    }
}

Not using Gradle yet?

Time to start! To convert your current Eclipse project, have a look at my brief explanation: http://cowboyprogrammer.org/convert-to-android-studio-and-gradle-today/

About

A file/directory-picker for android. Implemented as a library project.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 100.0%