Получение файла с другого устройства

Android Beam помещает полученные файлы в специальную директорию. Он также сканирует файлы медиа-сканером и добавляет найденные медиа-файлы в MediaStore провайдер. В уроке рассказывается, что делать после завершения копирования файлов и как найти полученные файлы на устройстве.

Отображение данных

После завершения передачи, Android Beam передает уведомление, включающее намерение с действием ACTION_VIEW, MIME тип и URI первого файла. При клике на уведомление, намерение отправляется в систему. Чтобы ваше приложение могло обработать это намерение, добавьте элемент <intent-filter> в элемент <activity> явления, которое должно отвечать на запрос. В элемент <intent-filter> добавьте следующие дочерние элементы:

<action android:name=”android.intent.action.VIEW” />
Указывает на действие ACTION_VIEW намерения.
<category android:name=”android.intent.category.CATEGORY_DEFAULT” />
Указывает, что намерение не относится к категории явных
<data android:mimeType=”mime-type” />
Указывает MIME тип. Указывайте только те типы, которые может обработать ваше приложение.

Пример фильтра намерений для явления com.example.android.nfctransfer.ViewActivity:

Примечание: передача файлов Android Beam это не единственный источник намерений с действием ACTION_VIEW. Другие приложения могут также передавать намерение с таким действием. Обработка подобных ситуаций обсуждается в разделе: Получение директории из URI данных

Запрос разрешения на файл

Чтобы прочитать принятый файл, необходимо запросить права на чтение READ_EXTERNAL_STORAGE, например:

Если вы хотите скопировать принятые файлы в собственное внешнее хранилище приложения, запросите права WRITE_EXTERNAL_STORAGE. Права на запись включают в себя также права и на чтение.

Примечание: на момент Android 4.2.2 (API 17) права на чтение внешнего хранилища запрашиваются по желанию пользователя. В будущих версиях платформы, права могут потребоваться во всех случаях. Поэтому просто добавьте запрос прав уже сейчас, чтобы не беспокоиться об этом в будущем.

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

Получаем директорию принятых файлов

Android Beam размещает все переданные за раз файлы в одну директорию. Намерение, которое передает Android Beam в уведомлении, содержит URI первого переданного файла. Однако не забывайте, что приложение может получить намерение с действием ACTION_VIEW не только от Android Beam, но и от других приложений. Чтобы решить как обрабатывать входящее намерение, необходимо проверить схему и authority.

Чтобы получить схему для URI, вызовите метод Uri.getScheme(). Следующий пример показывает как определить схему и соответствующий обработчик для URI:

Получение директории из URI типа file

Если входящее намерение включает URI со схемой file, этот URI включает в себя абсолютный путь до файла и его имя. Как было сказано ранее, в Android Beam все файлы текущий передачи находятся в одном и том же каталоге. Чтобы получить путь до каталога, необходимо взять полный путь из URI (URI это вся строка, кроме префикса file:). После этого используйте объект типа File, чтобы получит адрес каталога:

Получение директории из URI типа content

Если входящее намерение содержит URI типа content, директория и имя файла хранятся в поставщике содержимого MediaStore. Сделать вывод, что перед нами URI типа content можно проверив значение authority. URI типа content для провадера MediaStore может быть получено из Android Beam или любого другого приложения, но в обоих случаях вы можете получить директорию и имя файла для этого URI.

Вы можете также получить входящее намерение с действием ACTION_VIEW, включающее URI типа content для другого поставщика содержимого, помимо MediaStore. В данном случае URI не содержит значение authority для MediaStore и такой URI обычно не ссылается на директорию.

Примечание: в Android Beam вы получите URI типа content в том случае, если первый принятый файл имеет MIME тип “audio/*”, “image/*” или “video/*”, то есть является медиа-файлом. Android Beam индексирует все такие файлы с помощью медиа-сканера. Медиа-сканер записывает результаты индексации в поставщик данных MediaStore, а затем передает URI первого файла обратно в Android Beam. Это будет URI, который вы получили в уведомлении. Получить каталог первого файла можно из MediaStore, используя URI со схемой content.

Определение поставщика данных

Чтобы получить каталог из URI типа content, определите тип поставщика содержимого, связанного с URI, с помощью метода Uri.getAuthority(). Метод возвращает значение authority, которое означает следующее:

MediaStore.AUTHORITY
URI файла, который отслеживается MediaStore. Получите полный путь до файла из MediaStore, а директорию вычислите из это пути.
Любое другое значение authority
URI любого другого поставщика содержимого. Нельзя получить директорию по URI.

Чтобы получить директорию при поставщике содержимого MediaStore, выполните запрос, в котором укажите столбец MediaColumns.DATA, а в качестве аргумента передайте URI. Возвращенный курсор (Cursor) включает полный путь и имя файла для заданного URI. По этому пути расположены также остальные файлы, принятые вместе с текущим.

В следующем примере показано как проверить authority у URI и получить путь и имя файла:

Подробная информация о получении данных из поставщиков содержимого находится в разделе Получение данных от поставщиков

Добавить комментарий