4fd1a573eb
Bug: 21789313 Change-Id: Ifb4a45a65acd7b786e05bdf7b7dd86698093fbdf
522 lines
51 KiB
Plaintext
522 lines
51 KiB
Plaintext
page.title=Обзор API-интерфейсов
|
||
page.keywords=предварительная версия,пакет sdk,совместимость
|
||
page.tags=previewresources, androidm
|
||
sdk.platform.apiLevel=22-mnc
|
||
page.image=images/cards/card-api-overview_16-9_2x.png
|
||
@jd:body
|
||
|
||
|
||
<div id="qv-wrapper">
|
||
<div id="qv">
|
||
|
||
<h2>Содержание
|
||
<a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle">
|
||
<span class="more">развернуть</span>
|
||
<span class="less" style="display:none">свернуть</span></a></h2>
|
||
|
||
<ol id="toc44" class="hide-nested">
|
||
<li><a href="#app-linking">Связывание приложений</a></li>
|
||
<li><a href="#backup">Автоматическое резервное копирование для приложений</a></li>
|
||
<li><a href="#authentication">Авторизация</a>
|
||
<ol>
|
||
<li><a href="#fingerprint-authentication">Авторизация по отпечатку пальца</a></li>
|
||
<li><a href="#confirm-credential">Подтверждение учетных данных</a></li>
|
||
</ol>
|
||
</li>
|
||
<li><a href="#direct-share">Прямой обмен контентом</a></li>
|
||
<li><a href="#voice-interactions">Голосовой интерфейс</a></li>
|
||
<li><a href="#assist">API-интерфейс помощника</a></li>
|
||
<li><a href="#notifications">Уведомления</a></li>
|
||
<li><a href="#bluetooth-stylus">Поддержка пера Bluetooth</a></li>
|
||
<li><a href="#ble-scanning">Улучшенное сканирование Bluetooth с низким потреблением энергии</a></li>
|
||
<li><a href="#hotspot">Поддержка Hotspot 2.0, выпуск 1</a></li>
|
||
<li><a href="#4K-display">Режим отображения в формате 4K</a></li>
|
||
<li><a href="#behavior-themeable-colorstatelists">Метод ColorStateLists для работы с темами</a></li>
|
||
<li><a href="#audio">Работа с аудио</a></li>
|
||
<li><a href="#video">Работа с видео</a></li>
|
||
<li><a href="#camera">Возможности камеры</a>
|
||
<ol>
|
||
<li><a href="#flashlight">API-интерфейс вспышки</a></li>
|
||
<li><a href="#reprocessing">Повторная обработка изображения с камеры</a></li>
|
||
</ol>
|
||
</li>
|
||
<li><a href="#afw">Возможности Android for Work</a></li>
|
||
</ol>
|
||
|
||
<h2>Различия между API-интерфейсами</h2>
|
||
<ol>
|
||
<li><a href="{@docRoot}preview/download.html">API уровня 22 в M Preview »</a> </li>
|
||
</ol>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<p>M Developer Preview — ознакомительная версия предстоящего выпуска платформы Android,
|
||
в котором реализованы новые возможности как для пользователей, так и для
|
||
разработчиков приложений. В этой статье мы расскажем о наиболее интересных API-интерфейсах.</p>
|
||
|
||
<p>Версия M Developer Preview предназначена для тех, <strong>кто хочет первым ознакомиться с новой платформой</strong>,
|
||
а также для <strong>тестировщиков</strong>. <a href="{@docRoot}preview/setup-sdk.html">M Developer Preview — прекрасная возможность
|
||
</a>повлиять на вектор развития
|
||
платформы Android.
|
||
Мы с нетерпением ждем ваших отзывов!</p>
|
||
|
||
<p class="caution"><strong>Внимание!</strong> Не публикуйте в магазине Google Play приложения,
|
||
предназначенные для M Developer Preview.</p>
|
||
|
||
<p class="note"><strong>Примечание.</strong> В этой статье часто упоминаются классы и методы,
|
||
для которых на сайте <a href="{@docRoot}">developer.android.com</a> пока еще нет справочных материалов. Такие элементы API-интерфейса обозначаются здесь следующим образом:
|
||
{@code code style} (без гиперссылок). Чтобы ознакомиться с предварительной документацией по этим элементам,
|
||
загрузите <a href="{@docRoot}preview/download.html#docs">справочное руководство по предварительной версии</a>.</p>
|
||
|
||
<h3>Важные изменения в работе приложений</h3>
|
||
|
||
<p>Если вы ранее публиковали приложения для Android, то примите во внимание, что изменения в платформе могут повлиять
|
||
на работу опубликованных приложений.</p>
|
||
|
||
<p>Подробные сведения представлены в статье <a href="behavior-changes.html">Изменения в работе</a>.</p>
|
||
|
||
<h2 id="app-linking">Связывание приложений</h2>
|
||
<p>В M Preview улучшена система намерений Android за счет более эффективного связывания приложений.
|
||
Теперь у вас есть возможность связывать приложения с вашими собственными веб-доменами. Благодаря этому
|
||
платформа может сама, без вмешательства пользователя, определить приложение, которое будет использоваться по умолчанию
|
||
для обработки определенной веб-ссылки. О том, как реализовать такую возможность, можно почитать в статье
|
||
<a href="{@docRoot}preview/features/app-linking.html">Связывание приложений</a>.
|
||
|
||
<h2 id="backup">Автоматическое резервное копирование для приложений</h2>
|
||
<p>Теперь система автоматически выполняет полное резервное копирование и восстановление данных ваших приложений. Для приложений,
|
||
написанных под M Preview, эта функция включена по умолчанию — вам даже не нужно добавлять отдельный код. Если пользователь решит удалить свою учетную запись Google, все резервные копии его данных также будут удалены.
|
||
О том, как работает эта функция и как настроить параметры резервного копирования элементов файловой системы,
|
||
рассказано в статье
|
||
<a href="{@docRoot}preview/backup/index.html">Автоматическое резервное копирование для приложений</a>.</p>
|
||
|
||
<h2 id="authentication">Авторизация</h2>
|
||
<p>В M Preview представлены новые API-интерфейсы, которые позволяют авторизовать пользователей по отпечатку пальца
|
||
(на устройствах, поддерживающих такую возможность), а также подтвердить учетные данные, если пользователь недавно авторизовался через механизмы разблокировки устройства
|
||
(например, вводил пароль для разблокировки экрана). Эти API-интерфейсы рекомендуется использовать совместно с
|
||
<a href="{@docRoot}training/articles/keystore.html">системой хранилища ключей Android</a>.</p>
|
||
|
||
<h3 id="fingerprint-authentication">Авторизация по отпечатку пальца</h3>
|
||
|
||
<p>Чтобы авторизовать пользователя по отпечатку пальца, получите экземпляр нового класса
|
||
{@code android.hardware.fingerprint.FingerprintManager} и вызовите метод
|
||
{@code FingerprintManager.authenticate()}. Эта функция доступна для совместимых
|
||
устройств, оснащенных сканером отпечатков пальцев. Прежде всего, вам необходимо реализовать в своем приложении пользовательский интерфейс проверки
|
||
подлинности по отпечатку пальца, а также использовать для него стандартный значок отпечатка пальца Android.
|
||
Этот значок ({@code c_fp_40px.png}) вы можете найти в
|
||
<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">примере приложения</a>. При разработке нескольких приложений, использующих функцию авторизации по отпечатку пальца,
|
||
помните, что каждое из них должно самостоятельно выполнять проверку подлинности.
|
||
</p>
|
||
|
||
<p>Чтобы реализовать эту функцию, сначала добавьте в файл манифеста разрешение {@code USE_FINGERPRINT}.
|
||
</p>
|
||
|
||
<pre>
|
||
<uses-permission
|
||
android:name="android.permission.USE_FINGERPRINT" />
|
||
</pre>
|
||
|
||
<img src="{@docRoot}preview/images/fingerprint-screen.png" srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, {@docRoot}preview/images/fingerprint-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
|
||
|
||
<p>Пример такой проверки подлинности вы найдете в
|
||
<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">примере
|
||
диалогового окна авторизации по отпечатку пальца</a>.</p>
|
||
|
||
<p>Если вы тестируете эту функцию, выполните следующие действия:</p>
|
||
<ol>
|
||
<li>Установите инструменты SDK Android (версию 24.3), если у вас их еще нет.</li>
|
||
<li>Зарегистрируйте в эмуляторе новый отпечаток пальца (в разделе
|
||
<strong>Настройки > Безопасность > Отпечаток пальца</strong>) и следуйте дальнейшим инструкциям.</li>
|
||
<li>Воспользовавшись указанной ниже командой, сымитируйте в эмуляторе события касания для проверки отпечатка пальца.
|
||
С помощью этой же команды сымитируйте события касания для проверки отпечатка пальца на экране блокировки или в
|
||
своем приложении.
|
||
<pre class="no-prettyprint">
|
||
adb -e emu finger touch <finger_id>
|
||
</pre>
|
||
<p>В Windows, возможно, потребуется выполнить команду {@code telnet 127.0.0.1 <emulator-id>}, а затем
|
||
{@code finger touch <finger_id>}.
|
||
</p>
|
||
</li>
|
||
</ol>
|
||
|
||
<h3 id="confirm-credential">Подтверждение учетных данных</h3>
|
||
<p>Для авторизации пользователей ваше приложение может обратиться к сведениям о том, как давно они разблокировали свое устройство в последний раз. Эта функция
|
||
избавляет пользователя от необходимости запоминать отдельные пароли для каждого приложения, а вас — от необходимости
|
||
реализовывать собственный пользовательский интерфейс авторизации. В приложении эту функцию следует
|
||
использовать совместно с реализацией открытого или секретного ключа для авторизации пользователей.</p>
|
||
|
||
<p>Чтобы задать временя ожидания, в течение которого после успешной
|
||
авторизации можно использовать ключ повторно, вызовите новый метод
|
||
{@code android.security.keystore.KeyGenParameterSpec.setUserAuthenticationValidityDurationSeconds()}
|
||
при настройке {@link javax.crypto.KeyGenerator} или
|
||
{@link java.security.KeyPairGenerator}. На сегодняшний день эта функция совместима с симметричными криптографическими
|
||
операциями.</p>
|
||
|
||
<p>Не стоит слишком часто отображать диалоговое окно повторной авторизации — ваше
|
||
приложение должно сначала попробовать использовать криптографический объект и только потом, если окажется, что время ожидания истекло, обратиться к методу
|
||
{@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()}
|
||
для повторной авторизации пользователя.
|
||
</p>
|
||
|
||
<p>Как можно реализовать эту функцию, показано в
|
||
<a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link">примерепроверки учетных данных</a>.
|
||
</p>
|
||
|
||
<h2 id="direct-share">Прямой обмен контентом</h2>
|
||
|
||
<img src="{@docRoot}preview/images/direct-share-screen.png" srcset="{@docRoot}preview/images/direct-share-screen.png 1x, {@docRoot}preview/images/direct-share-screen_2x.png 2x" style="float:right; margin:0 0 20px 30px" width="312" height="329" />
|
||
|
||
<p>M Preview содержит API-интерфейсы для интуитивно понятного и быстрого обмена контентом между пользователями. Теперь вы можете
|
||
определить <em>целевые объекты прямого обмена</em>, которые будут запускать определенную операцию в приложении
|
||
и открываться в меню <em>Поделиться</em>. С помощью данной функции пользователи могут обмениваться контентом
|
||
с целевыми объектами, такими как контакты, в других приложениях. Например, целевой объект прямого обмена может запустить операцию
|
||
в другом приложении социальной сети, что позволит пользователю напрямую делиться контентом с другом
|
||
или членами сообщества через это приложение.</p>
|
||
|
||
<p>Чтобы включить использование целевых объектов прямого обмена, необходимо определить класс, который наследует класс
|
||
{@code android.service.} <br>
|
||
{@code chooser.ChooserTargetService}. Объявите
|
||
{@code ChooserTargetService} в манифесте. В этом объявлении укажите разрешение
|
||
{@code BIND_CHOOSER_TARGET_SERVICE} и фильтр намерений с помощью действия
|
||
{@code SERVICE_INTERFACE}.</p>
|
||
<p>В примере ниже показано, как объявить {@code ChooserTargetService}
|
||
в вашем манифесте.</p>
|
||
<pre>
|
||
<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>
|
||
</pre>
|
||
|
||
<p>Для каждого действия, которое необходимо сделать доступным для {@code ChooserTargetService}, добавьте в манифест вашего приложения элемент
|
||
{@code <meta-data>} с именем
|
||
{@code "android.service.chooser.chooser_target_service"}.
|
||
</p>
|
||
|
||
<pre>
|
||
<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>
|
||
</pre>
|
||
|
||
<h2 id="voice-interactions">Голосовой интерфейс</h2>
|
||
<p>
|
||
В M Preview представлен новый голосовой API-интерфейс, который, наряду с
|
||
<a href="https://developers.google.com/voice-actions/" class="external-link">голосовыми командами</a>,
|
||
позволяет встраивать в приложение диалоговое голосовое взаимодействие. Вызовите метод
|
||
{@code android.app.Activity.isVoiceInteraction()}, чтобы определить, была ли операция запущена
|
||
в ответ на голосовую команду. Если это так, ваше приложение может использовать класс
|
||
{@code android.app.VoiceInteractor}, чтобы получить голосовое подтверждение от пользователя, предложить ему список вариантов
|
||
на выбор и многое другое. Подробнее о реализации голосовых команд можно почитать в
|
||
<a href="https://developers.google.com/voice-actions/interaction/" class="external-link">руководстве к голосовому интерфейсу</a>.
|
||
</p>
|
||
|
||
<h2 id="assist">API-интерфейс помощника</h2>
|
||
<p>
|
||
M Preview предлагает новый способ взаимодействия пользователей с приложением — взаимодействие посредством помощника. Для этого
|
||
пользователю необходимо разришить помощнику использовать текущий контекст, после чего он сможет вызывать помощника
|
||
в любом приложении, удерживая кнопку <strong>Домой</strong>.</p>
|
||
<p>Разработчик может также запретить приложению сообщать помощнику текущий контекст. Для этого установите флаг
|
||
{@link android.view.WindowManager.LayoutParams#FLAG_SECURE}. Кроме стандартного набора
|
||
информации, который платформа передает помощнику, ваше приложение может сообщать ему дополнительные
|
||
сведения посредством нового класса {@code android.app.Activity.AssistContent}.</p>
|
||
|
||
<p>Чтобы предоставить помощнику дополнительный контекст из вашего приложения, выполните следующие действия:</p>
|
||
|
||
<ol>
|
||
<li>Реализуйте интерфейс {@link android.app.Application.OnProvideAssistDataListener}.</li>
|
||
<li>Зарегистрируйте этот приемник с помощью
|
||
{@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()}.</li>
|
||
<li>Для предоставления контекста, относящего к конкретной операции, переопределите метод обратного вызова
|
||
{@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()},
|
||
а также, при желании, новый метод обратного вызова{@code Activity.onProvideAssistContent()}.
|
||
</ol>
|
||
|
||
<h2 id="notifications">Уведомления</h2>
|
||
<p>В API-интерфейс уведомлений внесены следующие изменения:</p>
|
||
<ul>
|
||
<li>{@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} — новый уровень фильтрации,
|
||
соответствующий новому режиму «Не беспокоить» <em>Только будильник</em>.</li>
|
||
<li>{@code Notification.CATEGORY_REMINDER} — новое значение категории, позволяющее отличить
|
||
установленные пользователем напоминания от других событий
|
||
({@link android.app.Notification#CATEGORY_EVENT}) и будильников
|
||
({@link android.app.Notification#CATEGORY_ALARM}).</li>
|
||
<li>{@code android.graphics.drawable.Icon} — новый класс, который можно добавить к уведомлениям
|
||
с помощью методов {@code Notification.Builder.setSmallIcon(Icon)} и
|
||
{@code Notification.Builder.setLargeIcon(Icon)}.</li>
|
||
<li>{@code NotificationManager.getActiveNotifications()} — новый метод, с помощью которого ваше приложение
|
||
может определить, какие из уведомлений в настоящее время активны. Если хотите взглянуть, как может быть реализовано приложение
|
||
с этой функцией, пройдите по ссылке: <a href="https://github.com/googlesamples/android-ActiveNotifications" class="external-link">Пример активных уведомлений</a>.</li>
|
||
</ul>
|
||
|
||
<h2 id="bluetooth-stylus">Поддержка пера Bluetooth</h2>
|
||
<p>В M Preview улучшена поддержка ввода с помощью пера Bluetooth. Пользователи могут подключить
|
||
совместимое перо Bluetooth к своему смартфону или планшету. Когда перо подключено, данные о его
|
||
положении объединяются со сведениями о степени нажима и нажатия кнопки на пере,
|
||
и таким образом при сенсорном вводе используются не только возможности сенсорного экрана. Ваше приложение может отслеживать
|
||
нажатия кнопки пера и выполнять дополнительные действия, регистрируя в операции новые методы обратного вызова
|
||
{@code View.onStylusButtonPressListener} и
|
||
{@code GestureDetector.OnStylusButtonPressListener}.</p>
|
||
|
||
<p>Для определения нажатий кнопок пера используйте методы и константы {@link android.view.MotionEvent}:
|
||
</p>
|
||
<ul>
|
||
<li>Если пользователь касается пером кнопки на экране приложения, метод
|
||
{@link android.view.MotionEvent#getToolType(int) getTooltype()} возвращает
|
||
{@link android.view.MotionEvent#TOOL_TYPE_STYLUS}.</li>
|
||
<li>В приложениях, разработанных для M Preview, при нажатии пользователем на основную кнопку на пере, метод
|
||
{@link android.view.MotionEvent#getButtonState() getButtonState()}
|
||
возвращает{@code MotionEvent.STYLUS_BUTTON_PRIMARY}.
|
||
Если перо оснащено дополнительной кнопкой, то при нажатии на нее этот метод возвращает
|
||
{@code MotionEvent.STYLUS_BUTTON_SECONDARY}. При нажатии пользователем
|
||
на обе кнопки одновременно, метод возвращает оба значения через оператор «OR»
|
||
({@code STYLUS_BUTTON_PRIMARY|STYLUS_BUTTON_SECONDARY}).</li>
|
||
<li>
|
||
В приложениях, разработанных для более ранних версий платформы, метод
|
||
{@link android.view.MotionEvent#getButtonState() getButtonState()} возвращает
|
||
{@link android.view.MotionEvent#BUTTON_SECONDARY} (при нажатии на основную кнопку на пере),
|
||
{@link android.view.MotionEvent#BUTTON_TERTIARY} (при нажатии дополнительной кнопки на пере) или оба этих значения.
|
||
</li>
|
||
</ul>
|
||
|
||
<h2 id="ble-scanning">Улучшенное сканирование Bluetooth с низким потреблением энергии</h2>
|
||
<p>
|
||
Если ваше приложение выполняет сканирование Bluetooth с низким потреблением энергии, вы можете при помощи нового метода
|
||
{@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} указать, что обратные вызовы следует уведомлять только в случае, если прежде обнаружен пакет объявления,
|
||
совпадающий с заданным фильтром
|
||
{@link android.bluetooth.le.ScanFilter}, или если он не обнаруживается в течение заданного периода времени.
|
||
Такой подход к сканированию обеспечивает еще большую экономию энергии, чем это было возможно в предыдущей
|
||
версии платформы.
|
||
</p>
|
||
|
||
<h2 id="hotspot">Поддержка Hotspot 2.0, выпуск 1</h2>
|
||
<p>
|
||
В M Preview включена поддержка Hotspot 2.0 (выпуск 1) для устройств Nexus 6 и Nexus 9. Для
|
||
предоставления учетных данных Hotspot 2.0 в вашем приложении используйте новые методы класса
|
||
{@link android.net.wifi.WifiEnterpriseConfig}, такие как {@code setPlmn()} и
|
||
{@code setRealm()}. В объекте {@link android.net.wifi.WifiConfiguration} можно задать поля
|
||
{@link android.net.wifi.WifiConfiguration#FQDN} и {@code providerFriendlyName}.
|
||
Новое свойство{@code ScanResult.PasspointNetwork} показывает, является ли обнаруженная
|
||
сеть точкой доступа Hotspot 2.0.
|
||
</p>
|
||
|
||
<h2 id="4K-display">Режим отображения в формате 4K</h2>
|
||
<p>Теперь платформа позволяет приложениям запрашивать увеличение разрешения экрана до 4K при обработке изображения
|
||
на совместимом устройстве. Чтобы запросить текущее физическое разрешение, используйте новые API-интерфейсы
|
||
{@code android.view.Display.Mode}. Если элементы пользовательского интерфейса, отрисованные в более низком логическом разрешении, масштабируются до
|
||
более высокого физического разрешения, обратите внимание, что метод физического разрешения
|
||
{@code Display.Mode.getPhysicalWidth()} возвращает результат, который может отличаться от результата выполнения метода логического разрешения
|
||
{@link android.view.Display#getSize(android.graphics.Point) getSize()} .</p>
|
||
|
||
<p>Можно отправить запрос системе на изменение физического разрешения в активном приложении, задав для окна вашего приложения свойство
|
||
{@code WindowManager.LayoutParams.preferredDisplayModeId}. Эта
|
||
функция особенно полезна в случаях, когда требуется переключиться на разрешение экрана 4K. В режиме отображения в формате 4K элементы
|
||
пользовательского интерфейса отрисовываются в исходном разрешении (например, 1080p) и масштабируются до 4K, однако содержимое
|
||
{@link android.view.SurfaceView} объектов может отображаться с использованием основного разрешения.</p>
|
||
|
||
<h2 id="behavior-themeable-colorstatelists">Метод ColorStateLists для работы с темами</h2>
|
||
<p>Теперь метод
|
||
{@link android.content.res.ColorStateList} для устройств под управлением M Preview поддерживает атрибуты темы. Методы
|
||
{@link android.content.res.Resources#getColorStateList(int) getColorStateList()} и
|
||
{@link android.content.res.Resources#getColor(int) getColor()} уже неактуальны. Если вы
|
||
вызываете эти API-интерфейсы, вызовите вместо них новые методы {@code Context.getColorStateList()} или
|
||
{@code Context.getColor()}, Доступные также в библиотеке v4 appcompat
|
||
посредством {@link android.support.v4.content.ContextCompat}.</p>
|
||
|
||
<h2 id="audio">Работа с аудио</h2>
|
||
|
||
<p>В M Preview реализован ряд улучшений в области обработки аудиофайлов системой Android, включая следующие: </p>
|
||
<ul>
|
||
<li>Новые API-интерфейсы {@code android.media.midi}, поддерживающие протокол <a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a>
|
||
для отправки и получения событий
|
||
MIDI.</li>
|
||
<li>Новые классы: {@code android.media.AudioRecord.Builder} позволяет создавать объекты захвата цифрового аудио, а {@code android.media.AudioTrack.Builder} — объекты воспроизведения,
|
||
а также осуществлять настройку источника
|
||
аудио и свойств приемника, переопределяя исходные системные настройки.</li>
|
||
<li>Обработчики API-интерфейсов предназначены для связывания аудиофайлов и устройств ввода. Это особенно полезно в случае, если ваше приложение
|
||
предоставляет возможность выполнять голосовой поиск с помощью игрового контроллера или пульта дистанционного управления, подключенного к Android
|
||
TV. Когда пользователь запустит поиск, система вызовет новый метод обратного вызова {@code android.app.Activity.onSearchRequested()}.
|
||
Чтобы определить, оснащено ли устройство ввода встроенным микрофоном, получите из этого метода обратного вызова объект
|
||
{@link android.view.InputDevice} и вызовите новый метод
|
||
{@code InputDevice.hasMic()}.</li>
|
||
<li>Новый класс {@code android.media.AudioDevicesManager}, позволяющий пользователю получить список всех
|
||
подключенных источников аудио и приемников. Также можно указать объект
|
||
{@code android.media.OnAudioDeviceConnectionListener}, если требуется, чтобы приложение
|
||
получало уведомления о подключении или отключении аудиоустройств.</li>
|
||
</ul>
|
||
|
||
<h2 id="video">Работа с видео</h2>
|
||
<p>В M Preview вы обнаружите новые возможности API-интерфейсов для обработки видео, в том числе:</p>
|
||
<ul>
|
||
<li>Новый класс {@code android.media.MediaSync} обеспечивает синхронную обработку потоков
|
||
аудио и видео. Буферы аудио отправляются неблокируемым способом и возвращаются посредством
|
||
обратного вызова. Также имеется поддержка динамической скорости воспроизведения.
|
||
</li>
|
||
<li>Новое событие {@code MediaDrm.EVENT_SESSION_RECLAIMED} указывает на то, что сеанс, запущенный
|
||
приложением, освобожден диспетчером ресурсов. Если в вашем приложении используются сеансы DRM, то это событие
|
||
необходимо обработать и убедиться в том, что освобожденный сеанс не используется.
|
||
</li>
|
||
<li>Новый код ошибки {@code MediaCodec.CodecException.ERROR_RECLAIMED} указывает на то, что
|
||
диспетчер ресурсов освободил ресурс мультимедиа, используемый кодеком. Во всех остальных случаях кодек должен
|
||
быть освобожден, поскольку его необходимо перевести в конечное состояние.
|
||
</li>
|
||
<li>Новый интерфейс {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} позволяет узнать максимальное количество
|
||
экземпляров кодека, которые могут выполняться одновременно.
|
||
</li>
|
||
<li>Новый {@code MediaPlayer.setPlaybackParams()} метод задает скорость при ускоренном или
|
||
замедленном воспроизведении мультимедиа. Он также позволяет автоматически замедлять или ускорять воспроизведение аудио синхронно с
|
||
видео.</li>
|
||
</ul>
|
||
|
||
<h2 id="camera">Возможности камеры</h2>
|
||
<p>В M Preview представлены следующие API-интерфейсы для вспышки камеры и повторной обработки
|
||
изображений камерой.</p>
|
||
|
||
<h3 id="flashlight">API-интерфейс вспышки</h3>
|
||
<p>Если камера оснащена вспышкой, вы можете вызвать метод{@code CameraManager.setTorchMode()},
|
||
чтобы включить или отключить режим фонарика, не запуская камеру. Приложение
|
||
не может заполучить вспышку или камеру в единоличное пользование. Режим фонарика отключается
|
||
и становится недоступен, когда камера недоступна или ресурсов камеры недостаточно для использования вспышки в качестве
|
||
фонарика. Кроме того, другие приложения могут вызывать метод {@code setTorchMode()}
|
||
для отключения режима фонарика. При закрытии приложения, которое включило режим фонарика, этот режим
|
||
отключается.</p>
|
||
|
||
<p>Чтобы зарегистрировать обратный вызов для уведомления о режиме фонарика, вызовите метод
|
||
{@code CameraManager.registerTorchCallback()}. При первой регистрации обратного вызова
|
||
он сразу же вызывается со сведениями о состоянии режима фонарика для всех известных к настоящему моменту устройств,
|
||
оснащенных вспышкой. При успешном включении или отключении фонарика вызывается метод
|
||
{@code CameraManager.TorchCallback.onTorchModeChanged()}.</p>
|
||
|
||
<h3 id="reprocessing">API-интерфейс повторной обработки</h3>
|
||
<p>API-интерфейс {@link android.hardware.camera2 Camera2} теперь поддерживает повторную обработку цветовых моделей YUV и изображений в собственном
|
||
формате непрозрачности. Чтобы определить, возможна ли повторная обработка, приложение использует метод
|
||
{@code CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES}. Если устройство поддерживает повторную обработку,
|
||
вы можете создать сеанс захвата изображения с камеры с возможностью повторной обработки, вызвав метод
|
||
{@code CameraDevice.createReprocessableCaptureSession()}, а затем создать запросы на повторную обработку буфера
|
||
входных данных.</p>
|
||
|
||
<p>Чтобы подключить поток буфера входных данных к модулю повторной обработки изображения с камеры, используйте класс
|
||
{@code ImageWriter}. Чтобы получить пустой буфер, выполните следующие действия:</p>
|
||
|
||
<ol>
|
||
<li>Вызовите метод {@code ImageWriter.dequeueInputImage()}.</li>
|
||
<li>Заполните буфер входными данными.</li>
|
||
<li>Отправьте буфер в камеру, вызвав метод {@code ImageWriter.queueInputImage()}.</li>
|
||
</ol>
|
||
|
||
<p>Если вы используете объект {@code ImageWriter} вместе с изображением
|
||
{@code android.graphics.ImageFormat.PRIVATE}, вашему приложению не удастся получить доступ к изображению
|
||
напрямую. Вместо этого передайте изображение {@code ImageFormat.PRIVATE} прямо в
|
||
{@code ImageWriter}, вызвав метод {@code ImageWriter.queueInputImage()} без копии
|
||
буфера.</p>
|
||
|
||
<p>Класс {@code ImageReader} теперь поддерживает потоки изображений в формате {@code android.graphics.ImageFormat.PRIVATE}.
|
||
Благодаря этому ваше приложение может организовать циклическую очередь выходных изображений
|
||
{@code ImageReader}, выбрать одно или несколько изображений и отправить их в
|
||
{@code ImageWriter} для повторной обработки камерой.</p>
|
||
|
||
<h2 id="afw">Возможности Android for Work</h2>
|
||
<p>В M Preview представлены новые API-интерфейсы для Android for Work:</p>
|
||
<ul>
|
||
<li><strong>Улучшенные элементы управления для корпоративных специализированных устройств.</strong> Владельцу устройства
|
||
теперь доступны новые возможности управления
|
||
корпоративными специализированными устройствами при помощие следующих настроек:
|
||
<ul>
|
||
<li>Отключение или повторное включение блокировки клавиатуры с помощью метода
|
||
{@code DevicePolicyManager.setKeyguardEnabledState()}.</li>
|
||
<li>Отключение или повторное включение строки состояния (включая быстрые настройки, уведомления и
|
||
запуск Google Now путем проведения пальцем по экрану) с помощью метода
|
||
{@code DevicePolicyManager.setStatusBarEnabledState()}.</li>
|
||
<li>Отключение и повторное включение безопасной загрузки с помощью константы
|
||
{@code DISALLOW_SAFE_BOOT} {@link android.os.UserManager}.</li>
|
||
<li>Предотвращение отключения экрана, если устройство питается от сети, с помощью константы
|
||
{@code STAY_ON_WHILE_PLUGGED_IN} {@link android.provider.Settings.Global}.</li>
|
||
</ul>
|
||
</li>
|
||
<li><strong>Автоматические установка и удаление приложений владельцами устройств.</strong> Владелец устройства теперь может автоматически
|
||
устанавливать и удалять приложения с помощью API-интерфейсов {@link android.content.pm.PackageInstaller},
|
||
независимо от Google Play for Work. Теперь вы можете подготавливать устройства с помощью компонента «Владелец устройства», который
|
||
получает и устанавливает приложения без участия пользователя. Такая возможность особенно полезна тем, что позволяет подготавливать
|
||
киоски или иные подобные устройства одним касанием, не активируя аккаунт Google.</li>
|
||
<li><strong>Автоматический доступ к корпоративному сертификату.</strong> Теперь, когда приложение вызывает метод
|
||
{@link android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity,android.security.KeyChainAliasCallback,java.lang.String[],java.security.Principal[],java.lang.String,int,java.lang.String) choosePrivateKeyAlias()},
|
||
владелец профиля или устройства, прежде чем ему будет предложено выбрать сертификат, может вызывать метод
|
||
{@code DeviceAdminReceiver.onChoosePrivateKeyAlias()}, который автоматически предоставит предложению псевдоним.
|
||
С помощью этой возможности вы можете предоставлять управляемым приложениям доступ к сертификатам без
|
||
вмешательства пользователя.</li>
|
||
<li><strong>Автоматическое принятие обновлений системы.</strong> Настройка параметров обновления системы с помощью
|
||
{@code DevicePolicyManager.setSystemUpdatePolicy()} теперь позволяет компоненту «Владелец устройства» автоматически принять обновление системы
|
||
(например, в киоске) или отложить его на период до 30 дней, причем пользователь
|
||
тоже не сможет установить обновление до истечения этого срока. Более того, администратор может задать ежедневный временной интервал, когда устройство будет принимать
|
||
обновления (например, во те часы, когда киоск не используется). При наличии доступного
|
||
обновления система проверяет, заданы ли параметры обновления системы приложением «Параметры работы»
|
||
, и выполняет соответствующие действия.
|
||
</li>
|
||
<li>
|
||
<strong>Делегированная установка сертификата.</strong> Владелец профиля или устройства теперь может предоставлять
|
||
стороннему приложению возможность вызывать следующие API-интерфейсы управления сертификатом
|
||
{@link android.app.admin.DevicePolicyManager}:
|
||
<ul>
|
||
<li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName)
|
||
getInstalledCaCerts()}</li>
|
||
<li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[])
|
||
hasCaCertInstalled()}</li>
|
||
<li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[])
|
||
installCaCert()}</li>
|
||
<li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[])
|
||
uninstallCaCert()}</li>
|
||
<li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName)
|
||
uninstallAllUserCaCerts()}</li>
|
||
<li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String)
|
||
installKeyPair()}</li>
|
||
</ul>
|
||
</li>
|
||
<li><strong>Корпоративная настройка защиты от сброса параметров до заводских настроек.</strong> При подготовке компонента «Владелец устройства» теперь
|
||
имеется возможность настроить параметры разблокировки защиты от сброса параметров до заводских настроек (FRP) путем задания пакета
|
||
{@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS}. Приложение NFC Programmer
|
||
может после перезагрузки устройства предоставить эти параметрыс целью разблокировки FRP и его подготовки
|
||
(без необходимости запрашивать ранее настроенную учетную запись Google). Если не изменить эти параметры,
|
||
заводские настройки сохранятся не позволят активировать устройство без ввода активированных ранее
|
||
учетных данных Google.
|
||
<p>Кроме того, задав ограничения на использование служб Google Play, компонент «Владелец устройства» может указать альтернативные учетные записи
|
||
Google для разблокировки FRP и замены учетных записей, активированных на устройстве.</p>
|
||
</li>
|
||
<img src="{@docRoot}preview/images/work-profile-screen.png" srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/images/work-profile-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
|
||
<li><strong>Отслеживание использования данных.</strong> Владелец профиля или устройства теперь может запрашивать статистику использования
|
||
данных, которая отображается в разделе <strong>Настройки > Использование данных</strong>, с помощью новых методов
|
||
{@code android.app.usage.NetworkStatsManager}. Владельцам профилей автоматически предоставляется
|
||
разрешение запрашивать данные профиля, которым они управляют, тогда как владельцам устройств предоставляется доступ к сведениям об использовании данных
|
||
основного управляемого пользователя.</li>
|
||
<li><strong>Управление разрешениями на выполнение.</strong>
|
||
<p>Владелец профиля или устройства может задавать политику разрешений
|
||
для всех запросов на использование среды выполнения любых приложений с помощью
|
||
{@code DevicePolicyManager.setPermissionPolicy()}. Это позволяет выбрать, будет ли система предлагать пользователю предоставить разрешение
|
||
как обычно, или она будет автоматически предоставлять разрешения или отказывать в них. В последнем случае
|
||
пользователю не удастся изменить выбор, сделанный владельцем профиля или устройства на экране
|
||
разрешений приложения в разделе <strong>Настройки</strong>.</p></li>
|
||
<li><strong>VPN в разделе «Настройки».</strong> Приложения VPN теперь отображаются в разделе
|
||
<strong>Настройки > Другие сети > VPN</strong>.
|
||
Кроме того, сведения в уведомлениях об использовании VPN теперь зависят от настроек самой VPN.
|
||
Для владельца профиля уведомления зависят от того, настроена ли VPN для
|
||
управляемого профиля, личного профиля или же того и другого. Для владельца устройства уведомления зависят от того, настроена ли VPN для
|
||
всего устройства.</li>
|
||
<li><strong>Уведомление о состоянии «В работе».</strong> Теперь, когда приложения
|
||
из управляемого профиля выполняет операцию в фоновом режиме, в строке состояния появляется значок портфеля. Кроме того, если после разблокировки устройства
|
||
открывается операция приложения из управляемого профиля, отображается всплывающее уведомление о том,
|
||
что операция выполняется в рабочем профиле.
|
||
</li>
|
||
</ul>
|
||
|
||
<p class="note">
|
||
Подробные сведения обо всех изменениях в API-интерфейсах в версии M Developer Preview представлены в <a href="{@docRoot}preview/download.html">отчете о различиях между API-интерфейсами</a>.
|
||
</p>
|