{"id":21130322,"url":"https://github.com/passy/Android-DirectoryChooser","last_synced_at":"2025-07-09T01:33:15.461Z","repository":{"id":6295898,"uuid":"7530419","full_name":"passy/Android-DirectoryChooser","owner":"passy","description":"A directory chooser library for Android.","archived":false,"fork":false,"pushed_at":"2020-03-01T18:18:01.000Z","size":18397,"stargazers_count":516,"open_issues_count":23,"forks_count":144,"subscribers_count":28,"default_branch":"master","last_synced_at":"2024-10-30T06:58:25.884Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/passy.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-01-09T22:40:21.000Z","updated_at":"2024-10-27T14:11:06.000Z","dependencies_parsed_at":"2022-08-18T04:10:41.671Z","dependency_job_id":null,"html_url":"https://github.com/passy/Android-DirectoryChooser","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passy%2FAndroid-DirectoryChooser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passy%2FAndroid-DirectoryChooser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passy%2FAndroid-DirectoryChooser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/passy%2FAndroid-DirectoryChooser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/passy","download_url":"https://codeload.github.com/passy/Android-DirectoryChooser/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225476370,"owners_count":17480215,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-20T05:32:36.344Z","updated_at":"2024-11-20T05:32:45.365Z","avatar_url":"https://github.com/passy.png","language":"Java","funding_links":[],"categories":["Libs"],"sub_categories":["\u003cA NAME=\"Widget\"\u003e\u003c/A\u003eWidget"],"readme":"# Android DirectoryChooser\n\n[![Build Status](http://img.shields.io/travis/passy/Android-DirectoryChooser.svg?style=flat)](https://travis-ci.org/passy/Android-DirectoryChooser)\n[![Gittip](http://img.shields.io/gittip/passy.svg?style=flat)](https://www.gittip.com/passy/)\n![Maven Central](https://img.shields.io/maven-central/v/net.rdrei.android.dirchooser/library.svg)\n[![Stories in Ready](https://badge.waffle.io/passy/android-directorychooser.svg?label=ready\u0026title=Ready)](http://waffle.io/passy/android-directorychooser)\n[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-DirectoryChooser-blue.svg?style=flat)](http://android-arsenal.com/details/1/159)\n\nA simple directory chooser you can integrate into your Android app.\n\nThis version of the library has no additional dependencies, but requires Android\nv11+ to work. There is, however, [a pre-v11-branch][3] that supports down to v7\nusing ActionBarSherlock.\n\nYou can download the sample app from the Play Store:\n\n\u003ca href=\"https://play.google.com/store/apps/details?id=net.rdrei.android.dirchooser.sample\"\u003e\u003cimg alt=\"Get it on Google Play\" src=\"https://play.google.com/intl/en_us/badges/images/apps/en-play-badge.png\" height=\"45px\" /\u003e\u003c/a\u003e\n\nBased on the DirectoryChooser from the excellent\n[AntennaPod App](https://github.com/danieloeh/AntennaPod) by danieloeh.\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003cth\u003eAs stand-alone Activity\u003cbr\u003e\u003cimg src=\"assets/screenshots/chooser-activity.png\" width=\"40%\"\u003e\u003c/th\u003e\n\u003cth\u003eAs DialogFragment\u003cbr\u003e\u003cimg src=\"assets/screenshots/chooser-dialog.png\" width=\"40%\"\u003e\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n## Usage\n\nFor a full example see the `sample` app in the\n[repository](https://github.com/passy/Android-DirectoryChooser/tree/master/sample).\n\n### From Maven Central\n\nLibrary releases are available on Maven Central, snapshots can be retrieved\nfrom Sonatype:\n\n*Release (SDK 11+)*\n\n**Gradle**\n\n```groovy\ncompile 'net.rdrei.android.dirchooser:library:3.2@aar'\n```\n\n**Maven**\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003enet.rdrei.android.dirchooser\u003c/groupId\u003e\n  \u003cartifactId\u003elibrary\u003c/artifactId\u003e\n  \u003cversion\u003e3.2\u003c/version\u003e\n  \u003ctype\u003eaar\u003c/type\u003e\n\u003c/dependency\u003e\n```\n\n*Release (SDK 7+)*\n\n**Gradle**\n\n```groovy\ncompile 'net.rdrei.android.dirchooser:library:1.0-pre-v11@aar'\n```\n\n**Maven**\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003enet.rdrei.android.dirchooser\u003c/groupId\u003e\n  \u003cartifactId\u003elibrary\u003c/artifactId\u003e\n  \u003cversion\u003e1.0-pre-v11\u003c/version\u003e\n  \u003ctype\u003eaar\u003c/type\u003e\n\u003c/dependency\u003e\n```\n\n*Snapshot (SDK 11+)*\n\n```groovy\ncompile 'net.rdrei.android.dirchooser:library:3.2-SNAPSHOT@aar'\n```\n\n*Snapshot (SDK 4+)*\n\n```groovy\ncompile 'net.rdrei.android.dirchooser:library:2.0-pre-v11-SNAPSHOT@aar'\n```\n\n### As Library Project\n\nAlternatively, check out this repository and add it as a library project.\n\n```console\n$ git clone https://github.com/passy/Android-DirectoryChooser.git\n```\n\nImport the project into your favorite IDE and add\n`android.library.reference.1=/path/to/Android-DirectoryChooser/library` to your\n`project.properties`.\n\n### Manifest\n\nYou need to declare the `DirectoryChooserActivity` and request the\n`android.permission.WRITE_EXTERNAL_STORAGE` permission.\n\n```xml\n\u003cuses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" /\u003e\n...\n\u003capplication\u003e\n    \u003cactivity android:name=\"net.rdrei.android.dirchooser.DirectoryChooserActivity\" /\u003e\n\u003c/application\u003e\n```\n\n### Activity\n\nTo choose a directory, start the activity from your app logic:\n\n```java\n\nfinal Intent chooserIntent = new Intent(this, DirectoryChooserActivity.class);\n\nfinal DirectoryChooserConfig config = DirectoryChooserConfig.builder()\n        .newDirectoryName(\"DirChooserSample\")\n        .allowReadOnlyDirectory(true)\n        .allowNewDirectoryNameModification(true)\n        .build();\n\nchooserIntent.putExtra(DirectoryChooserActivity.EXTRA_CONFIG, config);\n\n// REQUEST_DIRECTORY is a constant integer to identify the request, e.g. 0\nstartActivityForResult(chooserIntent, REQUEST_DIRECTORY);\n```\n\nHandle the result in your `onActivityResult` method:\n\n```java\n@Override\nprotected void onActivityResult(int requestCode, int resultCode, Intent data) {\n    super.onActivityResult(requestCode, resultCode, data);\n\n    if (requestCode == REQUEST_DIRECTORY) {\n        if (resultCode == DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED) {\n            handleDirectoryChoice(data\n                .getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR));\n        } else {\n            // Nothing selected\n        }\n    }\n}\n```\n\n### Fragment\n\nYou can also use the underlying DialogFragment for even better integration.\nWhether you use the Fragment as a Dialog or not is completely up to you. All you\nhave to do is implement the `OnFragmentInteractionListener` interface to respond\nto the events that a directory is selected or the user cancels the dialog:\n\n```java\npublic class DirChooserFragmentSample extends Activity implements\n    DirectoryChooserFragment.OnFragmentInteractionListener {\n\n    private TextView mDirectoryTextView;\n    private DirectoryChooserFragment mDialog;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.dialog);\n        final DirectoryChooserConfig config = DirectoryChooserConfig.builder()\n                .newDirectoryName(\"DialogSample\")\n                .build();\n        mDialog = DirectoryChooserFragment.newInstance(config);\n\n        mDirectoryTextView = (TextView) findViewById(R.id.textDirectory);\n\n        findViewById(R.id.btnChoose)\n                .setOnClickListener(new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        mDialog.show(getFragmentManager(), null);\n                    }\n                });\n    }\n\n    @Override\n    public void onSelectDirectory(@NonNull String path) {\n        mDirectoryTextView.setText(path);\n        mDialog.dismiss();\n    }\n\n    @Override\n    public void onCancelChooser() {\n        mDialog.dismiss();\n    }\n}\n\n```\n\nIf calling the directory chooser from your own fragment, be sure to set the target fragment first:\n\n```java\n@Override\npublic void onClick(View v) {\n    mDialog.setTargetFragment(this, 0);\n    mDialog.show(getFragmentManager(), null);\n}\n```\n\n### Configuration\n\nThe Directory Chooser is configured through a parcelable configuration object, which is great\nbecause it means that you don't have to tear your hair out over finicky string extras. Instead,\nyou get auto-completion and a nice immutable data structure. Here's what you can configure:\n\n#### `newDirectoryName` : String (required)\n\nName of the directory to create. User can change this name when he creates the\nfolder. To avoid this use `allowNewDirectoryNameModification` argument.\n\n#### `initialDirectory` : String (default: \"\")\n\nOptional argument to define the path of the directory that will be shown first.\nIf it is not sent or if path denotes a non readable/writable directory or it is not a directory,\nit defaults to `android.os.Environment#getExternalStorageDirectory()`.\n\n#### `allowReadOnlyDirectory` : Boolean (default: false)\n\nArgument to define whether or not the directory chooser allows read-only paths to be chosen. If it\nfalse only directories with read-write access can be chosen.\n\n#### `allowNewDirectoryNameModification` : Boolean (default: false)\n\nArgument to define whether or not the directory chooser allows modification of provided new\ndirectory name.\n\n#### Example\n\n```java\nfinal DirectoryChooserConfig config = DirectoryChooserConfig.builder()\n        .newDirectoryName(\"DialogSample\")\n        .allowNewDirectoryNameModification(true)\n        .allowReadOnlyDirectory(true)\n        .initialDirectory(\"/sdcard\")\n        .build();\n```\n\n## Apps using this\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            \u003ca href=\"https://git.popcorntime.io/popcorntime/android\"\u003e\n                \u003cimg src=\"https://raw.githubusercontent.com/passy/Android-DirectoryChooser/master/assets/logos/popcorntime.png\"\n                    title=\"Popcorn Time for Android\"\n                    alt=\"Popcorn Time for Android\"\u003e\n                \u003cdiv\u003ePopcorn Time for Android\u003c/div\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003ca href=\"https://play.google.com/store/apps/details?id=com.mb.android\"\u003e\n                \u003cimg src=\"https://raw.githubusercontent.com/passy/Android-DirectoryChooser/master/assets/logos/emby.png\"\n                    title=\"Emby for Android\"\n                    alt=\"Emby for Android\"\u003e\n                \u003cdiv\u003eEmby for Android\u003c/div\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003ca href=\"https://github.com/passy/scdl\"\u003e\n                \u003cimg src=\"https://raw.githubusercontent.com/passy/Android-DirectoryChooser/master/assets/logos/scdl.png\"\n                    title=\"Downloader for SoundCloud\"\n                    alt=\"Downloader for SoundCloud\"\u003e\n                \u003cdiv\u003eDownloader for SoundCloud\u003c/div\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003ca href=\"https://play.google.com/store/apps/details?id=de.j4velin.wallpaperChanger\"\u003e\n                \u003cimg src=\"https://raw.githubusercontent.com/passy/Android-DirectoryChooser/master/assets/logos/wallpaperchanger.png\"\n                    title=\"Wallpaper Changer\"\n                    alt=\"Wallpaper Changer\"\u003e\n                \u003cdiv\u003eWallpaper Changer\u003c/div\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003ca href=\"https://play.google.com/store/apps/details?id=com.xnview.XnRetro\"\u003e\n                \u003cimg src=\"https://raw.githubusercontent.com/passy/Android-DirectoryChooser/master/assets/logos/xnretro.png\"\n                    title=\"XnRetro\"\n                    alt=\"XnRetro\"\u003e\n                \u003cdiv\u003eXnRetro\u003c/div\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003ca href=\"https://play.google.com/store/apps/details?id=bml.prods.instasave\"\u003e\n                \u003cimg src=\"https://raw.githubusercontent.com/passy/Android-DirectoryChooser/master/assets/logos/instasave.png\"\n                    title=\"InstaSave - Instagram Save\"\n                    alt=\"InstaSave - Instagram Save\"\u003e\n                \u003cdiv\u003eInstaSave\u003c/div\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\n            \u003ca href=\"https://github.com/javiersantos/MLManager\"\u003e\n                \u003cimg src=\"https://raw.githubusercontent.com/passy/Android-DirectoryChooser/master/assets/logos/mlmanager.png\"\n                    title=\"ML Manager - App manager\"\n                    alt=\"ML Manager - App manager\"\u003e\n                \u003cdiv\u003eML Manager\u003c/div\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003ca href=\"https://play.google.com/store/apps/details?id=com.hovans.autoguard\"\u003e\n                \u003cimg src=\"https://raw.githubusercontent.com/passy/Android-DirectoryChooser/master/assets/logos/autoguard.png\"\n                    title=\"AutoGuard - Dash Cam\"\n                    alt=\"AutoGuard - Dash Cam\"\u003e\n                \u003cdiv\u003eAutoGuard\u003c/div\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003ca href=\"https://github.com/adithya321/Companion-for-Band\"\u003e\n                \u003cimg src=\"https://raw.githubusercontent.com/passy/Android-DirectoryChooser/master/assets/logos/CompanionForBand.png\"\n                    title=\"Companion for Band\"\n                    alt=\"Companion for Band\"\u003e\n                \u003cdiv\u003eCompanion for Band\u003c/div\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003ca href=\"https://github.com/sdabhi23/Swallow-Server\"\u003e\n                \u003cimg src=\"https://i.imgur.com/kTFWJV8.png\"\n                    title=\"Swallow Server\"\n                    alt=\"Swallow Server\"\u003e\n                \u003cdiv\u003eSwallow Server\u003c/div\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n            \u003ca href=\"https://play.google.com/store/apps/details?id=com.levionsoftware.instagram_map\"\u003e\n                \u003cimg src=\"https://lh3.googleusercontent.com/yYw3NvqPcq8AF1hz0_JGWd9YbVTYS7HyvkcdiBaNMcZFoXhkkLS_t8NbYWf4-fp1g_0=s250\"\n                    title=\"Photo Map\"\n                    alt=\"Photo Map\"\u003e\n                \u003cdiv\u003ePhoto Map\u003c/div\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\nTo add your own app, please send a pull request.\n\n## Releasing\n\n*Preparation*\n\nTo release a new snapshot on Maven Central, add your credentials to\n`~/.gradle/gradle.properties` (you get them from http://oss.sonatype.org) as\nwell as your signing GPG key:\n\n```\nsigning.keyId=0x18EEA4AF\nsigning.secretKeyRingFile=/home/pascal/.gnupg/secring.gpg\n\nNEXUS_USERNAME=username\nNEXUS_PASSWORD=password\n```\n\n*Staging*\n\nTo upload a new snapshot, just run gradle's `uploadArchives` command:\n\n```\ngradle :library:uploadArchives\n```\n\n*Release*\n\nUpdate versions and remove `-SNAPSHOT` suffixes.\n\n```\ngradle build :library:uploadArchives\n```\n\n## License\n\n```text\nCopyright 2013-2016 Pascal Hartig\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n\n## Thanks\n\nSample App icon by [Frank Souza](http://franksouza183.deviantart.com/).\n\n [3]: https://github.com/passy/Android-DirectoryChooser/tree/pre-v11\n [4]: https://play.google.com/store/apps/details?id=net.rdrei.android.dirchooser.sample\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpassy%2FAndroid-DirectoryChooser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpassy%2FAndroid-DirectoryChooser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpassy%2FAndroid-DirectoryChooser/lists"}