Отправка файла на другое устройство

В этом уроке мы рассмотрим как передавать большие файлы на другое устройство, используя Android Beam. Для отправки файлов нужно получить разрешение на использование NFC и внешнего хранилища, убедиться, что устройство поддерживает NFC и предоставить URI файлов.

Механизм передачи файлов Android Beam имеет следующие требования:

  1. Android Beam для передачи больших файлов доступен только начиная с Android 4.1 (API 16).
  2. Файлы для передачи должны находиться на внешнем хранилище. Больше об этом читайте в разделе Внешнее хранилище
  3. Каждый файл, который вы хотите передать, должен быть доступен для чтения всем. Установить такие права на чтение можно с помощью метода File.setReadable(true, false).
  4. Необходимо предоставить URI файла со схемой file, который вы хотите передать. Android Beam не может работать с URI типа content, сгенерированного с помощью метода FileProvider.getUriForFile.

Добавляем функцию в манифест

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

Требуемые разрешения

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

NFC
Разрешает приложению отправлять данные через NFC. Чтобы добавить разрешение, необходимо добавить в элемент <manifest> дочерний:
READ_EXTERNAL_STORAGE
Разрешает приложению читать из внешнего хранилища. Добавьте дочерний тег в элемент <manifest>:

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

Добавляем функции NFC

Добавьте дочерний элемент <uses-feature> в <manifest>, чтобы включить использование NFC приложением. Установите атрибут android:required равным true, чтобы указать, что приложение не будет работать, если NFC отсутствует.

Элемент <uses-feature> может выглядеть так:

Если ваше приложение использует NFC в качестве дополнительной опции и прекрасно работает без него, установите атрибут android:required равным false и проверяйте наличие NFC в коде.

Добавляем функцию передачи файлов Android Beam

Android Beam доступен с версии Android 4.1 (API 16), поэтому если использование Android Beam для передачи файлов является ключевой функцией вашего приложения, установите атрибут android:minSdkVersion="16".

Проверяем поддержку передачи файлов Android Beam

Чтобы указать, что использование NFC является опциональным, используйте следующий код:

Если вы установили атрибут android:required="false", проверяйте поддержку NFC программно.

Чтобы программно проверить поддержку Android Beam для передачи файлов, вызовите метод PackageManager.hasSystemFeature() с аргументом FEATURE_NFC. Затем проверьте значение SDK_INT. Если передача файлов Android Beam поддерживается, получите экземпляр NFC контроллера. Например так:

Создание метода обратного вызова для передачи файлов

После проверки поддержки Android Beam, создайте метод обратного вызова, который система будет вызывать при попытке передать файл через NFC. Этот метод будет возвращать массив Uri объектов. Android Beam передаст файлы по указанным Uri на другое устройство.

Чтобы добавить метод обратного вызова, реализуйте интерфейс NfcAdapter.CreateBeamUrisCallback и метод createBeamUris(). Пример, как это сделать:

После реализации интерфейса, передайте экземпляр созданного класса в метод setBeamPushUrisCallback(). Например:

Примечание: можно также напрямую передавать URI в NFC фреймворк из вашего приложения с помощью экземпляра класса NfcAdapter. Этот способ подходит для случаев, когда вы хотите создать URI до того, как произойдет касание NFC устройств. Подробнее об этом в разделе NfcAdapter.setBeamPushUris().

Выбираем файлы для отправки

Для передачи одного или нескольких файлов на другое устройство с NFC, получите файловые URI (со схемой file) для каждого файла и добавьте их в массив Uri объектов. Также для передачи нужны постоянные права на чтение файла. Например, получим URI из имени файла и добавим его в массив:

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