Указать путь к папке

100
19 февраля 2022, 01:40

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

Может кто подскажет другие способы решения.

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");      //all files
// intent.setType("text/xml");   //XML file only
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
    startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"), a);
} catch (android.content.ActivityNotFoundException ex) {
    // Potentially direct the user to the Market with a Dialog
    Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}

UP!

Добился выбора файла и получения его пути. Но по прежнему не могу выбрать папку.

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");      //all files
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    try {
        startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"), REQUEST_CODE);
    } catch (android.content.ActivityNotFoundException ex) {
        // Potentially direct the user to the Market with a Dialog
        Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        Uri uri = data.getData();
        Toast.makeText(this, uri+"", Toast.LENGTH_SHORT).show();
    }
}
Answer 1

Для работы с файловым менеджером нужно использовать такую функцию как onActivityResult() сюда будут приходить данные о пути файла/папки на которую вы нажали, вот например:

public void startPickAFile(String title, String buttonText) {
    Intent intent = new Intent("org.openintents.action.PICK_FILE"); 
    intent.setData(dataUri); // A file URI for suggested file name or starting directory. Can also be left empty. 
    intent.putExtra("org.openintents.extra.TITLE", title); // String
    intent.putExtra("org.openintents.extra.BUTTON_TEXT", buttonText); // String
    if (intent.resolveActivity(getPackageManager()) != null) { 
      startActivityForResult(intent, REQUEST_CODE);
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { 
      // handle result
    }
}

дальше уже обрабатываете полученный путь так как вам нужно:

 Uri uri = data.getData();

Вот полезные источники:

  1. ссылка_1
  2. ссылка_2
  3. доки

UPDATE

Дальше все предельно просто, вам нужно проверять что именно пользователь выбрал - файл или папку:

File file = new File(path);
boolean exists =      file.exists();      // проверяем на наличие
boolean isDirectory = file.isDirectory(); // это папка?
boolean isFile =      file.isFile();      // это файл?

есть второй вариант:

Path file = new File(path).toPath();
boolean exists =      Files.exists(file);        // проверяем на наличие
boolean isDirectory = Files.isDirectory(file);   // это папка?
boolean isFile =      Files.isRegularFile(file); // это регулярный файл?

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

UPDATE_2.0

Для того чтобы выбрать именно папку есть такой способ:

Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
i.addCategory(Intent.CATEGORY_DEFAULT);
startActivityForResult(Intent.createChooser(i, "Choose directory"), 1);

и дальше обрабатываете:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
        case 1:
            Log.i("Test", "Result URI " + data.getData());
            break;
    }
}

этот способ должен вам подойти вероятнее всего.

Answer 2

Благодоря @Andrew и еще покопавшись в инете, нашел следующее решения для разных ситуаций:

Для выборки одного файла используем:

   Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
   intent.setType("*/*"); // тут можно задать тип файлов 

Если хотим выбрать несколько файлов - добавляем

intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);

А для выбора папки используем

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);

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

intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"), REQUEST_CODE);

Теперь можно перейти к обработчику.

Если мы выбирали 1 файл, то просто:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        Uri uri = data.getData();
        Log.e("!!!!!!!!!!!!!!!!", uri + "");            
    }
}

А если несколько, то надо обрабатывать массив. В примере я беру только 1ый элемент. А try-catch нужен для того, если вы выбрали 1 элемент, то происходит ошибка в ClipData a = data.getClipData(); поэтому если мы ее ловим - элемент один и можно использовать обычный Uri uri = data.getData();

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        Uri uri;
        try {
            ClipData a = data.getClipData();
            uri = a.getItemAt(0).getUri(); // тут только берется первый элемент!!! 
        } catch (Exception e) {
            uri = data.getData();
        }
        Log.e("!!!!!!!!!!!!!!!!", uri + "");
    }
}
READ ALSO
slack использование event api

slack использование event api

Не могу разобраться где взять "Request URL" для ивента, в задаче надо поприветствовать нового участника каналаИ похоже для этого, нужно подписать...

106
Как залить фоновый цвет в SVG изображении луны в процентах

Как залить фоновый цвет в SVG изображении луны в процентах

Я хочу, чтобы цвет фонового изображения SVG заполнялся постепенно, в процентах

86
Получить значение id из ссылки

Получить значение id из ссылки

Давайте перейдем сразу к сути) У меня есть директория console/indexphp

116
Работа php скрипта в промежутке даты

Работа php скрипта в промежутке даты

Подскажите пожалуйста как сделать , чтобы скрипт отрабатывал в промежуток даты 1512

93