Надо, чтобы пользователь указал путь к папке с файлами через визуальный файловый менеджер. Нашел следующий код. Но тут и не папка, а файлы. Да и я не могу понять, куда записывается сам путь.
Может кто подскажет другие способы решения.
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();
}
}
Для работы с файловым менеджером нужно использовать такую функцию как 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();
Вот полезные источники:
Дальше все предельно просто, вам нужно проверять что именно пользователь выбрал - файл или папку:
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); // это регулярный файл?
и дальше если это папка то вы проводите над ней действия по извлечению нужных вам файлов.
Для того чтобы выбрать именно папку есть такой способ:
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;
}
}
этот способ должен вам подойти вероятнее всего.
Благодоря @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 + "");
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Не могу разобраться где взять "Request URL" для ивента, в задаче надо поприветствовать нового участника каналаИ похоже для этого, нужно подписать...
Я хочу, чтобы цвет фонового изображения SVG заполнялся постепенно, в процентах
Давайте перейдем сразу к сути) У меня есть директория console/indexphp
Подскажите пожалуйста как сделать , чтобы скрипт отрабатывал в промежуток даты 1512