API Android 5.0

Уровень API: 21

Android 5.0 ( LOLLIPOP ) предлагает новые функции для пользователей и разработчиков приложений. Этот документ представляет собой введение в наиболее известные новые API.

Если у вас есть опубликованное приложение, обязательно ознакомьтесь с изменениями поведения Android 5.0 , которые вам следует учитывать в своем приложении. Эти изменения поведения могут повлиять на ваше приложение на устройствах Android 5.0, даже если вы не используете новые API и не планируете использовать новые функции.

Более общий обзор новых функций платформы можно найти в обзоре Android Lollipop .

Начать разработку

Чтобы начать создавать приложения для Android 5.0, сначала необходимо получить Android SDK . Затем с помощью SDK Manager загрузите платформу Android 5.0 SDK и образы системы.

Обновите целевой уровень API

Чтобы лучше оптимизировать свое приложение для устройств под управлением Android 5.0, задайте для targetSdkVersion значение "21" , установите приложение в образ системы Android 5.0, протестируйте его, а затем опубликуйте обновленное приложение с этим изменением.

Вы можете использовать API Android 5.0, одновременно поддерживая более старые версии, добавив в код условия, которые проверяют уровень системного API перед выполнением API, не поддерживаемых вашим minSdkVersion . Чтобы узнать больше о обеспечении обратной совместимости, прочтите раздел «Поддержка различных версий платформы» .

Дополнительные сведения о том, как работают уровни API, см. в статье Что такое уровень API?

Важные изменения в поведении

Если вы ранее публиковали приложение для Android, имейте в виду, что на ваше приложение могут повлиять изменения в Android 5.0.

Для получения полной информации ознакомьтесь с изменениями в Android 5.0 .

Пользовательский интерфейс

Поддержка дизайна материалов

В Android 5.0 добавлена ​​поддержка нового стиля материального дизайна Android. Вы можете создавать приложения с материальным дизайном, которые визуально динамичны и имеют переходы элементов пользовательского интерфейса, которые кажутся пользователям естественными. Эта поддержка включает в себя:

  • Материальная тема
  • Просмотр теней
  • Виджет RecyclerView
  • Рисуемая анимация и эффекты стиля
  • Анимация дизайна материалов и эффекты перехода между действиями
  • Аниматоры для свойств представления в зависимости от состояния представления.
  • Настраиваемые виджеты пользовательского интерфейса и панели приложений с цветовыми палитрами, которыми вы управляете.
  • Анимированные и неанимированные рисунки на основе векторной графики XML.

Чтобы узнать больше о добавлении функциональности Material Design в ваше приложение, см. Material Design .

Одновременные документы и действия на экране последних событий

В предыдущих выпусках на экране последних можно было отображать только одну задачу для каждого приложения, с которым пользователь взаимодействовал в последний раз. Теперь ваше приложение может открывать больше задач по мере необходимости для дополнительных одновременных действий с документами. Эта функция облегчает работу в многозадачном режиме, позволяя пользователям быстро переключаться между отдельными действиями и документами с экрана последних событий с единообразным переключением между всеми приложениями. Примерами таких одновременных задач могут быть открытые вкладки в приложении веб-браузера, документы в приложении для повышения производительности, одновременные матчи в игре или чаты в приложении для обмена сообщениями. Ваше приложение может управлять своими задачами через класс ActivityManager.AppTask .

Чтобы вставить логический разрыв, чтобы система воспринимала вашу активность как новую задачу, используйте FLAG_ACTIVITY_NEW_DOCUMENT при запуске активности с помощью startActivity() . Вы также можете добиться такого поведения, установив в манифесте для атрибута documentLaunchMode элемента <activity> значение "intoExisting" или "always" .

Чтобы не загромождать экран последних задач, вы можете установить максимальное количество задач вашего приложения, которые могут отображаться на этом экране. Для этого установите атрибут <application> android:maxRecents . Текущий максимум, который можно указать, — 50 задач на пользователя (25 для устройств с небольшим объемом оперативной памяти).

Задачи на экране последних событий можно настроить так, чтобы они сохранялись после перезагрузки. Чтобы управлять поведением сохраняемости, используйте атрибут android:persistableMode . Вы также можете изменить визуальные свойства действия на экране последних событий, такие как цвет, метка и значок действия, вызвав метод setTaskDescription() .

Обновления веб-представления

Android 5.0 обновляет реализацию WebView до Chromium M37, обеспечивая улучшения безопасности и стабильности, а также исправления ошибок. Строка пользовательского агента по умолчанию для WebView , работающего на Android 5.0, была обновлена ​​и теперь включает 37.0.0.0 в качестве номера версии.

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

Благодаря новому методу onShowFileChooser() вы теперь можете использовать поле формы ввода в WebView и запускать средство выбора файлов для выбора изображений и файлов с устройства Android.

Кроме того, в этом выпуске реализована поддержка открытых стандартов WebAudio , WebGL и WebRTC . Чтобы узнать больше о новых функциях, включенных в этот выпуск, см. WebView для Android .

Захват экрана и обмен информацией

Android 5.0 позволяет добавлять в приложение возможности захвата экрана и совместного использования экрана с помощью новых API android.media.projection . Эта функция полезна, например, если вы хотите включить совместное использование экрана в приложении для видеоконференций.

Новый метод createVirtualDisplay() позволяет вашему приложению захватывать содержимое главного экрана (отображение по умолчанию) в объект Surface , который ваше приложение затем может отправлять по сети. API позволяет захватывать только незащищенное содержимое экрана, но не системный звук. Чтобы начать захват экрана, ваше приложение должно сначала запросить разрешение пользователя, запустив диалоговое окно захвата экрана, используя Intent , полученное с помощью метода createScreenCaptureIntent() .

Пример использования новых API см. в классе MediaProjectionDemo в примере проекта.

Уведомления

Уведомления на экране блокировки

Экраны блокировки в Android 5.0 имеют возможность отображать уведомления. Пользователи могут выбрать в настройках , разрешать ли отображать конфиденциальный контент уведомлений на безопасном экране блокировки.

Ваше приложение может контролировать уровень детализации, видимой, когда его уведомления отображаются на экране безопасной блокировки. Чтобы контролировать уровень видимости, вызовите setVisibility() и укажите одно из этих значений:

  • VISIBILITY_PRIVATE : показывает основную информацию, например значок уведомления, но скрывает все содержимое уведомления.
  • VISIBILITY_PUBLIC : показывает полное содержимое уведомления.
  • VISIBILITY_SECRET : ничего не показывает, кроме значка уведомления.

Если уровень видимости равен VISIBILITY_PRIVATE , вы также можете предоставить отредактированную версию содержимого уведомления, которая скрывает личные данные. Например, приложение SMS может отображать уведомление «У вас 3 новых текстовых сообщения», но скрывает содержимое сообщения и отправителей. Чтобы предоставить это альтернативное уведомление, сначала создайте уведомление о замене с помощью Notification.Builder . Когда вы создаете объект частного уведомления, прикрепите к нему уведомление о замене с помощью метода setPublicVersion() .

Метаданные уведомлений

Android 5.0 использует метаданные, связанные с уведомлениями вашего приложения, для более разумной сортировки уведомлений. Чтобы установить метаданные, вызовите следующие методы в Notification.Builder при создании уведомления:

  • setCategory() : сообщает системе, как обрабатывать уведомления вашего приложения, когда устройство находится в режиме приоритета (например, если уведомление представляет собой входящий вызов, мгновенное сообщение или сигнал тревоги).
  • setPriority() : отмечает уведомление как более или менее важное, чем обычные уведомления. Уведомления с полем приоритета, установленным на PRIORITY_MAX или PRIORITY_HIGH отображаются в небольшом плавающем окне, если уведомление также содержит звук или вибрацию.
  • addPerson() : позволяет добавить одного или нескольких людей, имеющих отношение к уведомлению. Ваше приложение может использовать это, чтобы сигнализировать системе о том, что ей следует группировать уведомления от указанных людей или ранжировать уведомления от этих людей как более важные.

Графика

Поддержка OpenGL ES 3.1.

В Android 5.0 добавлены интерфейсы Java и встроенная поддержка OpenGL ES 3.1. Ключевые новые функции, представленные в OpenGL ES 3.1, включают в себя:

  • Вычислительные шейдеры
  • Отдельные объекты шейдера
  • Косвенные команды рисования
  • Мультисэмпловые и трафаретные текстуры
  • Улучшения языка шейдинга
  • Расширения для расширенных режимов наложения и отладки
  • Обратная совместимость с OpenGL ES 2.0 и 3.0.

Интерфейс Java для OpenGL ES 3.1 на Android предоставляется вместе с GLES31 . При использовании OpenGL ES 3.1 обязательно объявите его в файле манифеста с помощью тега <uses-feature> и атрибута android:glEsVersion . Например:

<manifest>
    <uses-feature android:glEsVersion="0x00030001" />
    ...
</manifest>

Дополнительные сведения об использовании OpenGL ES, в том числе о том, как проверить поддерживаемую устройством версию OpenGL ES во время выполнения, см. в руководстве OpenGL ES API .

Пакет расширений Android

В дополнение к OpenGL ES 3.1 этот выпуск предоставляет пакет расширений с интерфейсами Java и встроенной поддержкой расширенных графических функций. Эти расширения рассматриваются Android как один пакет. (Если присутствует расширение ANDROID_extension_pack_es31a , ваше приложение может предположить, что все расширения в пакете присутствуют, и включить функции языка затенения с помощью одного оператора #extension .)

Пакет расширений поддерживает:

  • Гарантированная поддержка фрагментных шейдеров для буферов хранения шейдеров, изображений и атомов (поддержка фрагментных шейдеров не является обязательной в OpenGL ES 3.1.)
  • Шейдеры тесселяции и геометрии
  • Формат сжатия текстур ASTC (LDR)
  • Интерполяция и затенение по выборке
  • Различные режимы наложения для каждого вложения цвета в буфере кадра.

Интерфейс Java для пакета расширений предоставляется вместе с GLES31Ext . В манифесте приложения вы можете объявить, что ваше приложение должно быть установлено только на устройствах, поддерживающих пакет расширений. Например:

<manifest>
    <uses-feature android:name=“android.hardware.opengles.aep”
        android:required="true" />
    ...
</manifest>

СМИ

API камеры для расширенных возможностей камеры

В Android 5.0 представлен новый API android.hardware.camera2 , упрощающий съемку и обработку изображений с высокой детализацией. Теперь вы можете программно получить доступ к устройствам камеры, доступным в системе, с помощью getCameraIdList() и подключиться к определенному устройству с помощью openCamera() . Чтобы начать захват изображений, создайте CameraCaptureSession и укажите объекты Surface для отправки захваченных изображений. CameraCaptureSession можно настроить для съемки одиночных снимков или нескольких изображений в серии.

Чтобы получать уведомления о захвате новых изображений, реализуйте прослушиватель CameraCaptureSession.CaptureCallback и установите его в запросе на захват. Теперь, когда система завершает запрос на захват изображения, ваш прослушиватель CameraCaptureSession.CaptureCallback получает вызов onCaptureCompleted() , предоставляя вам метаданные захвата изображения в CaptureResult .

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

  • Все устройства поддерживают как минимум аппаратный уровень INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY , возможности которого примерно эквивалентны возможностям устаревшего API Camera .
  • Устройства, поддерживающие аппаратный уровень INFO_SUPPORTED_HARDWARE_LEVEL_FULL , способны вручную управлять захватом и последующей обработкой, а также захватывать изображения с высоким разрешением и высокой частотой кадров.

Чтобы узнать, как использовать обновленный API камеры , обратитесь к примерам реализации Camera2Basic и Camera2Video в этом выпуске.

Воспроизведение аудио

Этот выпуск включает в себя следующие изменения в AudioTrack :

  • Ваше приложение теперь может предоставлять аудиоданные в формате с плавающей запятой ( ENCODING_PCM_FLOAT ). Это обеспечивает больший динамический диапазон, более стабильную точность и больший запас мощности. Арифметика с плавающей запятой особенно полезна во время промежуточных вычислений. Конечные точки воспроизведения используют целочисленный формат для аудиоданных с меньшей разрядностью. (В Android 5.0 части внутреннего конвейера еще не являются числами с плавающей запятой.)
  • Ваше приложение теперь может предоставлять аудиоданные в виде ByteBuffer в том же формате, который предоставляется MediaCodec .
  • Параметр WRITE_NON_BLOCKING может упростить буферизацию и многопоточность для некоторых приложений.

Управление воспроизведением мультимедиа

Используйте новые API-интерфейсы уведомлений и мультимедиа, чтобы пользовательский интерфейс системы знал о воспроизведении мультимедиа и мог извлекать и отображать обложки альбомов. Управление воспроизведением мультимедиа через пользовательский интерфейс и службу теперь стало проще благодаря новым классам MediaSession и MediaController .

Новый класс MediaSession заменяет устаревший класс RemoteControlClient и предоставляет единый набор методов обратного вызова для обработки элементов управления транспортом и кнопок мультимедиа. Если ваше приложение обеспечивает воспроизведение мультимедиа и работает на платформе Android TV или Wear , используйте класс MediaSession для обработки элементов управления транспортировкой, используя те же методы обратного вызова.

Теперь вы можете создать собственное приложение медиаконтроллера с помощью нового класса MediaController . Этот класс обеспечивает потокобезопасный способ мониторинга и управления воспроизведением мультимедиа из процесса пользовательского интерфейса вашего приложения. При создании контроллера укажите объект MediaSession.Token , чтобы ваше приложение могло взаимодействовать с данным MediaSession . Используя методы MediaController.TransportControls , вы можете отправлять такие команды, как play() , stop() , skipToNext() и setRating() для управления воспроизведением мультимедиа в этом сеансе. С помощью контроллера вы также можете зарегистрировать объект MediaController.Callback для прослушивания метаданных и изменений состояния в сеансе.

Кроме того, вы можете создавать расширенные уведомления, которые позволяют управлять воспроизведением, привязанным к сеансу мультимедиа, с помощью нового класса Notification.MediaStyle .

Просмотр мультимедиа

Android 5.0 предоставляет приложениям возможность просматривать библиотеку медиаконтента другого приложения через новый API android.media.browse . Чтобы предоставить мультимедийный контент в вашем приложении, расширьте класс MediaBrowserService . Ваша реализация MediaBrowserService должна предоставлять доступ к MediaSession.Token , чтобы приложения могли воспроизводить мультимедийный контент, предоставляемый через вашу службу.

Для взаимодействия со службой медиабраузера используйте класс MediaBrowser . Укажите имя компонента для MediaSession при создании экземпляра MediaBrowser . Используя этот экземпляр браузера, ваше приложение может затем подключиться к связанной службе и получить объект MediaSession.Token для воспроизведения контента, предоставляемого через эту службу.

Хранилище

Выбор каталога

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

Чтобы выбрать поддерево каталога, создайте и отправьте намерение OPEN_DOCUMENT_TREE . Система отображает все экземпляры DocumentsProvider , поддерживающие выбор поддерева, позволяя пользователю просматривать и выбирать каталог. Возвращенный URI представляет доступ к выбранному поддереву. Затем вы можете использовать buildChildDocumentsUriUsingTree() и buildDocumentUriUsingTree() вместе с query() для исследования поддерева.

Новый метод createDocument() позволяет создавать новые документы или каталоги в любом месте поддерева. Для управления существующими документами используйте renameDocument() и deleteDocument() . Проверьте COLUMN_FLAGS , чтобы проверить поддержку этих вызовов поставщиком перед их выполнением.

Если вы реализуете DocumentsProvider и хотите поддерживать выбор поддерева, реализуйте isChildDocument() и включите FLAG_SUPPORTS_IS_CHILD в свой COLUMN_FLAGS .

В Android 5.0 также представлены новые каталоги для конкретных пакетов в общем хранилище, где ваше приложение может размещать медиафайлы для включения в MediaStore . Новый getExternalMediaDirs() возвращает пути к этим каталогам на всех общих устройствах хранения. Как и в случае с getExternalFilesDir() , вашему приложению не требуются дополнительные разрешения для доступа к возвращаемым путям. Платформа периодически сканирует новые носители в этих каталогах, но вы также можете использовать MediaScannerConnection для явного сканирования нового контента.

Беспроводная связь и подключение

Несколько сетевых подключений

Android 5.0 предоставляет новые многосетевые API, которые позволяют вашему приложению динамически сканировать доступные сети с определенными возможностями и устанавливать к ним соединение. Эта функция полезна, когда вашему приложению требуется специализированная сеть, например SUPL, MMS или сеть биллинга оператора связи, или если вы хотите отправлять данные с использованием определенного типа транспортного протокола.

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

  1. Создайте ConnectivityManager .
  2. Используйте класс NetworkRequest.Builder , чтобы создать объект NetworkRequest и указать сетевые функции и тип транспорта, которые интересуют ваше приложение.
  3. Чтобы найти подходящие сети, вызовите requestNetwork() или registerNetworkCallback() и передайте объект NetworkRequest и реализацию ConnectivityManager.NetworkCallback . Используйте метод requestNetwork() , если вы хотите активно переключаться на подходящую сеть после ее обнаружения; чтобы получать только уведомления о сканируемых сетях без активного переключения, вместо этого используйте метод registerNetworkCallback() .

Когда система обнаруживает подходящую сеть, она подключается к ней и вызывает обратный вызов onAvailable() . Вы можете использовать объект Network из обратного вызова, чтобы получить дополнительную информацию о сети или направить трафик на использование выбранной сети.

Bluetooth с низким энергопотреблением

В Android 4.3 в центральной роли появилась поддержка платформы Bluetooth Low Energy ( Bluetooth LE ). В Android 5.0 устройство Android теперь может выступать в качестве периферийного устройства Bluetooth LE. Приложения могут использовать эту возможность, чтобы сообщать о своем присутствии находящимся поблизости устройствам. Например, вы можете создавать приложения, которые позволяют устройству работать как шагомер или монитор здоровья и передавать свои данные другому устройству Bluetooth LE.

Новые API-интерфейсы android.bluetooth.le позволяют вашим приложениям транслировать рекламу, сканировать ответы и устанавливать соединения с близлежащими устройствами Bluetooth LE. Чтобы использовать новые функции рекламы и сканирования, добавьте разрешение BLUETOOTH_ADMIN в свой манифест. Когда пользователи обновляют или загружают ваше приложение из Play Store, им предлагается предоставить вашему приложению следующее разрешение: «Информация о подключении Bluetooth: позволяет приложению управлять Bluetooth, включая трансляцию или получение информации о ближайших устройствах Bluetooth».

Чтобы начать рекламу Bluetooth LE, чтобы другие устройства могли обнаружить ваше приложение, вызовите startAdvertising() и передайте реализацию класса AdvertiseCallback . Объект обратного вызова получает отчет об успехе или неудаче рекламной операции.

В Android 5.0 представлен класс ScanFilter , чтобы ваше приложение могло сканировать только те типы устройств, которые ему интересны. Чтобы начать сканирование устройств Bluetooth LE, вызовите startScan() и передайте список фильтров. В вызове метода вы также должны предоставить реализацию ScanCallback , чтобы сообщать об обнаружении объявления Bluetooth LE.

Улучшения NFC

В Android 5.0 добавлены следующие улучшения, позволяющие более широко и гибко использовать NFC:

  • Android Beam теперь доступен в меню общего доступа .
  • Ваше приложение может вызвать Android Beam на устройстве пользователя для обмена данными, вызвав invokeBeam() . Это избавляет пользователя от необходимости вручную прикасаться устройством к другому устройству с поддержкой NFC для завершения передачи данных.
  • Вы можете использовать новый метод createTextRecord() для создания записи NDEF, содержащей текстовые данные UTF-8.
  • Если вы разрабатываете платежное приложение, теперь у вас есть возможность динамически регистрировать идентификатор приложения NFC (AID), вызывая registerAidsForService() . Вы также можете использовать setPreferredService() для установки предпочтительной службы эмуляции карты, которая должна использоваться, когда определенное действие находится на переднем плане.

Проект Вольта

Помимо новых функций, Android 5.0 уделяет особое внимание увеличению времени автономной работы. Используйте новые API и инструменты, чтобы понять и оптимизировать энергопотребление вашего приложения.

Планирование заданий

Android 5.0 предоставляет новый API JobScheduler , который позволяет оптимизировать время автономной работы, определяя задания для асинхронного запуска системы позже или при определенных условиях (например, когда устройство заряжается). Планирование работы полезно в таких ситуациях, как:

  • В приложении есть работа, не связанная с пользователем, которую вы можете отложить.
  • В приложении есть функции, которые вы предпочитаете выполнять, когда устройство подключено к сети.
  • В приложении есть задача, требующая доступа к сети или подключения к Wi-Fi.
  • В приложении есть ряд задач, которые вы хотите запускать в пакетном режиме по регулярному расписанию.

Единица работы инкапсулируется объектом JobInfo . Этот объект определяет критерии планирования.

Используйте класс JobInfo.Builder , чтобы настроить способ запуска запланированного задания. Вы можете запланировать выполнение задачи при определенных условиях, например:

  • Запускайте, когда устройство заряжается
  • Запуск, когда устройство подключено к сети без лимита
  • Запускайте, когда устройство находится в режиме ожидания
  • Завершить до определенного срока или с минимальной задержкой

Например, вы можете добавить такой код для запуска задачи в сети без лимита:

Котлин

val uploadTask: JobInfo = JobInfo.Builder(
        jobId,
        serviceComponent /* JobService component */
).run {
    setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
    build()
}
val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
jobScheduler.schedule(uploadTask)

Джава

JobInfo uploadTask = new JobInfo.Builder(jobId,
                                         serviceComponent /* JobService component */)
        .setRequiredNetworkCapabilities(JobInfo.NETWORK_TYPE_UNMETERED)
        .build();
JobScheduler jobScheduler =
        (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(uploadTask);

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

Чтобы увидеть пример использования API JobScheduler , обратитесь к примеру реализации JobSchedulerSample в этом выпуске.

Инструменты разработчика для использования батареи

Новая команда dumpsys batterystats генерирует интересные статистические данные об использовании батареи на устройстве, организованные по уникальному идентификатору пользователя (UID). Статистика включает в себя:

  • История событий, связанных с аккумулятором
  • Глобальная статистика по устройству
  • Приблизительное энергопотребление на каждый UID и системный компонент
  • Мобильное приложение на пакет (мс)
  • Агрегированная статистика по UID системы
  • Агрегированная статистика UID приложения

Используйте опцию --help , чтобы узнать о различных вариантах настройки вывода. Например, чтобы распечатать статистику использования батареи для данного пакета приложения с момента последней зарядки устройства, выполните следующую команду:

$ adb shell dumpsys batterystats --charged <package-name>

Вы можете использовать инструмент Battery Historian на выходе команды dumpsys , чтобы создать HTML-визуализацию событий, связанных с питанием, из журналов. Эта информация поможет вам понять и диагностировать любые проблемы, связанные с аккумулятором.

Android на рабочем месте и в образовании

Управляемая подготовка

Android 5.0 предоставляет новые функции для запуска приложений в корпоративной среде. Администратор устройства может инициировать процесс управляемой подготовки, чтобы добавить к устройству сопутствующий, но отдельный управляемый профиль , если у пользователя есть существующая личная учетная запись. Приложения, связанные с управляемыми профилями, отображаются рядом с неуправляемыми приложениями на панели запуска пользователя, экране последних событий и уведомлениях.

Чтобы запустить процесс управляемой подготовки, отправьте ACTION_PROVISION_MANAGED_PROFILE в Intent . Если вызов успешен, система запускает обратный вызов onProfileProvisioningComplete() . Затем вы можете вызвать setProfileEnabled() чтобы включить этот управляемый профиль.

По умолчанию в управляемом профиле включена только небольшая часть приложений. Вы можете установить дополнительные приложения в управляемый профиль, вызвав enableSystemApp() .

Если вы разрабатываете приложение Launcher, вы можете использовать новый класс LauncherApps , чтобы получить список запускаемых действий для текущего пользователя и всех связанных управляемых профилей. Программа запуска может сделать управляемые приложения визуально заметными, добавив рабочий значок к рисуемому значку. Чтобы получить значок со значком, вызовите getUserBadgedIcon() .

Чтобы узнать, как использовать новую функциональность, обратитесь к примеру реализации BasicManagedProfile в этом выпуске.

Владелец устройства

В Android 5.0 появилась возможность развертывания приложения владельца устройства. Владелец устройства — это администратор устройства специального типа, который имеет дополнительные возможности создавать и удалять дополнительных пользователей, а также настраивать глобальные параметры на устройстве. Приложение владельца вашего устройства может использовать методы класса DevicePolicyManager для детального управления конфигурацией, безопасностью и приложениями на управляемых устройствах. Одновременно у устройства может быть только один активный владелец устройства.

Чтобы развернуть и активировать владельца устройства, необходимо выполнить передачу данных NFC из приложения для программирования на устройство, пока устройство находится в неподготовленном состоянии. При этой передаче данных отправляется та же информация, что и в намерении предоставления, описанном в разделе «Управляемая подготовка» .

Закрепление экрана

В Android 5.0 представлен новый API для закрепления экрана, который позволяет временно запретить пользователям покидать вашу задачу или прерываться уведомлениями. Это можно использовать, например, если вы разрабатываете образовательное приложение для поддержки высоких требований к оценке ставок на Android или специализированное приложение или киоск-приложение. Как только ваше приложение активирует закрепление экрана, пользователи не смогут видеть уведомления, получать доступ к другим приложениям или возвращаться на главный экран, пока ваше приложение не выйдет из этого режима.

Есть два способа активировать закрепление экрана:

  • Вручную: пользователи могут включить закрепление экрана в меню «Настройки» > «Безопасность» > «Закрепление экрана» и выбирать задачи, которые они хотят закрепить, коснувшись зеленого значка булавки на экране «Последние».
  • Программно. Чтобы программно активировать закрепление экрана, вызовите startLockTask() из своего приложения. Если запрашивающее приложение не является владельцем устройства, пользователю будет предложено подтверждение. Приложение владельца устройства может вызвать метод setLockTaskPackages() чтобы обеспечить возможность закрепления приложений без этапа подтверждения пользователя.

Когда блокировка задач активна, происходит следующее:

  • Строка состояния пуста, а уведомления пользователя и информация о состоянии скрыты.
  • Кнопки «Домой» и «Недавние приложения» скрыты.
  • Другие приложения не могут запускать новые действия.
  • Текущее приложение может начинать новые действия, если это не создает новых задач.
  • Когда владелец устройства вызывает закрепление экрана, пользователь остается заблокированным в вашем приложении до тех пор, пока приложение не вызовет stopLockTask() .
  • Если закрепление экрана активировано другим приложением, которое не является владельцем устройства, или непосредственно пользователем, пользователь может выйти, удерживая кнопки «Назад» и «Последние».

Печать Рамок

Преобразовать PDF в растровое изображение

Теперь вы можете преобразовать страницы PDF-документа в растровые изображения для печати с помощью нового класса PdfRenderer . Вы должны указать ParcelFileDescriptor , доступный для поиска (то есть контент может быть доступен в произвольном порядке), в который система записывает содержимое для печати. Ваше приложение может получить страницу для рендеринга с помощью openPage() , а затем вызвать render() , чтобы превратить открытый PdfRenderer.Page в растровое изображение. Вы также можете установить дополнительные параметры, если хотите преобразовать в растровое изображение только часть документа (например, чтобы реализовать мозаичный рендеринг для увеличения документа).

Пример использования новых API см. в образце PdfRendererBasic .

Система

Статистика использования приложения

Теперь вы можете получить доступ к истории использования приложений на устройстве Android с помощью нового API android.app.usage . Этот API предоставляет более подробную информацию об использовании, чем устаревший метод getRecentTasks() . Чтобы использовать этот API, вы должны сначала объявить разрешение "android.permission.PACKAGE_USAGE_STATS" в своем манифесте. Пользователь также должен включить доступ для этого приложения через «Настройки» > «Безопасность» > «Приложения с доступом к использованию».

Система собирает данные об использовании для каждого приложения, объединяя данные за ежедневные, еженедельные, ежемесячные и годовые интервалы. Максимальный срок, в течение которого система хранит эти данные, составляет:

  • Ежедневные данные: 7 дней
  • Еженедельные данные: 4 недели
  • Ежемесячные данные: 6 месяцев
  • Годовые данные: 2 года

Для каждого приложения система записывает следующие данные:

  • Последний раз, когда приложение использовалось
  • Общая продолжительность времени, в течение которого приложение находилось на переднем плане за этот интервал времени (по дням, неделям, месяцам или годам).
  • Отметка времени, фиксирующая, когда компонент (определяемый пакетом и именем действия) перемещается на передний или задний план в течение дня.
  • Регистрация временной метки при изменении конфигурации устройства (например, при изменении ориентации устройства из-за вращения)

Тестирование и доступность

Улучшения тестирования и доступности

В Android 5.0 добавлена ​​следующая поддержка тестирования и доступности:

  • Новые методы getWindowAnimationFrameStats() и getWindowContentFrameStats() собирают статистику кадров для анимации окон и содержимого. Эти методы позволяют вам писать инструментальные тесты, чтобы оценить, отображает ли приложение кадры с достаточной частотой обновления, чтобы обеспечить плавное взаимодействие с пользователем.
  • Новый метод executeShellCommand() позволяет выполнять команды оболочки из вашего инструментального теста. Выполнение команды аналогично запуску adb shell с хоста, подключенного к устройству, что позволяет использовать инструменты на основе оболочки, такие как dumpsys , am , content и pm .
  • Службы специальных возможностей и инструменты тестирования, использующие API специальных возможностей (например, UiAutomator ), теперь могут получать подробную информацию о свойствах окон на экране, с которыми могут взаимодействовать зрячие пользователи. Чтобы получить список объектов AccessibilityWindowInfo , вызовите новый метод getWindows() .
  • Новый класс AccessibilityNodeInfo.AccessibilityAction позволяет определять стандартные или настраиваемые действия, выполняемые с AccessibilityNodeInfo . Новый класс AccessibilityNodeInfo.AccessibilityAction заменяет API-интерфейсы, связанные с действиями, которые ранее находились в AccessibilityNodeInfo .
  • Android 5.0 обеспечивает более детальный контроль над синтезом речи в вашем приложении. Новый класс Voice позволяет вашему приложению использовать голосовые профили, связанные с конкретными языковыми стандартами, рейтингом качества и задержки, а также параметрами, специфичными для механизма преобразования текста в речь.

IME

Более простое переключение между языками ввода

Начиная с Android 5.0, пользователи могут легче переключаться между всеми редакторами методов ввода (IME), поддерживаемыми платформой. Выполнение назначенного действия по переключению (обычно касание значка глобуса на программной клавиатуре) циклически переключает все такие IME. Это изменение в поведении реализуется методом shouldOfferSwitchingToNextInputMethod() .

Кроме того, платформа теперь проверяет, включает ли следующий IME вообще механизм переключения (и, следовательно, поддерживает ли этот IME переключение на IME после него). IME с механизмом переключения не будет переключаться на IME без него. Это изменение в поведении реализуется методом switchToNextInputMethod() .

Чтобы увидеть пример использования обновленных API-интерфейсов переключения IME, обратитесь к обновленному примеру реализации программной клавиатуры в этом выпуске. Дополнительные сведения о том, как реализовать переключение между IME, см. в разделе Создание метода ввода .

Манифестные декларации

Объявляемые необходимые функции

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

Разрешения пользователя

Следующее разрешение теперь поддерживается в элементе <uses-permission> для объявления разрешений, необходимых вашему приложению для доступа к определенным API.

  • BIND_DREAM_SERVICE : при настройке уровня API 21 и выше это разрешение требуется службе Daydream , чтобы гарантировать, что только система может привязаться к нему.