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 вместе с системой хранилища ключей Android.
Чтобы аутентифицировать пользователей с помощью сканирования отпечатка пальца, получите экземпляр нового класса FingerprintManager и вызовите метод authenticate(). Приложение должно быть запущено на совместимом устройстве со сканером отпечатков пальцев. В приложении необходимо реализовать интерфейс для аутентификации по отпечатку пальца и использовать стандартный значок отпечатка пальца Android.
Значок отпечатка пальца Android (c_fp_40px.png) включен в пример биометрической аутентификации.
Если вы разрабатываете несколько приложений, в которых используется аутентификация по отпечатку пальца, помните, что каждое из них должно проверять отпечаток пальца пользователя независимо.
Чтобы использовать эту функцию в приложении, сначала добавьте разрешение USE_FINGERPRINT в манифест.
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
Пример реализации аутентификации по отпечатку пальца в приложении можно найти в образце биометрической аутентификации. Посмотреть, как использовать эти API аутентификации вместе с другими API Android, можно в видео Fingerprint and Payment APIs.
Если вы тестируете эту функцию, выполните следующие действия:
- Установите Android SDK Tools Revision 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, благодаря чему связь между приложениями стала более эффективной. Эта функция позволяет связать приложение с принадлежащим вам веб-доменом. На основе этой связи платформа может определить приложение по умолчанию для обработки определенной веб-ссылки и не запрашивать у пользователей выбор приложения. Чтобы узнать, как реализовать эту функцию, ознакомьтесь с разделом Как обрабатывать ссылки на приложения.
Автоматическое копирование в облако для приложений
Теперь система автоматически создает полные резервные копии данных приложений и восстанавливает их. Чтобы включить это поведение, в приложении должен быть задан целевой уровень API 23 (Android 6.0). Добавлять дополнительный код не нужно. Если пользователи удаляют свои аккаунты Google, резервные копии их данных также удаляются. Чтобы узнать, как работает эта функция и как настроить автоматическое копирование в облако в файловой системе, ознакомьтесь с разделом Настройка автоматического копирования в облако для приложений.
Прямая отправка
В этой версии представлены 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>
Для каждого объекта activity, который вы хотите сделать доступным для 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(). Если ваш объект activity был запущен другим приложением, метод возвращает значение false. После этого приложение может запросить у пользователя подтверждение действия.
Подробнее о том, как реализовать голосовые действия, можно узнать на сайте для разработчиков.
Assist API
В этом выпуске пользователи смогут взаимодействовать с вашими приложениями через помощника. Чтобы использовать эту функцию, пользователь должен разрешить помощнику использовать текущий контекст. После этого пользователь сможет вызвать его в любом приложении, нажав и удерживая кнопку Главная.
Приложение может не передавать текущий контекст помощнику, установив флаг FLAG_SECURE. Помимо стандартного набора информации, передаваемой платформой помощнику, ваше приложение может делиться дополнительными данными, используя новый класс AssistContent.
Чтобы передать помощнику дополнительный контекст из приложения, выполните следующие действия:
- Реализуйте интерфейс
Application.OnProvideAssistDataListener. - Зарегистрируйте этот сервис просмотра уведомлений, используя
registerOnProvideAssistDataListener(). - Чтобы предоставить контекстную информацию, относящуюся к определенному действию, переопределите обратный вызов
onProvideAssistData()и, при необходимости, новый обратный вызовonProvideAssistContent().
Внедряемые накопители
В этой версии пользователи могут адаптировать внешние устройства хранения данных, например SD-карты. При использовании внешнего накопителя он шифруется и форматируется так, чтобы работать как внутренняя память устройства. Эта функция позволяет переносить приложения и их личные данные между устройствами хранения. При перемещении приложений система учитывает параметр android:installLocation в манифесте.
Если ваше приложение обращается к указанным ниже API или полям, имейте в виду, что пути к файлам, которые они возвращают, будут динамически меняться при переносе приложения между внутренним и внешним хранилищем. При создании путей к файлам настоятельно рекомендуется всегда вызывать эти API динамически. Не используйте жестко заданные пути к файлам и не сохраняйте полные пути к файлам, созданные ранее.
Contextmethods: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вместо идентификатора ресурса drawable. - Новый метод
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 с низким энергопотреблением, используйте новый метод setCallbackType(), чтобы указать, что вы хотите, чтобы система уведомляла обратные вызовы, когда она впервые находит или видит после долгого времени пакет объявлений, соответствующий набору ScanFilter. Такой подход к сканированию более энергоэффективен, чем в предыдущей версии платформы.
Поддержка Hotspot 2.0 Release 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 могут отображать контент в собственном разрешении.
Списки Themeable ColorStateLists
Атрибуты тем теперь поддерживаются в ColorStateList на устройствах с Android 6.0 (уровень API 23). Методы Resources.getColorStateList() и Resources.getColor() больше не поддерживаются. Если вы используете эти API, вызовите вместо них новые методы Context.getColorStateList() или Context.getColor(). Эти методы также доступны в библиотеке appcompat версии 4 через ContextCompat.
Функции аудио
В этом выпуске улучшена обработка аудио на устройствах Android, в том числе:
- Поддержка протокола MIDI с новыми API
android.media.midi. Используйте эти API для отправки и получения событий MIDI. - Новые классы
AudioRecord.BuilderиAudioTrack.Builderдля создания объектов захвата и воспроизведения цифрового аудио, а также настройки свойств источника и приемника аудио для переопределения системных значений по умолчанию. - API-перехватчики для связывания аудиоустройств и устройств ввода. Это особенно полезно, если ваше приложение позволяет пользователям запускать голосовой поиск с помощью игрового контроллера или пульта дистанционного управления, подключенного к Android TV. Система вызывает новый обратный вызов
onSearchRequested(), когда пользователь начинает поиск. Чтобы определить, есть ли у устройства ввода пользователя встроенный микрофон, получите объектInputDeviceиз этого обратного вызова, а затем вызовите метод newhasMicrophone(). - Новый метод
getDevices(), который позволяет получить список всех аудиоустройств, подключенных к системе. Вы также можете зарегистрировать объектAudioDeviceCallback, чтобы система уведомляла ваше приложение о подключении и отключении аудиоустройств.
Функции для съемки и обработки видео
В этом выпуске в API обработки видео добавлены новые возможности, в том числе:
- Новый класс
MediaSync, который помогает приложениям синхронно воспроизводить аудио- и видеопотоки. Аудио буферы отправляются без блокировки и возвращаются через обратный вызов. Также поддерживается динамическая скорость воспроизведения. - Новое событие
EVENT_SESSION_RECLAIMED, которое указывает, что менеджер ресурсов закрыл сеанс, открытый приложением. Если в вашем приложении используются сеансы DRM, обработайте это событие и убедитесь, что не используете восстановленный сеанс. - Новый код ошибки
ERROR_RECLAIMED, который указывает, что менеджер ресурсов вернул медиаресурс, используемый кодеком. В этом случае кодек должен быть освобожден, так как он перешел в конечное состояние. - Новый интерфейс
getMaxSupportedInstances(), позволяющий получить подсказку о максимальном количестве поддерживаемых экземпляров кодека, работающих одновременно. - Новый метод
setPlaybackParams()для настройки скорости воспроизведения медиаконтента с ускорением или замедлением. При этом аудиодорожка автоматически растягивается или ускоряется вместе с видео.
Функции камеры
В этом выпуске добавлены следующие новые API для доступа к фонарику камеры и для повторной обработки изображений камерой:
Flashlight API
Если у камеры есть вспышка, вы можете вызвать метод setTorchMode(), чтобы включить или отключить режим фонарика, не открывая камеру. У приложения нет исключительных прав на использование вспышки или камеры. Режим фонарика отключается и становится недоступен, когда камера или другие ресурсы, поддерживающие работу фонарика, становятся недоступны. Другие приложения также могут вызывать
setTorchMode()
для отключения режима фонарика. Когда закрывается последнее приложение, включившее режим фонарика, он отключается.
Чтобы зарегистрировать обратный вызов для получения уведомлений о статусе режима фонарика, вызовите метод registerTorchCallback(). При первой регистрации обратного вызова он сразу же вызывается со статусом режима фонарика всех известных в данный момент устройств с камерой и вспышкой. Если режим фонарика успешно включен или отключен, вызывается метод onTorchModeChanged().
Reprocessing API
Camera2 API теперь поддерживает повторную обработку изображений в формате YUV и частном непрозрачном формате. Чтобы узнать, доступны ли эти возможности, вызовите getCameraCharacteristics() и проверьте наличие ключа REPROCESS_MAX_CAPTURE_STALL. Если устройство поддерживает повторную обработку, вы можете создать сеанс захвата изображения с камеры, который можно будет обработать повторно, вызвав функцию createReprocessableCaptureSession(), и создать запросы на повторную обработку входного буфера.
Используйте класс ImageWriter, чтобы подключить поток входного буфера к входу повторной обработки камеры. Чтобы получить пустой буфер, следуйте этой модели программирования:
- Вызовите метод
dequeueInputImage(). - Заполните буфер ввода данными.
- Отправьте буфер в камеру, вызвав метод
queueInputImage().
Если вы используете объект ImageWriter вместе с изображением PRIVATE, ваше приложение не сможет получить доступ к данным изображения напрямую. Вместо этого передайте изображение PRIVATE непосредственно в ImageWriter, вызвав метод queueInputImage() без копирования буфера.
Класс ImageReader теперь поддерживает потоки изображений в формате PRIVATE. Благодаря этой поддержке приложение может поддерживать очередь из ImageReader выходных изображений, выбирать одно или несколько изображений и отправлять их в ImageWriter для повторной обработки камерой.
Функции Android for Work
В этом выпуске добавлены следующие новые API для Android for Work:
- Улучшенные настройки для корпоративных устройств с ограниченным набором функций. Теперь владелец устройства может управлять следующими настройками, чтобы улучшить управление корпоративными устройствами с ограниченным набором функций (COSU):
- Отключить или повторно включить блокировку клавиатуры можно с помощью метода
setKeyguardDisabled(). - Отключить или снова включить строку состояния (включая быстрые настройки, уведомления и жест смахивания вверх для перехода к Google Now) можно с помощью метода
setStatusBarDisabled(). - Отключите или повторно включите безопасную загрузку с помощью константы
UserManagerDISALLOW_SAFE_BOOT. - Запретить отключение экрана при подключении к источнику питания с помощью константы
STAY_ON_WHILE_PLUGGED_IN.
- Отключить или повторно включить блокировку клавиатуры можно с помощью метода
- Тихая установка и удаление приложений владельцем устройства. Теперь владелец устройства может тихо устанавливать и удалять приложения с помощью API
PackageInstallerнезависимо от Google Play для работы. Теперь вы можете инициализировать устройства с помощью владельца устройства, который получает и устанавливает приложения без участия пользователя. Эта функция позволяет настраивать киоски и другие подобные устройства одним касанием без активации аккаунта Google. - Тихий доступ к корпоративному сертификату. Когда приложение вызывает
choosePrivateKeyAlias(), до того как пользователю будет предложено выбрать сертификат, владелец профиля или устройства может вызвать методonChoosePrivateKeyAlias(), чтобы передать псевдоним запрашивающему приложению. Эта функция позволяет предоставлять управляемым приложениям доступ к сертификатам без вмешательства пользователя. - Автоматическое принятие системных обновлений. Задав правила обновления системы с помощью параметра
setSystemUpdatePolicy(), владелец устройства может автоматически принять системное обновление, например в случае с киоск-устройством, или отложить обновление и запретить пользователю выполнять его в течение 30 дней. Кроме того, администратор может задать временной интервал, в течение которого должно быть установлено обновление, например в часы, когда киоск-устройство не используется. Когда становится доступно обновление системы, она проверяет, задано ли в приложении контроллера правил устройства правило обновления системы, и действует в соответствии с ним. -
Делегированная установка сертификатов. Владелец профиля или устройства теперь может предоставить стороннему приложению возможность вызывать следующие API управления сертификатами
DevicePolicyManager: - Отслеживание использования данных. Владелец профиля или устройства теперь может запрашивать статистику передачи данных, которая показывается в разделе Настройки > Использование данных, с помощью новых методов
NetworkStatsManager. Владельцы профилей автоматически получают разрешение на отправку запросов к данным в управляемых профилях, а владельцы устройств – доступ к данным об использовании управляемого основного пользователя. - Управление динамическими разрешениями
Владелец профиля или устройства может задать правила для всех запросов динамических разрешений от всех приложений с помощью
setPermissionPolicy(). В соответствии с этими правилами пользователю будет предложено предоставить разрешение, или оно будет предоставлено или отклонено автоматически. Если задано последнее правило, пользователь не может изменить выбор, сделанный владельцем профиля или устройства, на экране разрешений приложения в Настройках. - VPN в настройках. Приложения VPN теперь можно найти в разделе Настройки > Ещё > VPN. Кроме того, уведомления, связанные с использованием VPN, теперь зависят от конфигурации VPN. Для владельца профиля уведомления зависят от того, настроена ли VPN для управляемого профиля, личного профиля или обоих. Для владельца устройства уведомления зависят от того, настроена ли VPN для всего устройства.
- Уведомление о рабочем статусе. Теперь, когда приложение из управляемого профиля работает в активном режиме, в строке состояния появляется значок портфеля. Кроме того, если устройство разблокировано непосредственно для перехода к действию приложения в управляемом профиле, появится уведомление о том, что пользователь находится в рабочем профиле.