API Android 3.1

Уровень API: 12

Для разработчиков платформа Android 3.1 ( HONEYCOMB_MR1 ) доступна в виде загружаемого компонента для Android SDK. Загружаемая платформа включает в себя библиотеку Android и образ системы, а также набор скинов эмулятора и многое другое. Загружаемая платформа не содержит внешних библиотек.

Для разработчиков платформа Android 3.1 доступна в виде загружаемого компонента Android SDK. Загружаемая платформа включает в себя библиотеку Android и образ системы, а также набор скинов эмулятора и многое другое. Чтобы начать разработку или тестирование для Android 3.1, используйте Android SDK Manager, чтобы загрузить платформу в свой SDK.

Обзор API

В разделах ниже представлен технический обзор того, что нового для разработчиков в Android 3.1, включая новые функции и изменения в API платформы по сравнению с предыдущей версией.

USB-API

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

Стек и API различают два основных типа USB-оборудования в зависимости от того, выступает ли устройство под управлением Android в качестве хоста или внешнее оборудование выступает в качестве хоста:

  • USB-устройство — это часть подключенного оборудования, которое зависит от устройства под управлением Android в качестве хоста. Например, большинство устройств ввода, мышей и джойстиков являются USB-устройствами, как и многие камеры, концентраторы и т. д.
  • USB-аксессуар — это часть подключенного оборудования, которая имеет хост-контроллер USB, обеспечивает питание и предназначена для связи с устройствами на базе Android через USB. В качестве аксессуаров можно подключать различные периферийные устройства: от контроллеров робототехники до музыкального оборудования и велотренажеров. и многое другое.

Для обоих типов — USB-устройств и USB-аксессуаров — USB-API платформы поддерживают обнаружение путем широковещательной рассылки при подключении или отсоединении, а также стандартные интерфейсы, конечные точки и режимы передачи (управление, групповая передача и прерывание).

API-интерфейсы USB доступны в пакете android.hardware.usb . Центральным классом является UsbManager , который предоставляет вспомогательные методы для идентификации и взаимодействия как с USB-устройствами, так и с USB-аксессуарами. Приложения могут получить экземпляр UsbManager , а затем запросить список подключенных устройств или аксессуаров, а затем взаимодействовать с ними или управлять ими. UsbManager также объявляет действия о намерениях, которые транслирует система, чтобы сообщить, когда USB-устройство или аксессуар подключены или отключены.

Другие классы включают:

  • UsbDevice — класс, представляющий внешнее оборудование, подключенное как USB-устройство (при этом устройство под управлением Android выступает в качестве хоста).
  • UsbAccessory , представляющий внешнее оборудование, подключенное в качестве USB-хоста (при этом устройство под управлением Android выступает в качестве USB-устройства).
  • UsbInterface и UsbEndpoint , которые обеспечивают доступ к стандартным USB-интерфейсам и конечным точкам устройства.
  • UsbDeviceConnection и UsbRequest для отправки и получения данных и управляющих сообщений на USB-устройство или с него синхронно и асинхронно.
  • UsbConstants , предоставляющий константы для объявления типов конечных точек, классов устройств и т. д.

Обратите внимание: хотя стек USB встроен в платформу, фактическая поддержка режимов USB-хоста и открытых аксессуаров на конкретных устройствах определяется их производителями. В частности, режим хоста зависит от соответствующего аппаратного обеспечения USB-контроллера на устройстве под управлением Android.

Кроме того, разработчики могут запросить фильтрацию в Google Play, чтобы их приложения были недоступны пользователям, чьи устройства не обеспечивают соответствующую поддержку USB. Чтобы запросить фильтрацию, добавьте в манифест приложения один или оба приведенных ниже элемента:

  • Если приложение должно быть видно только устройствам, поддерживающим режим USB-хоста (подключение USB-устройств), объявите этот элемент:

    <uses-feature android:name="android.hardware.usb.host" android:required="true">

  • Если приложение должно быть видно только устройствам, поддерживающим USB-аксессуары (подключение USB-хостов), объявите этот элемент:

    <uses-feature android:name="android.hardware.usb.accessory" android:required="true">

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

Чтобы просмотреть примеры приложений, использующих API-интерфейс USB-хоста, см. ADB Test and Missile Launcher.

API МТР/ПТП

В Android 3.1 представлен новый API MTP, который позволяет приложениям напрямую взаимодействовать с подключенными камерами и другими устройствами PTP. Новый API позволяет приложению легко получать уведомления при подключении и удалении устройств, управлять файлами и хранилищем на этих устройствах, а также передавать файлы и метаданные на них и обратно. MTP API реализует подмножество PTP (протокол передачи изображений) спецификации MTP (протокол передачи мультимедиа).

API MTP доступен в пакете android.mtp и предоставляет следующие классы:

  • MtpDevice инкапсулирует устройство MTP, подключенное через хост-шину USB. Приложение может создать экземпляр объекта этого типа и затем использовать его методы для получения информации об устройстве и хранящихся на нем объектах, а также для открытия соединения и передачи данных. Некоторые из методов включают в себя:
    • getObjectHandles() возвращает список дескрипторов всех объектов на устройстве, соответствующих указанному формату и родительскому элементу. Чтобы получить информацию об объекте, приложение может передать дескриптор функции getObjectInfo() .
    • importFile() позволяет приложению копировать данные объекта в файл во внешнем хранилище. Этот вызов может блокироваться на произвольное время в зависимости от размера данных и скорости устройств, поэтому его следует выполнять из отдельного потока.
    • open() позволяет приложению открыть подключенное устройство MTP/PTP.
    • getThumbnail() возвращает миниатюру объекта в виде массива байтов.
  • MtpStorageInfo содержит информацию об устройстве хранения на устройстве MTP, соответствующую набору данных StorageInfo, описанному в разделе 5.2.2 спецификации MTP. Методы класса позволяют приложению получить строку описания устройства хранения, свободное пространство, максимальную емкость хранилища, идентификатор хранилища и идентификатор тома.
  • MtpDeviceInfo содержит информацию об устройстве MTP, соответствующую набору данных DeviceInfo, описанному в разделе 5.1.1 спецификации MTP. Методы класса позволяют приложениям получать информацию о производителе, модели, серийном номере и версии устройства.
  • MtpObjectInfo содержит информацию об объекте, хранящемся на устройстве MTP, соответствующую набору данных ObjectInfo, описанному в разделе 5.3.1 спецификации MTP. Методы класса позволяют приложениям получать размер объекта, формат данных, тип ассоциации, дату создания и информацию об эскизе.
  • MtpConstants предоставляет константы для объявления кодов формата файлов MTP, типа ассоциации и состояния защиты.

Поддержка новых устройств ввода и событий движения.

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

Для обработки ввода с помощью мыши, колеса прокрутки и трекбола платформа поддерживает два новых действия при движении:

  • ACTION_SCROLL , который описывает местоположение указателя, в котором произошло движение прокрутки без касания, например, с помощью колеса прокрутки мыши. В MotionEvent значение осей AXIS_HSCROLL и AXIS_VSCROLL определяет относительное движение прокрутки.
  • ACTION_HOVER_MOVE сообщает текущую позицию мыши, когда ни одна кнопка не нажата, а также любые промежуточные точки с момента последнего события HOVER_MOVE . Уведомления о входе и выходе при наведении пока не поддерживаются.

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

Чтобы описать события движения из этих новых источников, а также от мышей и трекболов, платформа теперь определяет коды осей в MotionEvent , аналогично тому, как она определяет коды клавиш в KeyEvent . Новые коды осей для джойстиков и игровых контроллеров включают AXIS_HAT_X , AXIS_HAT_Y , AXIS_RTRIGGER , AXIS_ORIENTATION , AXIS_THROTTLE и многие другие. Существующие оси MotionEvent представлены AXIS_X , AXIS_Y , AXIS_PRESSURE , AXIS_SIZE , AXIS_TOUCH_MAJOR , AXIS_TOUCH_MINOR , AXIS_TOOL_MAJOR , AXIS_TOOL_MINOR и AXIS_ORIENTATION .

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

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

Некоторые оси можно получить с помощью специальных методов доступа. Например, вместо вызова getAxisValue() приложения могут вызывать getX() . Оси со встроенными средствами доступа включают AXIS_X , AXIS_Y , AXIS_PRESSURE , AXIS_SIZE , AXIS_TOUCH_MAJOR , AXIS_TOUCH_MINOR , AXIS_TOOL_MAJOR , AXIS_TOOL_MINOR и AXIS_ORIENTATION .

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

Наконец, поскольку события движения от джойстиков, геймпадов, мышей и трекболов не являются событиями касания, платформа добавляет новый метод обратного вызова для передачи их в View как «универсальные» события движения. В частности, он сообщает о событиях движения без касания в View через вызов onGenericMotionEvent() , а не onTouchEvent() .

Платформа отправляет общие события движения по-разному, в зависимости от класса источника событий. События SOURCE_CLASS_POINTER передаются в View под указателем, аналогично тому, как работают события касания. Все остальные переходят к View , сфокусированному в данный момент. Например, это означает, что View должно получить фокус, чтобы получать события джойстика. При необходимости приложения могут обрабатывать эти события на уровне Activity или Dialog, вместо этого реализуя там onGenericMotionEvent() .

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

RTP API

Android 3.1 предоставляет API для своего встроенного стека RTP (транспортный протокол реального времени), который приложения могут использовать для управления потоковой передачей данных по запросу или в интерактивном режиме. В частности, приложения, которые обеспечивают VOIP, PTT, конференц-связь и потоковое аудио, могут использовать API для инициации сеансов и передачи или получения потоков данных по любой доступной сети.

API RTP доступен в пакете android.net.rtp . Занятия включают в себя:

  • RtpStream — базовый класс потоков, которые отправляют и получают сетевые пакеты с полезными данными мультимедиа через RTP.
  • AudioStream — подкласс RtpStream , который передает аудиополезные данные через RTP.
  • AudioGroup — локальный аудиохаб для управления и микширования динамика устройства, микрофона и AudioStream .
  • AudioCodec , который содержит коллекцию кодеков, которые вы определяете для AudioStream .

Для поддержки аудиоконференций и подобных применений приложение создает экземпляры двух классов в качестве конечных точек потока:

  • AudioStream указывает удаленную конечную точку и состоит из сопоставления сети и настроенного AudioCodec .
  • AudioGroup представляет локальную конечную точку для одного или нескольких AudioStream s. AudioGroup смешивает все AudioStream и, при необходимости, одновременно взаимодействует с динамиком устройства и микрофоном.

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

Чтобы использовать RTP API, приложения должны запросить разрешение у пользователя, объявив <uses-permission android:name="android.permission.INTERNET"> в своих файлах манифеста. Чтобы получить микрофон устройства, также требуется разрешение <uses-permission android:name="android.permission.RECORD_AUDIO"> .

Изменяемые размеры виджетов приложений

Начиная с Android 3.1, разработчики могут изменять размер виджетов на главном экране — по горизонтали, вертикали или по обеим осям. Пользователи касаются и удерживают виджет, чтобы отобразить его маркеры изменения размера, а затем перетаскивают горизонтальные и/или вертикальные маркеры, чтобы изменить размер в сетке макета.

Разработчики могут изменить размер любого виджета главного экрана, определив атрибут resizeMode в метаданных виджета AppWidgetProviderInfo . Значения атрибута resizeMode включают «горизонтальный», «вертикальный» и «нет». Чтобы объявить виджет как изменяемый по горизонтали и вертикали, укажите значение «horizontal|vertical».

Вот пример:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure"
    android:resizeMode="horizontal|vertical" >
</appwidget-provider>

Дополнительную информацию о виджетах главного экрана см. в документации по виджетам приложений .

Фреймворк анимации

  • Новый класс ViewPropertyAnimator.
    • Новый класс ViewPropertyAnimator предоставляет разработчикам удобный способ анимировать выбранные свойства объектов View . Класс автоматизирует и оптимизирует анимацию свойств и упрощает управление несколькими одновременными анимациями объекта View .

      Использовать ViewPropertyAnimator очень просто. Чтобы анимировать свойства View , вызовите animate() , чтобы создать объект ViewPropertyAnimator для этого View . Используйте методы ViewPropertyAnimator , чтобы указать, какое свойство анимировать и как его анимировать. Например, чтобы сделать View прозрачным, вызовите alpha(0); . Объект ViewPropertyAnimator обрабатывает детали настройки базового класса Animator и его запуска, а затем рендеринга анимации.

  • Цвет фона анимации
    • Новые методы getBackgroundColor() и setBackgroundColor(int) позволяют получать/устанавливать цвет фона анимации только для оконной анимации. В настоящее время фон должен быть черным с любым желаемым уровнем альфа.
  • Получение анимированной дроби из ViewAnimator
    • Новый метод getAnimatedFraction() позволяет получить текущую долю анимации — прошедшую/интерполированную долю, использованную в самом последнем обновлении кадра — из ValueAnimator .

Фреймворк пользовательского интерфейса

  • Принудительный рендеринг слоя
    • Новый метод buildLayer() позволяет приложению принудительно создать слой представления и немедленно отобразить представление в нем. Например, приложение может использовать этот метод для рендеринга представления в его слой перед запуском анимации. Если представление сложное, его рендеринг в слой перед запуском анимации позволит избежать пропуска кадров.
  • Расстояние камеры
    • Приложения могут использовать новый метод setCameraDistance(float) для установки расстояния от камеры до представления. Это дает приложениям улучшенный контроль над трехмерными преобразованиями представления, такими как повороты.
  • Получение представления календаря из DatePicker
  • Получение обратных вызовов при отсоединении представлений
  • Прослушиватель хлебных крошек фрагмента, новая подпись onInflate()
  • Отобразить результат поиска в новой вкладке
    • Ключ данных EXTRA_NEW_SEARCH для намерений ACTION_WEB_SEARCH позволяет открыть поиск в новой вкладке браузера, а не в существующей.
  • Рисуемый текстовый курсор
    • Теперь вы можете указать объект рисования, который будет использоваться в качестве текстового курсора, используя новый атрибут ресурса textCursorDrawable .
  • Настройка отображаемого дочернего элемента в удаленных представлениях
  • Универсальные клавиши для геймпадов и других устройств ввода
    • KeyEvent добавляет ряд общих кодов клавиш для кнопок геймпада. Класс также добавляет isGamepadButton(int) и несколько других вспомогательных методов для работы с кодами клавиш.

Графика

  • Помощники для управления растровыми изображениями
    • setHasAlpha(boolean) позволяет приложению указать, что все пиксели в растровом изображении непрозрачны (ложь) или что некоторые из пикселей могут содержать непрозрачные альфа-значения (истина). Обратите внимание: для некоторых конфигураций (например, RGB_565) этот вызов игнорируется, поскольку он не поддерживает попиксельные альфа-значения. Это задумано как подсказка для рисования, поскольку в некоторых случаях растровое изображение, которое, как известно, является непрозрачным, может обрабатываться быстрее, чем то, которое может иметь непрозрачные значения альфа для каждого пикселя.
    • getByteCount() получает размер растрового изображения в байтах.
    • getGenerationId() позволяет приложению узнать, было ли изменено растровое изображение, например, для кэширования.
    • sameAs(android.graphics.Bitmap) определяет, отличается ли данное растровое изображение от текущего растрового изображения по размерам, конфигурации или пиксельным данным.
  • Настройка местоположения и вращения камеры
    • Camera добавляет два новых метода rotate() и setLocation() для управления местоположением камеры и 3D-преобразований.

Сеть

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

      Чтобы создать высокопроизводительную блокировку, передайте WIFI_MODE_FULL_HIGH_PERF в качестве режима блокировки при вызове createWifiLock() .

  • Дополнительная статистика трафика
    • Приложения теперь могут получать доступ к статистике о большем количестве типов использования сети, используя новые методы TrafficStats . Приложения могут использовать эти методы для получения статистики UDP, количества пакетов, байтов и сегментов передачи/получения TCP для заданного UID.
  • Имя пользователя SIP-авторизации
    • Приложения теперь могут получать и устанавливать имя пользователя аутентификации SIP для профиля, используя новые методы getAuthUserName() и setAuthUserName() .

Менеджер загрузок

  • Обработка завершенных загрузок
    • Приложения теперь могут инициировать загрузку, уведомляя пользователей только о завершении. Чтобы инициировать загрузку этого типа, приложения передают VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION в методе setNotificationVisibility() объекта запроса.
    • Новый метод addCompletedDownload() позволяет приложению добавлять файл в базу данных загрузок, чтобы приложение «Загрузки» могло управлять им.
  • Показать загрузки, отсортированные по размеру
    • Приложения могут запускать приложение «Загрузки» в режиме сортировки по размеру, добавляя новый дополнительный INTENT_EXTRAS_SORT_BY_SIZE к намерению ACTION_VIEW_DOWNLOADS .

Структура IME

  • Получение ключа дополнительного значения метода ввода
    • InputMethodSubtype добавляет метод containsExtraValueKey() для проверки того, сохранена ли строка ExtraValue для подтипа, и метод getExtraValueOf() для извлечения определенного значения ключа из хэш-карты ExtraValue.

СМИ

  • Новые форматы потокового аудио
    • Медиа-фреймворк добавляет встроенную поддержку необработанного контента ADTS AAC для улучшенной потоковой передачи звука, а также поддержку звука FLAC для сжатого аудиоконтента высочайшего качества (без потерь). Дополнительную информацию см. в документе «Поддерживаемые форматы мультимедиа» .

Элементы управления запуском остановленных приложений

Начиная с Android 3.1, системный менеджер пакетов отслеживает приложения, находящиеся в остановленном состоянии, и предоставляет средства контроля их запуска из фоновых процессов и других приложений.

Обратите внимание, что состояние остановки приложения — это не то же самое, что состояние остановки действия. Система управляет этими двумя остановленными состояниями отдельно.

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

  • FLAG_INCLUDE_STOPPED_PACKAGES — включить фильтры намерений остановленных приложений в список потенциальных целей для разрешения.
  • FLAG_EXCLUDE_STOPPED_PACKAGES — исключить фильтры намерений остановленных приложений из списка потенциальных целей.

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

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

Приложения находятся в остановленном состоянии, когда они впервые установлены, но еще не запущены, а также когда они вручную остановлены пользователем (в разделе «Управление приложениями»).

Уведомление о первом запуске и обновлении приложения

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

  • ACTION_PACKAGE_FIRST_LAUNCH — отправляется в установочный пакет приложения при первом запуске этого приложения (то есть при первом выходе его из остановленного состояния). Данные содержат имя пакета.
  • ACTION_MY_PACKAGE_REPLACED — уведомляет приложение о том, что оно было обновлено, причем новая версия была установлена ​​поверх существующей. Это отправляется только в приложение, которое было заменено. Он не содержит никаких дополнительных данных. Чтобы его получить, объявите фильтр намерений для этого действия. Вы можете использовать намерение для запуска кода, который поможет вернуть вашему приложению работоспособность после обновления.

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

Основные утилиты

  • LRU-кэш
    • Новый класс LruCache позволяет вашим приложениям эффективно кэшировать. Приложения могут использовать этот класс, чтобы сократить время, затрачиваемое на вычисления или загрузку данных из сети, сохраняя при этом разумный объем памяти для кэшированных данных. LruCache — это кеш, который содержит сильные ссылки на ограниченное количество значений. При каждом доступе к значению оно перемещается в начало очереди. Когда значение добавляется в полный кэш, значение в конце этой очереди вытесняется и может стать пригодным для сборки мусора.
  • Дескриптор файла как int
    • Теперь вы можете получить собственный файловый дескриптор int для ParcelFileDescriptor используя любой из новых методов getFd() или detachFd() .

Вебкит

  • Файловая схема файлов cookie
    • CookieManager теперь поддерживает файлы cookie, которые используют схему file: URI. Вы можете использовать setAcceptFileSchemeCookies() чтобы включить/отключить поддержку файлов cookie файловой схемы перед созданием экземпляра WebView или CookieManager . В экземпляре CookieManager вы можете проверить, включены ли файлы cookie файловой схемы, вызвав allowFileSchemeCookies() .
  • Уведомление о запросе на вход
    • Для поддержки функций автоматического входа в браузер, представленных в Android 3.0, новый метод onReceivedLoginRequest() уведомляет ведущее приложение о том, что запрос на автоматический вход пользователя был обработан.
  • Удалены классы и интерфейсы
    • Несколько классов и интерфейсов были удалены из общедоступного API, поскольку ранее они находились в устаревшем состоянии. Дополнительную информацию см. в отчете о различиях API .

Браузер

Приложение браузера добавляет следующие функции для поддержки веб-приложений:

  • Поддержка встроенного воспроизведения видео, встроенного в тег HTML5 <video> . Воспроизведение, где это возможно, ускоряется аппаратно.
  • Поддержка слоев для элементов с фиксированным положением для всех сайтов (мобильных и настольных).

Новые константы функций

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

  • android.hardware.usb.accessory — приложение использует USB API для связи с внешними аппаратными устройствами, подключенными через USB, и функционирует в качестве хостов.
  • android.hardware.usb.host — приложение использует USB API для связи с внешними аппаратными устройствами, подключенными через USB, и функционирует как устройства.

Google Play фильтрует приложения на основе функций, объявленных в элементах манифеста <uses-feature> . Дополнительные сведения об объявлении функций в манифесте приложения см. в разделе Фильтры Google Play .

Отчет о различиях API

Подробное описание всех изменений API в Android 3.1 (уровень API 12) см. в отчете о различиях API .

Уровень API

Платформа Android 3.1 предоставляет обновленную версию API платформы. API Android 3.1 присвоен целочисленный идентификатор — 12 , который хранится в самой системе. Этот идентификатор, называемый «уровнем API», позволяет системе правильно определить, совместимо ли приложение с системой, до его установки.

Чтобы использовать API-интерфейсы, представленные в Android 3.1, в вашем приложении, вам необходимо скомпилировать приложение с помощью библиотеки Android, предоставляемой на платформе Android 3.1 SDK. В зависимости от ваших потребностей вам также может потребоваться добавить атрибут android:minSdkVersion="12" к элементу <uses-sdk> в манифесте приложения.

Для получения дополнительной информации прочитайте «Что такое уровень API?».