Android 6.0 ( M ) предлагает новые функции для пользователей и разработчиков приложений. Этот документ представляет собой введение в наиболее известные API.
Начать разработку
Чтобы начать создавать приложения для Android 6.0, сначала необходимо получить Android SDK . Затем с помощью SDK Manager загрузите платформу Android 6.0 SDK и образы системы.
Обновите целевой уровень API
Чтобы лучше оптимизировать свое приложение для устройств под управлением Android, установите для targetSdkVersion
значение "23"
, установите приложение в образ системы Android, протестируйте его, а затем опубликуйте обновленное приложение с этим изменением.
Вы можете использовать API Android, одновременно поддерживая более старые версии, добавив в свой код условия, которые проверяют уровень системного API перед выполнением API, не поддерживаемых вашим minSdkVersion
. Чтобы узнать больше о обеспечении обратной совместимости, прочтите раздел «Поддержка различных версий платформы» .
Дополнительные сведения о том, как работают уровни API, см. в статье Что такое уровень API?
Аутентификация по отпечатку пальца
В этом выпуске предлагаются новые API, позволяющие аутентифицировать пользователей с помощью сканирования их отпечатков пальцев на поддерживаемых устройствах. Используйте эти API в сочетании с системой Android Keystore .
Чтобы аутентифицировать пользователей с помощью сканирования отпечатков пальцев, получите экземпляр нового класса FingerprintManager
и вызовите метод authenticate()
. Ваше приложение должно быть запущено на совместимом устройстве со сканером отпечатков пальцев. Вы должны реализовать пользовательский интерфейс для процесса аутентификации по отпечатку пальца в своем приложении и использовать стандартный значок отпечатка пальца Android в своем пользовательском интерфейсе. Значок отпечатка пальца Android ( c_fp_40px.png
) включен в образец биометрической аутентификации . Если вы разрабатываете несколько приложений, использующих аутентификацию по отпечатку пальца, обратите внимание, что каждое приложение должно проверять подлинность отпечатка пальца пользователя независимо.
Чтобы использовать эту функцию в своем приложении, сначала добавьте разрешение USE_FINGERPRINT
в свой манифест.
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
![Мобильный телефон с функцией аутентификации по отпечатку пальца](https://developer.android.com/static/images/android-6.0/fingerprint-screen.png?authuser=0000&hl=ru)
Чтобы увидеть реализацию аутентификации по отпечатку пальца в приложении, обратитесь к примеру биометрической аутентификации . Демонстрацию того, как можно использовать эти API аутентификации в сочетании с другими API Android, см. в видео API отпечатков пальцев и платежей .
Если вы тестируете эту функцию, выполните следующие действия:
- Установите Android SDK Tools версии 24.3, если вы этого еще не сделали.
- Зарегистрируйте новый отпечаток пальца в эмуляторе, выбрав «Настройки» > «Безопасность» > «Отпечаток пальца» и следуя инструкциям по регистрации.
- Используйте эмулятор для эмуляции событий касания отпечатка пальца с помощью следующей команды. Используйте ту же команду для эмуляции событий касания отпечатка пальца на экране блокировки или в вашем приложении.
adb -e emu finger touch <finger_id>
В Windows вам, возможно, придется запустить
telnet 127.0.0.1 <emulator-id>
а затемfinger touch <finger_id>
.
Подтвердить учетные данные
Ваше приложение может аутентифицировать пользователей на основе того, как недавно они в последний раз разблокировали свое устройство. Эта функция освобождает пользователей от необходимости запоминать дополнительные пароли для конкретных приложений и устраняет необходимость реализации собственного пользовательского интерфейса аутентификации. Ваше приложение должно использовать эту функцию в сочетании с реализацией открытого или секретного ключа для аутентификации пользователя.
Чтобы установить длительность тайм-аута, в течение которого один и тот же ключ может быть повторно использован после успешной аутентификации пользователя, вызовите новый метод setUserAuthenticationValidityDurationSeconds()
при настройке KeyGenerator
или KeyPairGenerator
.
Избегайте чрезмерного отображения диалогового окна повторной аутентификации — ваши приложения должны сначала попытаться использовать криптографический объект, а если время ожидания истечет, используйте метод createConfirmDeviceCredentialIntent()
для повторной аутентификации пользователя в вашем приложении.
Связывание приложений
В этом выпуске улучшена система намерений Android, предоставляющая более мощные возможности связывания приложений. Эта функция позволяет вам связать приложение с принадлежащим вам веб-доменом. На основе этой связи платформа может определить приложение по умолчанию, которое будет использоваться для обработки конкретной веб-ссылки, и пропускать запросы пользователей на выбор приложения. Чтобы узнать, как реализовать эту функцию, см. раздел «Обработка ссылок на приложения» .
Автоматическое резервное копирование для приложений
Теперь система выполняет автоматическое полное резервное копирование и восстановление данных приложений. Чтобы включить такое поведение, ваше приложение должно быть ориентировано на Android 6.0 (уровень API 23); вам не нужно добавлять дополнительный код. Если пользователи удаляют свои учетные записи Google, их резервные данные также удаляются. Чтобы узнать, как работает эта функция и как настроить резервное копирование файловой системы, см. Настройка автоматического резервного копирования для приложений .
Прямая доля
![Нижняя часть мобильного телефона с функцией Direct Share](https://developer.android.com/static/images/android-6.0/direct-share-screen.png?authuser=0000&hl=ru)
В этом выпуске представлены API-интерфейсы, которые сделают обмен информацией интуитивно понятным и быстрым для пользователей. Теперь вы можете определить цели прямого обмена , которые запускают определенное действие в вашем приложении. Эти цели прямого обмена доступны пользователям через меню «Поделиться» . Эта функция позволяет пользователям обмениваться контентом с целевыми объектами, например с контактами, в других приложениях. Например, цель прямого обмена может запускать действие в другом приложении социальной сети, которое позволяет пользователю делиться контентом непосредственно с конкретным другом или сообществом в этом приложении.
Чтобы включить целевые объекты прямого общего доступа, вы должны определить класс, расширяющий класс ChooserTargetService
. Объявите свою службу в манифесте. В этом объявлении укажите разрешение BIND_CHOOSER_TARGET_SERVICE
и фильтр намерений, используя действие SERVICE_INTERFACE
.
В следующем примере показано, как можно объявить ChooserTargetService
в манифесте.
<service android:name=".ChooserTargetService" android:label="@string/service_name" android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"> <intent-filter> <action android:name="android.service.chooser.ChooserTargetService" /> </intent-filter> </service>
Для каждого действия, которое вы хотите предоставить ChooserTargetService
, добавьте элемент <meta-data>
с именем "android.service.chooser.chooser_target_service"
в манифест вашего приложения.
<activity android:name=".MyShareActivity” android:label="@string/share_activity_label"> <intent-filter> <action android:name="android.intent.action.SEND" /> </intent-filter> <meta-data android:name="android.service.chooser.chooser_target_service" android:value=".ChooserTargetService" /> </activity>
Голосовое взаимодействие
В этом выпуске представлен новый API голосового взаимодействия, который вместе с голосовыми действиями позволяет вам встраивать разговорный голосовой интерфейс в ваши приложения. Вызовите метод isVoiceInteraction()
, чтобы определить, вызвало ли ваше действие голосовое действие. Если это так, ваше приложение может использовать класс VoiceInteractor
для запроса голосового подтверждения от пользователя, выбора параметров из списка и т. д.
Большинство голосовых взаимодействий происходят в результате голосовых действий пользователя. Однако действие голосового взаимодействия также может начаться без участия пользователя. Например, другое приложение, запущенное посредством голосового взаимодействия, также может отправить намерение запустить голосовое взаимодействие. Чтобы определить, запущено ли ваше действие по голосовому запросу пользователя или из другого приложения голосового взаимодействия, вызовите метод isVoiceInteractionRoot()
. Если другое приложение запустило вашу активность, метод возвращает false
. Затем ваше приложение может предложить пользователю подтвердить, что он намеревался выполнить это действие.
Дополнительные сведения о реализации голосовых действий см. на сайте разработчиков голосовых действий .
Вспомогательный API
Этот выпуск предлагает пользователям новый способ взаимодействия с вашими приложениями через помощника. Чтобы использовать эту функцию, пользователь должен разрешить помощнику использовать текущий контекст. После включения пользователь может вызвать помощника в любом приложении, нажав и удерживая кнопку «Домой» .
Ваше приложение может не делиться текущим контекстом с помощником, установив флаг FLAG_SECURE
. В дополнение к стандартному набору информации, которую платформа передает помощнику, ваше приложение может делиться дополнительной информацией с помощью нового класса AssistContent
.
Чтобы предоставить помощнику дополнительный контекст из вашего приложения, выполните следующие действия:
- Реализуйте интерфейс
Application.OnProvideAssistDataListener
. - Зарегистрируйте этот прослушиватель с помощью
registerOnProvideAssistDataListener()
. - Чтобы предоставить контекстную информацию, специфичную для действия, переопределите обратный вызов
onProvideAssistData()
и, при необходимости, новый обратный вызовonProvideAssistContent()
.
Адаптируемые устройства хранения данных
В этом выпуске пользователи могут использовать внешние устройства хранения данных, такие как SD-карты. Использование внешнего запоминающего устройства шифрует и форматирует его, чтобы оно работало как внутреннее хранилище. Эта функция позволяет пользователям перемещать как приложения, так и личные данные этих приложений между устройствами хранения. При перемещении приложений система учитывает настройку android:installLocation
в манифесте.
Если ваше приложение обращается к следующим API или полям, имейте в виду, что пути к файлам, которые они возвращают, будут динамически меняться при перемещении приложения между внутренними и внешними устройствами хранения. При построении путей к файлам настоятельно рекомендуется всегда вызывать эти API динамически. Не используйте жестко запрограммированные пути к файлам и не сохраняйте полностью определенные пути к файлам, созданные ранее.
-
Context
методы: - Поля
ApplicationInfo
:
Чтобы отладить эту функцию, вы можете включить использование USB-накопителя, подключенного к устройству Android через кабель USB On-The-Go (OTG), выполнив следующую команду:
$ adb shell sm set-force-adoptable true
Уведомления
В этом выпуске добавлены следующие изменения API для уведомлений:
- Новый уровень фильтра
INTERRUPTION_FILTER_ALARMS
, соответствующий новому режиму «Только сигналы тревоги не беспокоить». - Новое значение категории
CATEGORY_REMINDER
, которое используется для отличия запланированных пользователем напоминаний от других событий (CATEGORY_EVENT
) и сигналов тревоги (CATEGORY_ALARM
). - Новый класс
Icon
, который вы можете прикрепить к своим уведомлениям с помощью методовsetSmallIcon()
иsetLargeIcon()
. Аналогично, методaddAction()
теперь принимает объектIcon
вместо идентификатора рисуемого ресурса. - Новый метод
getActiveNotifications()
, который позволяет вашим приложениям узнать, какие из их уведомлений активны в данный момент.
Поддержка Bluetooth-стилуса
В этом выпуске улучшена поддержка пользовательского ввода с помощью стилуса Bluetooth. Пользователи могут выполнить сопряжение и подключить совместимый стилус Bluetooth к своему телефону или планшету. При подключении информация о положении с сенсорного экрана объединяется с информацией о нажатии и кнопках стилуса, обеспечивая более широкий диапазон выражения, чем при использовании только сенсорного экрана. Ваше приложение может прослушивать нажатия кнопок стилуса и выполнять дополнительные действия, регистрируя объекты View.OnContextClickListener
и GestureDetector.OnContextClickListener
в вашей активности.
Используйте методы и константы MotionEvent
для обнаружения взаимодействия кнопок стилуса:
- Если пользователь касается стилусом кнопки на экране вашего приложения, метод
getTooltype()
возвращаетTOOL_TYPE_STYLUS
. - Для приложений, ориентированных на Android 6.0 (уровень API 23), метод
getButtonState()
возвращаетBUTTON_STYLUS_PRIMARY
, когда пользователь нажимает основную кнопку стилуса. Если у стилуса есть вторая кнопка, тот же метод возвращаетBUTTON_STYLUS_SECONDARY
, когда пользователь нажимает ее. Если пользователь нажимает обе кнопки одновременно, метод возвращает оба значения, объединенные ИЛИ (BUTTON_STYLUS_PRIMARY
|BUTTON_STYLUS_SECONDARY
). - Для приложений, предназначенных для более низкой версии платформы, метод
getButtonState()
возвращаетBUTTON_SECONDARY
(для нажатия основной кнопки стилуса),BUTTON_TERTIARY
(для нажатия дополнительной кнопки стилуса) или и то, и другое.
Улучшенное сканирование Bluetooth с низким энергопотреблением
Если ваше приложение выполняет сканирование Bluetooth Low Energy, используйте новый метод setCallbackType()
чтобы указать, что вы хотите, чтобы система уведомляла обратные вызовы, когда она впервые находит или видит через долгое время рекламный пакет, соответствующий набору ScanFilter
. Такой подход к сканированию более энергоэффективен, чем тот, который был реализован в предыдущей версии платформы.
Поддержка Hotspot 2.0 версии 1
В этом выпуске добавлена поддержка спецификации Hotspot 2.0 Release 1 на устройствах Nexus 6 и Nexus 9. Чтобы предоставить учетные данные Hotspot 2.0 в своем приложении, используйте новые методы класса WifiEnterpriseConfig
, такие как setPlmn()
и setRealm()
. В объекте WifiConfiguration
вы можете установить поля FQDN
providerFriendlyName
. Новый метод isPasspointNetwork()
указывает, представляет ли обнаруженная сеть точку доступа Hotspot 2.0.
Режим отображения 4K
Платформа теперь позволяет приложениям запрашивать обновление разрешения экрана до 4K на совместимом оборудовании. Чтобы запросить текущее физическое разрешение, используйте новые API Display.Mode
. Если пользовательский интерфейс нарисован с более низким логическим разрешением и масштабируется до большего физического разрешения, имейте в виду, что физическое разрешение, возвращаемое методом getPhysicalWidth()
, может отличаться от логического разрешения, сообщаемого getSize()
.
Вы можете запросить систему изменить физическое разрешение вашего приложения во время его работы, установив preferredDisplayModeId
окна вашего приложения. Эта функция полезна, если вы хотите переключиться на разрешение экрана 4K. В режиме отображения 4K пользовательский интерфейс продолжает отображаться с исходным разрешением (например, 1080p) и масштабируется до 4K, но объекты SurfaceView
могут отображать контент с собственным разрешением.
Тематические списки ColorStateList
Атрибуты темы теперь поддерживаются в ColorStateList
для устройств под управлением Android 6.0 (уровень API 23). Методы Resources.getColorStateList()
и Resources.getColor()
устарели. Если вы вызываете эти API, вместо этого вызовите новые методы Context.getColorStateList()
или Context.getColor()
. Эти методы также доступны в библиотеке appcompat v4 через ContextCompat
.
Аудио функции
В этом выпуске добавлены улучшения в обработке звука на Android, в том числе:
- Поддержка протокола MIDI с помощью новых API
android.media.midi
. Используйте эти API для отправки и получения MIDI-событий. - Новые классы
AudioRecord.Builder
иAudioTrack.Builder
для создания объектов захвата и воспроизведения цифрового звука соответственно, а также настройки свойств источника и приемника звука для переопределения системных значений по умолчанию. - Перехватчики API для связывания аудио и устройств ввода. Это особенно полезно, если ваше приложение позволяет пользователям запускать голосовой поиск с игрового контроллера или пульта дистанционного управления, подключенного к Android TV. Система вызывает новый обратный вызов
onSearchRequested()
когда пользователь начинает поиск. Чтобы определить, имеет ли устройство ввода пользователя встроенный микрофон, извлеките объектInputDevice
из этого обратного вызова, а затем вызовите новый методhasMicrophone()
. - Новый метод
getDevices()
, который позволяет получить список всех аудиоустройств, подключенных в данный момент к системе. Вы также можете зарегистрировать объектAudioDeviceCallback
, если хотите, чтобы система уведомляла ваше приложение при подключении или отключении аудиоустройства.
Особенности видео
В этом выпуске добавлены новые возможности API обработки видео, в том числе:
- Новый класс
MediaSync
, который помогает приложениям синхронно отображать аудио- и видеопотоки. Аудиобуферы передаются неблокирующим способом и возвращаются через обратный вызов. Он также поддерживает динамическую скорость воспроизведения. - Новое событие
EVENT_SESSION_RECLAIMED
, которое указывает, что сеанс, открытый приложением, был возвращен диспетчером ресурсов. Если ваше приложение использует сеансы DRM, вам следует обработать это событие и не использовать восстановленный сеанс. - Новый код ошибки
ERROR_RECLAIMED
, который указывает на то, что менеджер ресурсов вернул медиа-ресурс, используемый кодеком. За этим исключением кодек необходимо освободить, так как он перешел в терминальное состояние. - Новый интерфейс
getMaxSupportedInstances()
для получения подсказки о максимальном количестве поддерживаемых одновременных экземпляров кодека. - Новый метод
setPlaybackParams()
для установки скорости воспроизведения мультимедиа для ускоренного или замедленного воспроизведения. Он также автоматически растягивает или ускоряет воспроизведение звука вместе с видео.
Возможности камеры
Этот выпуск включает следующие новые API для доступа к фонарику камеры и обработки изображений камерой:
API фонарика
Если устройство камеры имеет вспышку, вы можете вызвать метод setTorchMode()
, чтобы включить или выключить режим фонарика вспышки, не открывая устройство камеры. Приложение не имеет исключительных прав собственности на вспышку или камеру. Режим фонарика выключается и становится недоступным, когда устройство камеры становится недоступным или когда другие ресурсы камеры, поддерживающие включенный фонарик, становятся недоступными. Другие приложения также могут вызывать setTorchMode()
, чтобы отключить режим фонарика. Когда последнее приложение, включившее режим фонарика, закрывается, режим фонарика выключается.
Вы можете зарегистрировать обратный вызов для получения уведомлений о состоянии режима фонарика, вызвав метод registerTorchCallback()
. При первой регистрации обратного вызова он немедленно вызывается со статусом режима фонарика всех известных на данный момент устройств с камерой со вспышкой. Если режим фонарика успешно включен или выключен, вызывается метод onTorchModeChanged()
.
API повторной обработки
API Camera2
расширен для поддержки YUV и обработки изображений в частном непрозрачном формате. Чтобы определить, доступны ли эти возможности повторной обработки, вызовите getCameraCharacteristics()
и проверьте наличие ключа REPROCESS_MAX_CAPTURE_STALL
. Если устройство поддерживает повторную обработку, вы можете создать сеанс захвата с камеры с возможностью повторной обработки, вызвав createReprocessableCaptureSession()
и создав запросы на повторную обработку входного буфера.
Используйте класс ImageWriter
, чтобы соединить поток входного буфера с входом обработки камеры. Чтобы получить пустой буфер, следуйте этой модели программирования:
- Вызовите метод
dequeueInputImage()
. - Заполните данные во входной буфер.
- Отправьте буфер в камеру, вызвав
queueInputImage()
.
Если вы используете объект ImageWriter
вместе с PRIVATE
изображением, ваше приложение не сможет напрямую получить доступ к данным изображения. Вместо этого передайте PRIVATE
изображение непосредственно в ImageWriter
, вызвав метод queueInputImage()
без копирования буфера.
Класс ImageReader
теперь поддерживает потоки изображений в формате PRIVATE
. Эта поддержка позволяет вашему приложению поддерживать циклическую очередь выходных изображений ImageReader
, выбирать одно или несколько изображений и отправлять их в ImageWriter
для повторной обработки камерой.
Android для работы: функции
Этот выпуск включает следующие новые API для Android for Work:
- Расширенные возможности управления корпоративными одноразовыми устройствами. Владелец устройства теперь может управлять следующими параметрами для улучшения управления корпоративными одноразовыми устройствами (COSU):
- Отключите или повторно включите защиту клавиатуры с помощью метода
setKeyguardDisabled()
. - Отключите или повторно включите строку состояния (включая быстрые настройки, уведомления и жест навигации вверх, запускающий Google Now) с помощью метода
setStatusBarDisabled()
. - Отключите или повторно включите безопасную загрузку с помощью константы
UserManager
DISALLOW_SAFE_BOOT
. - Предотвратите выключение экрана при подключении к сети с помощью константы
STAY_ON_WHILE_PLUGGED_IN
.
- Отключите или повторно включите защиту клавиатуры с помощью метода
- Тихая установка и удаление приложений владельцем устройства. Теперь владелец устройства может автоматически устанавливать и удалять приложения с помощью API-интерфейсов
PackageInstaller
, независимо от Google Play for Work. Теперь вы можете подготавливать устройства через владельца устройства, который загружает и устанавливает приложения без взаимодействия с пользователем. Эта функция полезна для включения настройки киосков или других подобных устройств в одно касание без активации учетной записи Google. - Тихий доступ к корпоративному сертификату: когда приложение вызывает
choosePrivateKeyAlias()
, до того, как пользователю будет предложено выбрать сертификат, владелец профиля или устройства теперь может вызвать методonChoosePrivateKeyAlias()
, чтобы автоматически предоставить псевдоним запрашивающему приложению. Эта функция позволяет предоставлять управляемым приложениям доступ к сертификатам без взаимодействия с пользователем. - Автопринятие обновлений системы. Установив политику обновления системы с помощью
setSystemUpdatePolicy()
, владелец устройства теперь может автоматически принимать обновление системы, например, в случае киоск-устройства, или отложить обновление и запретить его использование пользователем на срок до 30 дней. . Кроме того, администратор может установить ежедневный временной интервал, в течение которого необходимо получать обновления, например, в те часы, когда киоск-устройство не используется. Когда доступно обновление системы, система проверяет, установило ли приложение-контроллер политики устройства политику обновления системы, и ведет себя соответствующим образом. - Делегированная установка сертификата. Владелец профиля или устройства теперь может предоставить стороннему приложению возможность вызывать следующие API управления сертификатами
DevicePolicyManager
: - Отслеживание использования данных. Владелец профиля или устройства теперь может запрашивать статистику использования данных, отображаемую в разделе «Настройки» > «Использование данных», используя новые методы
NetworkStatsManager
. Владельцам профилей автоматически предоставляется разрешение на запрос данных в профиле, которым они управляют, а владельцы устройств получают доступ к данным об использовании управляемого основного пользователя. - Управление разрешениями во время выполнения:
Владелец профиля или устройства может установить политику разрешений для всех запросов времени выполнения всех приложений с помощью
setPermissionPolicy()
, чтобы либо предлагать пользователю предоставить разрешение, либо автоматически предоставлять или отклонять разрешение в автоматическом режиме. Если установлена последняя политика, пользователь не может изменить выбор, сделанный профилем или владельцем устройства на экране разрешений приложения в настройках . - VPN в настройках: приложения VPN теперь отображаются в разделе «Настройки» > «Еще» > «VPN» . Кроме того, уведомления, сопровождающие использование VPN, теперь зависят от того, как настроена эта VPN. Для владельца профиля уведомления зависят от того, настроена ли VPN для управляемого профиля, личного профиля или того и другого. Для владельца устройства уведомления зависят от того, настроен ли VPN для всего устройства.
- Уведомление о рабочем статусе: значок портфеля в строке состояния теперь появляется каждый раз, когда приложение из управляемого профиля выполняет действие на переднем плане. Кроме того, если устройство разблокировано непосредственно для активности приложения в управляемом профиле, отображается всплывающее уведомление, уведомляющее пользователя о том, что он находится в рабочем профиле.
![Мобильное устройство с функцией уведомления о рабочем статусе в Android for Work](https://developer.android.com/static/images/android-6.0/work-profile-screen.png?authuser=0000&hl=ru)