Открытие меню выбора файлов при нажатии на кнопку

222
04 апреля 2018, 11:10

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

Answer 1

Можно использовать платформу доступа к хранилищу (Storage Access Framework) Платформа SAF облегчает пользователям поиск и открытие документов, изображений и других файлов в хранилищах всех поставщиков, с которыми они работают. Вот пример функции по открытию окна выбора файла из хранилища, её можно вызвать при нажатии на кнопку:

public void performFileSearch() {
 // Создаём новый интент для доступа к хранилищу
 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
 // Фильтруем результаты на те, которые можно "открыть"
 intent.addCategory(Intent.CATEGORY_OPENABLE);
 // Показываем только картинки (ещё один фильтр)
 intent.setType("image/*");
 // запускаем интент
 startActivityForResult(intent, READ_REQUEST_CODE);
}

Обработка результатов:

@Override
public void onActivityResult(int requestCode, int resultCode,
    Intent resultData) {
if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK)  {
     // возвращаем URI нужного документа
     Uri uri = null;
     if (resultData != null) {
         uri = resultData.getData();
         Log.i(TAG, "Uri: " + uri.toString());
         showImage(uri); //функция для показа документа (реализуйте сами)
     }
 }
}

Источник.

Answer 2

Очень абстрактный вопрос. Но самый простой способ получить доступ к файлу на Android - это использовать Intent.

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setType("*/*");
startActivityForResult(Intent.createChooser(intent, "Выберите файлы с помощью..."), REQUEST_TAKE_DOCUMENTS);

Запуская этот код из Activity вы можете получить ответ в переопределённом методе:

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
 super.onActivityResult(requestCode, resultCode, data);
 if(resultCode == Activity.RESULT_OK)
 {
  switch(requestCode)
  {
   case REQUEST_TAKE_DOCUMENTS:
...
   return;
  }
 }
}

В данном случае в объекте data будут данные об одном файле:

Uri uri = data.getData();

Или о группе выбранных файлов:

ClipData clipData = data.getClipData();
READ ALSO
Получение объекта через sender

Получение объекта через sender

Если я создаю сокет

272
SimpleTable - шаблонный класс для создания таблиц в консоли

SimpleTable - шаблонный класс для создания таблиц в консоли

Я тут сделал небольшой проект на С++, и хотел поделиться с вами, вдруг вам понадобится создавать таблицу в консоли

204
Установка OGRE 3D

Установка OGRE 3D

Добрый деньПомогите установить графический движок OGRE под Visual Studio 2017 или (в идеале) под CLion 2017

215