Как выбрать папку в андроиде?

Привет, есть способ выбрать папку, в которой пользователь хочет сохранить файл в Android. Я проверяю http://code.google.com/p/android-file-dialog/

у него есть функциональность для выбора файла, но я хочу выбрать папку, пожалуйста, предоставьте мне полезную ссылку или примеры.


person Sushant Bhatnagar    schedule 21.12.2011    source источник
comment
вы можете создать каталог программно   -  person Nikunj Patel    schedule 21.12.2011
comment
Я предлагаю вам создать свой собственный сборщик файлов/папок и вызвать его с намерениями. Это немного утомительно, но вы контролируете свой код и можете вызывать его из своих будущих приложений. В противном случае ищите сторонний файловый менеджер, у которого есть общедоступный API через намерения.   -  person Mister Smith    schedule 21.12.2011


Ответы (4)


Я использовал тот же источник в своем приложении (почти уверен), и есть блок кода:

protected void onListItemClick(ListView l, View v, int position, long id) {
    if (file.isDirectory()) {
        selectButton.setEnabled(false);
        if (file.canRead()) {
            lastPositions.put(currentPath, position);
            getDir(path.get(position));
        } else {
            new AlertDialog.Builder(this)
                    .setIcon(R.drawable.icon)
                    .setTitle(
                            "[" + file.getName() + "] "
                                    + getText(R.string.cant_read_folder))
                    .setPositiveButton("OK",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which) {

                                }
                            }).show();
        }
    } else {
        selectedFile = file;
        v.setSelected(true);
        selectButton.setEnabled(true);
    }
}

Вам просто нужно отредактировать, как он обрабатывает if (file.isDirectory()). Я бы рекомендовал объявить значение boolean в вашей деятельности, которое вы меняете на true, если файл является каталогом, и он уже является ложным. Затем, если указанное значение истинно, перейдите в каталог. Также, когда вы измените указанное значение на true, вам нужно будет вызвать selectButton.setEnabled(true). Я бы сказал, что это будет намного проще, чем создание собственного кода.

person Reed    schedule 21.12.2011
comment
если (file.isDirectory()) {selectedFile = файл; v.setSelected (истина); selectButton.setEnabled (истина); if (file.canRead()) { lastPositions.put(currentPath, position); getDir(path.get(position));} else {new AlertDialog.Builder(this) .setIcon(R.drawable.icon).setTitle([ + file.getName() +] + getText(R.string.cant_read_folder) ) .setPositiveButton(ОК, новый DialogInterface.OnClickListener() { public void onClick(диалог DialogInterface, int which) { } }).show();} } else { v.setSelected(false); selectButton.setEnabled(false);} - person Sushant Bhatnagar; 21.12.2011
comment
Я изменил функцию, как указано выше, но я хочу выбрать папку вместо файла, она возвращает предыдущий каталог, когда я пересекаю иерархию каталогов. - person Sushant Bhatnagar; 21.12.2011

Как насчет использования Файлового менеджера OI? Это приложение имеет следующие намерения: PICK_FILE, PICK_DIRECTORY. На странице даже есть пример кода для использования намерений.

person seeker    schedule 16.01.2012
comment
Я думаю, что вопрос направлен на интегрированное решение, а не на использование внешнего приложения. - person Marek Sebera; 04.08.2013

Ознакомьтесь с этим ответом https://stackoverflow.com/a/28479561/779140 Я упомянут автор библиотеки, поэтому не стесняйтесь задавать любые вопросы.

person Ruslan Yanchyshyn    schedule 12.02.2015

Я столкнулся с той же проблемой и в итоге использую NoNonsense-FilePicker

Добавить в файл градиента

скомпилировать 'com.nononsenseapps:filepicker:4.0.0'

Триггер выбора файла/папки/директории

try {

                    Utils.makeHepticFeedback(getActivity());

                    Intent selectDirectoyIntent = new Intent(getActivity(), FilePickerActivity.class);
                    selectDirectoyIntent.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false);
                    selectDirectoyIntent.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, true);
                    selectDirectoyIntent.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_DIR);
                    selectDirectoyIntent.putExtra(FilePickerActivity.EXTRA_START_PATH, Environment.getExternalStorageDirectory().getPath());
                    startActivityForResult(selectDirectoyIntent, FILE_CODE);

                } catch (Exception e) {
                    Log.e(LOG_TAG, "exception", e);
                    e.printStackTrace();

                    Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_SHORT).show();
                }   

Обработать результат действия, чтобы получить выбранный файл или файлы

 @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            if (resultCode == Activity.RESULT_OK && requestCode == CHOOSE_IMAGE_REQUEST_CODE) {
                Uri selectedImageUri = data.getData();
                String selectedImagePath = getRealPathFromURI(selectedImageUri);


                // NOW WE HAVE OUR WANTED STRING
                if (selectedImagePath != null) {
                    System.out
                            .println("selectedImagePath is the right one for you!");

                    PreferenceHelper.getPreferenceHelperInstance().setString(getActivity(),
                            PreferenceHelper.PLAYER_BACKGROUND,
                            selectedImageUri.toString());

                    Glide.with(getActivity()).load(Uri.parse(
                            PreferenceHelper.getPreferenceHelperInstance().getString(getActivity(),
                                    PreferenceHelper.PLAYER_BACKGROUND
                                    , AppConstants.DEFAULT_BACKGROUND_URL))).
                            into((ImageView) ButterKnife.findById(getActivity(), R.id.play_back));

                }
            } else if (requestCode == FILE_CODE && resultCode == Activity.RESULT_OK) {

                if (null != data && !data.getBooleanExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false)) {
                    // The URI will now be something like content://PACKAGE-NAME/root/path/to/file
                    Uri uri = data.getData();
                    // A utility method is provided to transform the URI to a File object
                    File file = com.nononsenseapps.filepicker.Utils.getFileForUri(uri);
                    // If you want a URI which matches the old return value, you can do
                    Uri fileUri = Uri.fromFile(file);
                    // Do something with the result...

                    Snackbar.make(fileFormat, "Recording folder updated to" + fileUri.getPath() + " ¯\\_(ツ)_/¯ ", Snackbar.LENGTH_SHORT).show();

                    AppConfig.RECORDING_FOLDER = fileUri.getPath();

                    PreferenceHelper.getPreferenceHelperInstance().setString(getActivity(), PreferenceHelper.RECORDING_FOLDER, AppConfig.RECORDING_FOLDER);

                    setUpSettingValue();

                } else {

                    // Handling multiple results is one extra step
                    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
                            File file = com.nononsenseapps.filepicker.Utils.getFileForUri(uri);
                            // If you want a URI which matches the old return value, you can do
                            Uri fileUri = Uri.fromFile(file);
                            // Do something with the result...

                            Toast.makeText(getActivity(), "Selected dir" + fileUri.getPath(), Toast.LENGTH_SHORT).show();


                        }
                    }
                }
            }

        }
person Hitesh Sahu    schedule 09.03.2017
comment
Utils.makeHepticFeedback(getActivity()); метод не найден. Если я прокомментирую это, я получу исключение java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.app/com.nononsenseapps.filepicker.FilePickerActivity}: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class ImageButton Есть идеи? - person Nagabhushan S N; 14.02.2018
comment
Utils.makeHepticFeedback(getActivity()) — это метод, который заставляет устройство вибрировать и дает кнопке ощущение, что она не имеет ничего общего со средством выбора файлов. Вы можете это прокомментировать. Похоже, проблема с пользовательским интерфейсом а> - person Hitesh Sahu; 22.02.2018