1page.title=API для Android 5.0
2excludeFromSuggestions=true
3sdk.platform.version=5.0
4sdk.platform.apiLevel=21
5@jd:body
6
7
8<div id="qv-wrapper">
9<div id="qv">
10
11<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>
12
13<ol id="toc44" class="hide-nested">
14  <li><a href="#ApiLevel">Обновление целевого уровня API</a></li>
15  <li><a href="#Behaviors">Важные функциональные изменения</a>
16    <ol>
17      <li><a href="#ART">Если вы не тестировали свое приложение в новой среде выполнения Android (ART)...</a></li>
18      <li><a href="#BehaviorNotifications">Если в приложение нужно добавить уведомления...</a></li>
19      <li><a href="#BehaviorMediaControl">Если в приложении используется RemoteControlClient...</a></li>
20<li><a href="#BehaviorGetRecentTasks">Если в приложении используется метод getRecentTasks()...</a></li>
21<li><a href="#64BitSupport">Если вы используете инструмент разработчика Android Native Development Kit (NDK)...</a></li>
22<li><a href="#BindService">Если ваше приложение связано с определенным сервисом...</a></li>
23<li><a href="#BehaviorWebView">Если в приложении используется сервис WebView...</a></li>
24    </ol>
25  </li>
26  <li><a href="#UI">Пользовательский интерфейс</a>
27    <ol>
28      <li><a href="#MaterialDesign">Material Design</a></li>
29      <li><a href="#Recents">Одновременный просмотр документов и процессов на экране</a></li>
30      <li><a href="#WebView">Обновления WebView</a></li>
31      <li><a href="#ScreenCapture">Сохранение и отправка данных с экрана</a></li>
32    </ol>
33  </li>
34  <li><a href="#Notifications">Уведомления</a>
35    <ol>
36      <li><a href="#LockscreenNotifications">Уведомления на экране блокировки</a></li>
37      <li><a href="#NotificationsMetadata">Метаданные уведомлений</a></li>
38    </ol>
39  </li>
40  <li><a href="#Graphics">Графика</a>
41    <ol>
42      <li><a href="#OpenGLES-3-1">Поддержка OpenGL ES 3.1</a></li>
43      <li><a href="#AndroidExtensionPack">Набор расширений для Android</a></li>
44    </ol>
45  </li>
46  <li><a href="#Media">Мультимедиа</a>
47    <ol>
48      <li><a href="#Camera-v2">API для расширенных возможностей камеры</a></li>
49      <li><a href="#AudioPlayback">Воспроизведение аудио</a></li>
50      <li><a href="#MediaPlaybackControl">Управление воспроизведением мультимедиа</a></li>
51      <li><a href="#MediaBrowsing">Поиск и просмотр мультимедиа</a></li>
52    </ol>
53  </li>
54  <li><a href="#Storage">Хранение данных</a>
55    <ol>
56      <li><a href="#DirectorySelection">Выбор каталогов</a></li>
57    </ol>
58  </li>
59  <li><a href="#Wireless">Беспроводные сети и подключения</a>
60    <ol>
61      <li><a href="#Multinetwork">Подключения к нескольким сетям</a></li>
62      <li><a href="#BluetoothBroadcasting">Передача данных по Bluetooth</a></li>
63      <li><a href="#NFCEnhancements">Новые возможности NFC</a></li>
64    </ol>
65  </li>
66  <li><a href="#Power">Project Volta</a>
67    <ol>
68      <li><a href="#JobScheduler">Планирование заданий</a></li>
69      <li><a href="#PowerMeasurementTools">Инструменты для разработчиков (использование батареи)</a>
70    </ol>
71  </li>
72  <li><a href="#Enterprise">Android для работы и учебы</a>
73    <ol>
74      <li><a href="#ManagedProvisioning">Контролируемые профили</a></li>
75      <li><a href="#DeviceOwner">Владелец устройства</a></li>
76      <li><a href="#ScreenPinning">Блокировка в приложении</a></li>
77    </ol>
78  </li>
79  <li><a href="#System">Система</a>
80    <ol>
81      <li><a href="#AppUsageStatistics">Статистика по использованию приложений</a></li>
82    </ol>
83  </li>
84  <li><a href="#Printing">Инфраструктура печати</a>
85    <ol>
86      <li><a href="#PDFRender">Обработка PDF как растрового изображения</a></li>
87    </ol>
88  </li>
89  <li><a href="#TestingA11y">Тестирование и доступность</a>
90    <ol>
91      <li><a href="#TestingA11yImprovements">Новые возможности тестирования и оценки доступности</a></li>
92    </ol>
93  </li>
94  <li><a href="#IME">Редактор способов ввода (IME)</a>
95    <ol>
96      <li><a href="#Switching">Упрощенное переключение между языками ввода</a></li>
97    </ol>
98  </li>
99  <li><a href="#Manifest">Объявление манифеста</a>
100    <ol>
101      <li><a href="#ManifestFeatures">Объявляемые обязательные функции</a></li>
102      <li><a href="#Permissions">Разрешения для пользователей</a></li>
103    </ol>
104  </li>
105</ol>
106
107<h2>API Differences</h2>
108<ol>
109<li><a href="{@docRoot}sdk/api_diff/21/changes.html">API level 20 to 21 &raquo;</a> </li>
110<li><a href="{@docRoot}sdk/api_diff/preview-21/changes.html">L Developer Preview to 21 &raquo;</a> </li>
111</ol>
112
113<h2>See Also</h2>
114<ol>
115<li><a href="{@docRoot}about/versions/android-5.0-changes.html">Android 5.0 Behavior Changes</a> </li>
116<li><a href="{@docRoot}about/versions/lollipop.html">Android Lollipop Highlights</a> </li>
117</ol>
118
119</div>
120</div>
121
122<p>Уровень API: {@sdkPlatformApiLevel}</p>
123
124<p>В Android 5.0 (<a href="{@docRoot}reference/android/os/Build.VERSION_CODES.html#LOLLIPOP">Lollipop</a>) реализованы новые функции как для пользователей, так и для разработчиков приложений. Из этой статьи вы узнаете о самых важных особенностях новых API.</p>
125
126<p>Чтобы получить общее представление о новых функциях платформы, прочитайте краткий обзор <a href="{@docRoot}about/versions/lollipop.html">Android Lollipop</a>.</p>
127
128
129<h3 id="Start">Приступая к разработке</h3>
130
131<p>Чтобы создавать приложения для Android 5.0, вам потребуется <a href="{@docRoot}sdk/index.html">Android SDK</a>. Воспользуйтесь <a href="{@docRoot}tools/help/sdk-manager.html">Менеджером SDK</a>, чтобы загрузить платформу SDK для Android 5.0 и образы системы.</p>
132
133
134<h3 id="ApiLevel">Обновление целевого уровня API</h3>
135
136<p>Чтобы оптимизировать приложение для устройств под управлением Android {@sdkPlatformVersion}, настройте <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> на уровень <code>"{@sdkPlatformApiLevel}"</code>, установите приложение на образ системы Android {@sdkPlatformVersion}, проверьте его, а затем опубликуйте обновленную версию.</p>
137
138<p>Вы можете воспользоваться API Android {@sdkPlatformVersion} и для работы со старыми версиями. Для этого добавьте соответствующие данные в код, проверяющий уровень API перед выполнением функций, которые могут не поддерживаться <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a>. Подробнее о том, как обеспечить совместимость с предыдущими версиями, читайте <a href="{@docRoot}training/basics/supporting-devices/platforms.html">здесь</a>.</p>
139
140<p>Сведения об уровнях API представлены в <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">этой статье</a>.</p>
141
142<h2 id="Behaviors">Важные функциональные изменения</h2>
143
144<p>Если вы уже публиковали приложения для Android, учтите, что изменения в версии 5.0 могут повлиять на их работу.</p>
145
146<h3 id="ART">Если вы не тестировали свое приложение в новой среде выполнения Android (ART)...</h3>
147
148<p>В версии 4.4 была представлена новая экспериментальная среда выполнения Android (ART). Ее можно было выбирать при необходимости, а по умолчанию использовалось решение Dalvik. Для Android 5.0 ART&nbsp;– среда выполнения по умолчанию.</p>
149
150<p>Подробнее о новых функциях ART читайте <a href="https://source.android.com/devices/tech/dalvik/art.html">здесь</a>. Вот некоторые из них:</p>
151
152<ul>
153  <li>Предварительная компиляция (AOT).</li>
154  <li>Более эффективная очистка памяти.</li>
155  <li>Улучшенные методы отладки.</li>
156</ul>
157
158<p>Большинство приложений для Android не потребуют никаких изменений при переходе на ART. Однако некоторые функции, действовавшие в Dalvik, поддерживаться не будут. Подробнее об этом читайте в разделе, который посвящен <a href="{@docRoot}guide/practices/verifying-apps-art.html">проверке работы приложения в среде выполнения ART</a>. Будьте особо внимательны в следующих случаях:</p>
159
160<ul>
161  <li>Ваше приложение использует Java Native Interface (JNI) для выполнения кода C/C++.</li>
162  <li>Вы применяете инструменты для разработчиков, позволяющие создавать нестандартный код (в том числе для обфускации).</li>
163  <li>Ваши технологии нельзя применять, если используется очистка памяти с уплотнением. ART в настоящее время не поддерживает эту функцию, однако она разрабатывается в проекте ПО с открытым исходным кодом для Android.</li>
164</ul>
165
166<h3 id="BehaviorNotifications">Если в приложение нужно добавить уведомления...</h3>
167
168<p>При создании уведомлений учитывайте нововведения в Android 5.0. Подробнее об оповещениях для Android 5.0 и выше читайте в соответствующем <a href="{@docRoot}design/patterns/notifications.html">руководстве</a>.
169</p>
170
171<h4 id="NotificationsMaterialDesignStyle">Концепция Material Design</h4>
172<p>Уведомления выводятся с темным текстом на белом (или очень светлом) фоне. Это хорошо смотрится при использовании новых виджетов с текстурой. Убедитесь, что все ваши уведомления правильно выглядят в новой цветовой схеме. Если они отображаются некорректно, исправьте их:</p>
173
174<ul>
175  <li>Используйте метод {@link android.app.Notification.Builder#setColor(int) setColor()}, чтобы указать цвет фона значка. </li>
176  <li>Обновите или удалите ресурсы, в которых задействован цвет. Система обрабатывает только альфа-каналы как для значков действий, так и для основного значка уведомления. Учитывайте это. Система отображает значки уведомлений белым цветом, а значки действий&nbsp;– темно-серым.</li>
177</ul>
178
179<h4 id="NotificationsSoundVibration">Звук и вибрация</h4>
180<p>Если в настоящее время вы добавляете звуки и вибрацию в уведомления с помощью классов {@link android.media.Ringtone}, {@link android.media.MediaPlayer} или {@link android.os.Vibrator}, удалите этот код. Тогда система будет правильно обрабатывать уведомления с учетом <em>приоритета</em>. Чтобы добавить звуки и вибрацию, используйте методы {@link android.app.Notification.Builder}.</p>
181
182<p>Чтобы войти в новый режим приоритета, выберите на устройстве настройку {@link android.media.AudioManager#RINGER_MODE_SILENT RINGER_MODE_SILENT}. При выборе настроек {@link android.media.AudioManager#RINGER_MODE_NORMAL RINGER_MODE_NORMAL} или {@link android.media.AudioManager#RINGER_MODE_NORMAL RINGER_MODE_VIBRATE} режим приоритета отключается.</p>
183
184<p>Раньше в системе Android для управления звуком на планшетах использовался основной поток {@link android.media.AudioManager#STREAM_MUSIC STREAM_MUSIC}. В Android 5.0 {@link android.media.AudioManager#STREAM_RING STREAM_RING} и {@link android.media.AudioManager#STREAM_NOTIFICATION STREAM_NOTIFICATION} будут поддерживаться как для телефонов, так и для планшетов.</p>
185
186<h4 id="NotificationsLockscreenVisibility">Элементы на экране блокировки</h4>
187<p>По умолчанию в Android 5.0 уведомления показываются на экране блокировки. Однако пользователи могут включить функцию защиты личных данных. В таком случае система будет автоматически редактировать текст уведомлений. Чтобы настроить показ уведомлений, содержащих личные данные, используйте элемент {@link android.app.Notification.Builder#setPublicVersion(android.app.Notification) setPublicVersion()}.</p>
188<p>Если уведомление не содержит личных данных или вы хотите разрешить воспроизведение мультимедиа в нем, вызовите метод {@link android.app.Notification.Builder#setVisibility(int) setVisibility()} и задайте видимость уведомления как {@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}.
189</p>
190
191<h4 id="NotificationsMediaPlayback">Воспроизведение мультимедиа</h4>
192<p>Если в ваших уведомлениях присутствуют сведения о воспроизведении мультимедиа или передаче данных, рекомендуем использовать новый шаблон {@link android.app.Notification.MediaStyle} вместо объекта {@link android.widget.RemoteViews.RemoteView}. Какой бы вариант вы ни выбрали, убедитесь, что для отображения уведомления выбран вариант {@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}. Тогда управление мультимедиа будет доступно на экране блокировки. Учтите, что в Android 5.0 и последующих версиях будет прекращен показ объектов {@link android.media.RemoteControlClient} на экране блокировки. Подробнее читайте в разделе <a href="#BehaviorMediaControl">Если ваше приложение использует RemoteControlClient</a>.</p>
193
194<h4 id="NotificationsHeadsup">Всплывающие уведомления</h4>
195<p>Теперь уведомления могут отображаться в небольшом всплывающем окне, если устройство активно (то есть разблокировано, а экран включен). Они почти аналогичны компактным. Разница только в том, что во всплывающих окнах есть кнопки для выполнения действий. Пользователь может выполнить действие или закрыть уведомление, не покидая приложения.</p>
196
197<p>Всплывающие уведомления появляются в следующих ситуациях:</p>
198
199<ul>
200  <li>Пользователь выполняет действия в полноэкранном режиме (приложение использует {@link android.app.Notification#fullScreenIntent}).</li>
201  <li>Уведомление имеет высокий приоритет, используется звук или вибрация.</li>
202</ul>
203
204<p>Если при таких условиях в вашем приложении будут появляться всплывающие уведомления, убедитесь, что они отображаются корректно.</p>
205
206<h3 id="BehaviorMediaControl">Если в приложении используется RemoteControlClient...</h3>
207<p>Класс {@link android.media.RemoteControlClient} теперь не поддерживается. Как можно скорее перейдите на API {@link android.media.session.MediaSession}.</p>
208
209<p>На экране блокировки в Android 5.0 не отображаются кнопки управления передачей данных для {@link android.media.session.MediaSession} или {@link android.media.RemoteControlClient}. Вместо этого система показывает кнопки управления воспроизведением мультимедиа. Теперь вам проще выбрать их варианты, которые будут удобны как на заблокированном, так и разблокированном устройстве.</p>
210
211<p>В Android 5.0 для этого имеется новый шаблон {@link android.app.Notification.MediaStyle}. {@link android.app.Notification.MediaStyle} конвертирует действия, добавленные с помощью {@link android.app.Notification.Builder#addAction(int, java.lang.CharSequence, android.app.PendingIntent) Notification.Builder.addAction()}, в компактные кнопки для уведомлений с возможностью воспроизведения мультимедиа. Чтобы сообщить системе о том, что уведомление связано с активным сеансом воспроизведения мультимедиа, необходимо передать токен сеанса в метод {@link android.app.Notification.MediaStyle#setMediaSession(android.media.session.MediaSession.Token) setSession()}.</p>
212
213<p>Убедитесь, что выбран вариант отображения {@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC} и уведомление будет появляться на экране блокировки, даже если включен режим безопасности. Подробнее об уведомлениях на экране блокировки читайте <a href="#LockscreenNotifications">здесь</a>.</p>
214
215<p>Если ваше приложение работает на платформе Android <a href="{@docRoot}tv/index.html">TV</a> или <a href="{@docRoot}wear/index.html">Wear</a>, внедрите класс {@link android.media.session.MediaSession}. Он поддерживает показ кнопок для управления воспроизведением. Если приложение должно получать информацию о действиях с кнопками на устройствах Android, необходимо также внедрить {@link android.media.session.MediaSession}.</p>
216
217<h3 id="BehaviorGetRecentTasks">Если в приложении используется метод getRecentTasks()...</h3>
218
219<p>В Android 5.0 появилась новая функция <em>одновременной работы с документами и процессами</em> (см. <a href="#Recents">ниже</a>). Метод {@link android.app.ActivityManager#getRecentTasks ActivityManager.getRecentTasks()} больше не поддерживается. Чтобы обеспечить совместимость со старыми версиями, этот метод по-прежнему возвращает небольшое количество данных. Например, он вызывает собственные задачи приложения и некоторые другие задачи (например, переход на главную страницу). Если в вашем приложении применяется этот метод, замените его на {@link android.app.ActivityManager#getAppTasks() getAppTasks()}.</p>
220
221<h3 id="64BitSupport">Если вы используете Android Native Development Kit (NDK)...</h3>
222
223<p>Android 5.0 теперь поддерживает как 32- так и 64-разрядные системы. Поддержка 64-разрядных систем увеличивает производительность и расширяет пространство адресов. Также при этом повышается скорость работы OpenSSL для криптографии. Кроме того, в новом выпуске используются API NDK для мультимедиа, а также поддерживается OpenGL ES (GLES) 3.1.</p>
224
225<p>Чтобы воспользоваться поддержкой 64-разрядных систем в Android 5.0, скачайте и установите NDK версии 10c со страницы <a href="{@docRoot}tools/sdk/ndk/index.html">Android NDK</a>. Подробнее о важных изменениях и исправленных ошибках в NDK читайте в <a href="{@docRoot}tools/sdk/ndk/index.html#Revisions">примечаниях к выпуску</a> 10с.</p>
226
227<h3 id="BindService">Если ваше приложение связано с определенным сервисом...</h3>
228
229<p>Метод {@link android.content.Context#bindService(android.content.Intent, android.content.ServiceConnection, int) Context.bindService()} теперь требует явного использования {@link android.content.Intent}, а при неявном выполняется исключение. Чтобы обеспечить безопасность приложения, используйте явную цель при запуске или связывании {@link android.app.Service}. Не применяйте фильтры цели для сервиса.</p>
230
231<h3 id="BehaviorWebView">Если в приложении используется сервис WebView...</h3>
232
233<p>Android 5.0 изменяет функционирование вашего приложения по умолчанию.</p>
234<ul>
235<li><strong>Если приложение ориентировано на API уровня 21 или выше...</strong>
236  <ul>
237    <li>Система по умолчанию блокирует <a href="https://developer.mozilla.org/en-US/docs/Security/MixedContent" class="external-link">смешанный контент</a> и сторонние файлы cookie. Чтобы разрешить передачу таких данных, используйте соответственно методы {@link android.webkit.WebSettings#setMixedContentMode(int) setMixedContentMode()} и {@link android.webkit.CookieManager#setAcceptThirdPartyCookies(android.webkit.WebView, boolean) setAcceptThirdPartyCookies()}.</li>
238    <li>Теперь система целенаправленно выбирает разделы HTML-документа для извлечения. Такой подход уменьшает расход памяти и повышает производительность. Если вы хотите обработать весь документ сразу, отключите этот метод оптимизации путем вызова {@link android.webkit.WebView#enableSlowWholeDocumentDraw()}.</li>
239  </ul>
240</li>
241<li><strong>Если приложение ориентировано на API ниже уровня 21</strong>, система будет поддерживать смешанный контент и внешние файлы cookie, а также обрабатывать документы полностью.</li>
242</ul>
243
244<h2 id="UI">Пользовательский интерфейс</h2>
245
246<h3 id="MaterialDesign">Material Design</h3>
247
248<p>В будущей версии Android поддерживается новая концепция <em>Material Design</em>. Вы сможете создавать приложения с обновленным динамичным дизайном и органично меняющимися элементами интерфейса. Поддерживаются следующие функции:</p>
249
250<ul>
251
252  <li>тема Material;</li>
253  <li>тени при просмотре;</li>
254  <li>виджет {@link android.support.v7.widget.RecyclerView};</li>
255  <li>графическая анимация и эффекты;</li>
256  <li>анимация Material Design и эффекты отклика на действия;</li>
257  <li>инструменты для настройки свойств с учетом статуса просмотра;</li>
258  <li>настраиваемые виджеты для интерфейса и панели с цветовыми палитрами;</li>
259  <li>анимированная и неанимированная векторная графика на основе XML.</li>
260</ul>
261
262<p>Подробнее о том, как добавить элементы этого дизайна в свое приложение, читайте в разделе <a href="{@docRoot}training/material/index.html">Material Design</a>.</p>
263
264<h3 id="Recents">Одновременный просмотр документов и процессов на экране</h3>
265
266<p>В предыдущих выпусках на <a href="{@docRoot}guide/components/recents.html">экране недавно использованных функций</a> могла отображаться только одна задача для каждого приложения. Теперь там могут быть представлены и несколько задач, если вы одновременно работали с несколькими документами. Эта функция обеспечивает многозадачность, позволяя быстро переключаться между отдельными действиями и документами в списке недавно использованных. Одновременно выполняемыми задачами могут быть вкладки, открытые в веб-браузере, документы, одновременные состязания в игре или чаты в социальном приложении. Приложение может управлять задачами с помощью класса {@link android.app.ActivityManager.AppTask}.</p>
267
268<p>Чтобы вставить логический перерыв, после которого система будет воспринимать действие как новое, используйте {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} при запуске действия с помощью {@link android.app.Activity#startActivity(android.content.Intent) startActivity()}. Также можно выбрать для атрибута элемента <a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a> {@code documentLaunchMode} значение {@code "intoExisting"} или {@code "always"} непосредственно в манифесте.</p>
269
270<p>Чтобы ограничить количество данных на экране, можно задать максимальное число задач из приложения, которые будут там показываться. Для этого укажите для атрибута <a href="{@docRoot}guide/topics/manifest/application-element.html">&lt;application&gt;</a> значение {@link android.R.attr#maxRecents android:maxRecents}. В настоящее время можно указать до 50&nbsp;задач на пользователя (25 для устройств с небольшим объемом ОЗУ).</a></p>
271
272<p>Вы можете настроить сохранение задач на экране недавно использованных даже после перезагрузки. Для управления временем отображения применяется атрибут <a href="{@docRoot}reference/android/R.attr.html#persistableMode">android:persistableMode</a>. Вы также можете изменить визуальное отображение действия, то есть его цвет, ярлык и значок. Для этого следует вызвать метод {@link android.app.Activity#setTaskDescription(android.app.ActivityManager.TaskDescription) setTaskDescription()}.</p>
273
274<h3 id="WebView">Обновления WebView</h3>
275<p>В Android 5.0 обновлен процесс внедрения {@link android.webkit.WebView} для Chromium M37. Он стал более стабильным и безопасным, ошибки были устранены. Строка агента пользователя, которая по умолчанию использовалась для {@link android.webkit.WebView}, в Android 5.0 содержит номер версии (37.0.0.0).</p>
276
277<p>В этом выпуске представлен класс {@link android.webkit.PermissionRequest}, с помощью которого приложение обеспечивает {@link android.webkit.WebView} доступ к защищенным ресурсам, таким как камера и микрофон. Это делается с помощью инструментов API, например <a href="https://developer.mozilla.org/en-US/docs/NavigatorUserMedia.getUserMedia" class="external-link">getUserMedia()</a>. У вашего приложения должны быть все разрешения от Android на доступ к этим ресурсам. Тогда оно сможет передать их элементу {@link android.webkit.WebView}.</p>
278
279<p>Новый метод <code><a href="{@docRoot}reference/android/webkit/WebChromeClient.html#onShowFileChooser(android.webkit.WebView, android.webkit.ValueCallback<android.net.Uri[]>, android.webkit.WebChromeClient.FileChooserParams)">onShowFileChooser()</a></code> позволяет добавить в {@link android.webkit.WebView} поле для ввода, чтобы можно было выбирать файлы (изображения и&nbsp;т.&nbsp;п.) на устройстве Android.</p>
280
281<p>Также в этом выпуске поддерживаются открытые стандарты <a href="http://webaudio.github.io/web-audio-api/" class="external-link">WebAudio</a>, <a href="https://www.khronos.org/webgl/" class="external-link">WebGL</a> и <a href="http://www.webrtc.org/" class="external-link">WebRTC</a>. Подробнее о новых функциях в этом выпуске читайте в разделе <a href="https://developer.chrome.com/multidevice/webview/overview" class="external-link">WebView для Android</a>.</p>
282
283<h3 id="ScreenCapture">Сохранение и отправка данных с экрана</h3>
284<p>Android 5.0 поддерживает функцию сохранения данных с экрана и отправки их другим пользователям. Добавить ее в свое приложение можно с помощью нового API {@link android.media.projection}. Эта функция может быть очень полезной, например в приложениях для видеоконференций.</p>
285
286<p>Новый метод {@link android.media.projection.MediaProjection#createVirtualDisplay(java.lang.String, int, int, int, int, android.view.Surface, android.hardware.display.VirtualDisplay.Callback, android.os.Handler) createVirtualDisplay()} позволяет приложению сохранять снимок главного экрана (с дисплея по умолчанию) как объект {@link android.view.Surface}, который затем может быть передан по сети. С помощью этого API нельзя настроить сохранение защищенного контента и системных аудиоданных. Чтобы начать запись данных с экрана, приложение должно запросить разрешение пользователя с помощью {@link android.content.Intent} и метода {@link android.media.projection.MediaProjectionManager#createScreenCaptureIntent()}.</p>
287
288<p>Посмотреть, как используется новый API, можно в примере проекта (см. класс {@code MediaProjectionDemo}).</p>
289
290<h2 id="Notifications">Уведомления</h2>
291
292<h3 id="LockscreenNotifications">Уведомления на экране блокировки</h3>
293<p>На экране блокировки в Android 5.0 могут появляться уведомления. Чтобы при этом в них не отображались персональные данные, достаточно выбрать соответствующую опцию в <em>Настройках</em>.</p>
294
295<p>Если показ таких сведений запрещен, приложение автоматически выявляет их и скрывает из уведомления. Для настройки уведомлений вызовите {@link android.app.Notification.Builder#setVisibility(int) setVisibility()} и укажите одно из следующих значений:</p>
296
297<ul>
298<li>{@link android.app.Notification#VISIBILITY_PRIVATE VISIBILITY_PRIVATE}: показывать основные сведения, такие как значок, но скрывать все остальные сведения в уведомлении.</li>
299<li>{@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}: показывать уведомление полностью.</li>
300<li>{@link android.app.Notification#VISIBILITY_SECRET VISIBILITY_SECRET}: не показывать ничего, кроме значка уведомления.</li>
301</ul>
302
303<p>Если выбрано значение {@link android.app.Notification#VISIBILITY_PRIVATE VISIBILITY_PRIVATE}, вы также можете предоставить отредактированную версию уведомления, не содержащую личных данных. Например, приложение для отправки SMS может показывать уведомление с текстом "У вас 3 новых сообщения", но скрывать содержание и отправителей. Чтобы добавить альтернативное уведомление, сначала создайте замену с помощью {@link android.app.Notification.Builder}. При создании объекта уведомления с личными данными добавьте его замену, используя метод {@link android.app.Notification.Builder#setPublicVersion(android.app.Notification) setPublicVersion()}.</p>
304
305<h3 id="NotificationsMetadata">Метаданные уведомлений</h3>
306<p>Android 5.0 использует метаданные, связанные с уведомлениями в приложениях, чтобы сортировать их. Для настройки метаданных вызовите следующие методы в {@link android.app.Notification.Builder} при создании уведомления:</p>
307
308<ul>
309<li>{@link android.app.Notification.Builder#setCategory(java.lang.String) setCategory()}: сообщать системе, как обрабатывать уведомления, если устройство находится в режиме <em>приоритета</em> (например, если это уведомление о звонке, сообщении или будильнике).
310<li>{@link android.app.Notification.Builder#setPriority(int) setPriority()}: помечать уведомление как более или менее важное. Уведомления с полем приоритета {@link android.app.Notification#PRIORITY_MAX PRIORITY_MAX} или {@link android.app.Notification#PRIORITY_HIGH PRIORITY_HIGH} отображаются в маленьком всплывающем окне, если для них также настроены звуки и вибрация.</li>
311<li>{@link android.app.Notification.Builder#addPerson(java.lang.String) addPerson()}: возможность указать пользователей, связанных с уведомлением. Приложение может подать системе сигнал о том, что следует объединить уведомления от определенных пользователей или присвоить им более высокий рейтинг.</li>
312</ul>
313
314<h2 id="Graphics">Графика</h2>
315
316<h3 id="OpenGLES-3-1">Поддержка OpenGL ES версии 3.1</h3>
317<p>Android 5.0 поддерживает интерфейсы Java и OpenGL ES 3.1. Примеры новых функций OpenGL ES 3.1:</p>
318
319<ul>
320<li>вычислительные шейдеры;
321<li>отдельные объекты для шейдеров;
322<li>непрямые команды рисования;
323<li>мультисэмплинг и трафаретные шаблоны;
324<li>усовершенствованный язык шейдеров;
325<li>расширения для продвинутых режимов наложения и отладки;
326<li>обратная совместимость с OpenGL ES 2.0 и 3.0.
327</ul>
328
329<p>Интерфейс Java для OpenGL ES 3.1 на Android обеспечивается посредством элемента {@link android.opengl.GLES31}. При использовании OpenGL ES 3.1 убедитесь, что этот элемент объявлен в файле манифеста с помощью тега <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> и атрибута {@code android:glEsVersion}. Пример:</p>
330
331<pre>
332&lt;manifest&gt;
333    &lt;uses-feature android:glEsVersion="0x00030001" /&gt;
334    ...
335&lt;/manifest&gt;
336</pre>
337
338<p>Подробнее об использовании OpenGL ES (в том числе об определении поддерживаемой версии), читайте в соответствующем <a href="{@docRoot}guide/topics/graphics/opengl.html">руководстве по API</a>.</p>
339
340<h3 id="AndroidExtensionPack">Набор расширений для Android</h3>
341
342<p>Помимо OpenGL ES 3.1 в этом выпуске представлен набор расширений с интерфейсами Java и поддержкой продвинутых графических функций. Android воспринимает эти расширения как единый набор. (При наличии расширения {@code ANDROID_extension_pack_es31a} ваше приложение может зарегистрировать все расширения в наборе и включить шейдеры с помощью одного оператора {@code #extension}.)</p>
343
344<p>Набор расширений поддерживает следующие функции:</p>
345
346<ul>
347<li>Гарантированная поддержка пиксельных шейдеров для буферов, изображений и атомарных переменных (в OpenGL ES 3.1 пиксельные шейдеры использовать не обязательно).</li>
348<li>Тесселяция и геометрические шейдеры.</li>
349<li>Формат сжатия текстур ASTC (LDR).</li>
350<li>Посэмпловая интерполяция и затенение.</li>
351<li>Различные режимы наложения для каждого цвета в буфере кадра.</li>
352</ul>
353
354<p>Интерфейс Java для набора разрешений поддерживается с помощью {@link android.opengl.GLES31Ext}. В манифесте приложения вы можете объявить, что возможна установка только на устройства с поддержкой набора разрешений. Пример:</p>
355
356<pre>
357&lt;manifest&gt;
358    &lt;uses-feature android:name=“android.hardware.opengles.aep359        android:required="true" /&gt;
360    ...
361&lt;/manifest&gt;
362</pre>
363
364<h2 id="Media">Мультимедиа</h2>
365
366<h3 id="Camera-v2">API для расширенных возможностей камеры</h3>
367
368<p>Android 5.0 поддерживает новый API <a href="{@docRoot}reference/android/hardware/camera2/package-summary.html">android.hardware.camera2</a> для создания качественных фотографий и их последующей обработки. Теперь вы можете получать доступ к камерам в системе с помощью {@link android.hardware.camera2.CameraManager#getCameraIdList() getCameraIdList()} и подключаться к ним, используя {@link android.hardware.camera2.CameraManager#openCamera(java.lang.String, android.hardware.camera2.CameraDevice.StateCallback, android.os.Handler) openCamera()}. Чтобы начать фотосъемку, создайте {@link android.hardware.camera2.CameraCaptureSession} и укажите объекты {@link android.view.Surface} для отправки сделанных фото. {@link android.hardware.camera2.CameraCaptureSession} можно настроить на однократные или многократные снимки.</p>
369
370<p>Чтобы получать уведомления при создании новых снимков, внедрите обработчик событий {@link android.hardware.camera2.CameraCaptureSession.CaptureCallback} и настройте его на соответствующий запрос. После того как система выполнит запрос на создание снимка, обработчик {@link android.hardware.camera2.CameraCaptureSession.CaptureCallback} получит вызов {@link android.hardware.camera2.CameraCaptureSession.CaptureCallback#onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult) onCaptureCompleted()} и передаст вам метаданные изображения в виде {@link android.hardware.camera2.CaptureResult}.</p>
371
372<p>С помощью класса {@link android.hardware.camera2.CameraCharacteristics} приложение может определять, какие свойства камеры доступны на устройстве. Свойства объекта {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL INFO_SUPPORTED_HARDWARE_LEVEL} позволяют получать данные о функциональности камеры.</p>
373
374<ul>
375  <li>Все устройства поддерживают ПО не ниже уровня {@link android.hardware.camera2.CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY}. Его свойства примерно соответствуют устаревшему API {@link android.hardware.Camera}.</li>
376  <li>Устройства, которые поддерживают ПО уровня {@link android.hardware.camera2.CameraMetadata#INFO_SUPPORTED_HARDWARE_LEVEL_FULL INFO_SUPPORTED_HARDWARE_LEVEL_FULL}, позволяют вручную управлять съемкой и обработкой изображений в высоком разрешении и с высокой кадровой частотой.</li>
377</ul>
378
379<p>Подробнее об использовании обновленного API <a href="{@docRoot}reference/android/hardware/camera2/package-summary.html">камеры</a> см. в примерах {@code Camera2Basic} и {@code Camera2Video} в этом выпуске.</p>
380
381<h3 id="AudioPlayback">Воспроизведение аудио</h3>
382<p>В этом выпуске представлены следующие изменения {@link android.media.AudioTrack}:</p>
383<ul>
384  <li>Приложение теперь может передавать аудиоданные в формате с плавающей точкой ({@link android.media.AudioFormat#ENCODING_PCM_FLOAT ENCODING_PCM_FLOAT}). Это расширяет динамический диапазон, обеспечивает точность звука и более широкое звуковое пространство. Арифметика с плавающей точкой особенно полезна при промежуточных вычислениях. Конечные точки воспроизведения используют для аудиоданных формат целых чисел и более низкую битовую глубину. (В Android 5.0 внутренний конвейер пока ещё не полностью поддерживает формат с плавающей точкой.)
385  <li>Ваше приложение теперь может передавать аудиоданные как {@link java.nio.ByteBuffer}&nbsp;– в том же формате, что и {@link android.media.MediaCodec}.
386  <li>Опция {@link android.media.AudioTrack#WRITE_NON_BLOCKING WRITE_NON_BLOCKING} упрощает буферизацию и многопоточную обработку для некоторых изображений.
387</ul>
388
389<h3 id="MediaPlaybackControl">Управление воспроизведением мультимедиа</h3>
390<p>Используйте новые API для мультимедиа и уведомлений, чтобы в интерфейсе системы регистрировалось воспроизведение файлов, а также отображались обложки альбомов. Новые классы {@link android.media.session.MediaSession} и {@link android.media.session.MediaController} упрощают управление воспроизведением в интерфейсе и сервисах.</p>
391
392<p>Класс {@link android.media.session.MediaSession} теперь используется вместо {@link android.media.RemoteControlClient}. В нем представлен один набор методов обратного вызова для управления передачей и воспроизведением. Если ваше приложение поддерживает воспроизведение мультимедиа и работает на платформе Android <a href="{@docRoot}tv/index.html">TV</a> или <a href="{@docRoot}wear/index.html">Wear</a>, используйте класс {@link android.media.session.MediaSession} для управления передачей данных с помощью тех же методов обратного вызова.</p>
393
394<p>Новый класс {@link android.media.session.MediaController} позволяет создать собственное приложение для управления мультимедиа. Он обеспечивает безопасное отслеживание и управление воспроизведением видео через процесс пользовательского интерфейса приложения. При создании контроллера укажите объект {@link android.media.session.MediaSession.Token}, чтобы приложение могло взаимодействовать с указанным {@link android.media.session.MediaSession}. С помощью методов {@link android.media.session.MediaController.TransportControls} можно отправлять такие команды, как {@link android.media.session.MediaController.TransportControls#play() play()}, {@link android.media.session.MediaController.TransportControls#stop() stop()}, {@link android.media.session.MediaController.TransportControls#skipToNext() skipToNext()} и {@link android.media.session.MediaController.TransportControls#setRating(android.media.Rating) setRating()} для управления воспроизведением мультимедиа во время сеанса. Контроллер также позволяет зарегистрировать объект {@link android.media.session.MediaController.Callback} для отслеживания изменений метаданных и статусов во время сеанса.</p>
395
396<p>Кроме того, вы можете создавать уведомления с функцией управления воспроизведением. Связь с сессией обеспечивается посредством нового класса {@link android.app.Notification.MediaStyle}.</p>
397
398<h3 id="MediaBrowsing">Поиск и просмотр мультимедиа</h3>
399<p>В Android 5.0 приложения могут искать контент в библиотеке другого приложения с помощью нового API <a href="{@docRoot}reference/android/media/browse/package-summary.html">android.media.browse</a>. Чтобы открыть доступ к медиаконтенту в своем приложении, расширьте класс {@link android.service.media.MediaBrowserService}. При внедрении {@link android.service.media.MediaBrowserService} должен быть обеспечен доступ к {@link android.media.session.MediaSession.Token}, чтобы в приложении мог воспроизводиться медиаконтент, полученный через ваш сервис.</p>
400<p>Используйте класс {@link android.media.browse.MediaBrowser} для взаимодействия с сервисом браузера для мультимедиа. При создании экземпляра {@link android.media.browse.MediaBrowser} укажите название компонента для {@link android.media.session.MediaSession}. С помощью этого экземпляра браузера ваше приложение сможет подключиться к указанному сервису и получить объект {@link android.media.session.MediaSession.Token} для воспроизведения контента.</p>
401
402<h2 id="Storage">Хранение данных</h2>
403
404<h3 id="DirectorySelection">Выбор каталогов</h3>
405
406<p>В Android 5.0 расширена <a href="{@docRoot}guide/topics/providers/document-provider.html">инфраструктура обращения к памяти</a>, что позволяет пользователям выбирать целое поддерево каталога. Приложения получают доступ к чтению/записи во всех документах. Пользователю не приходится каждый раз подтверждать это.</p>
407
408<p>Чтобы выбрать поддерево каталога, создайте и отправьте цель {@link android.content.Intent#ACTION_OPEN_DOCUMENT_TREE OPEN_DOCUMENT_TREE}. Система отображает все экземпляры {@link android.provider.DocumentsProvider}, которые поддерживают выбор поддерева. Пользователь может найти и выбрать нужный каталог. При этом возвращается URI для доступа к выбранному поддереву. Чтобы изучить его, используйте {@link android.provider.DocumentsContract#buildChildDocumentsUriUsingTree(android.net.Uri, java.lang.String) buildChildDocumentsUriUsingTree()}, {@link android.provider.DocumentsContract#buildDocumentUriUsingTree(android.net.Uri, java.lang.String) buildDocumentUriUsingTree()} и {@link android.content.ContentResolver#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) query()}.</p>
409
410<p>Новый метод {@link android.provider.DocumentsContract#createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String) createDocument()} позволяет создавать новые документы и каталоги в поддереве. Для управления существующими документами используйте {@link android.provider.DocumentsContract#renameDocument(android.content.ContentResolver, android.net.Uri, java.lang.String) renameDocument()} и {@link android.provider.DocumentsProvider#deleteDocument(java.lang.String) deleteDocument()}. Проверьте {@link android.provider.DocumentsContract.Document#COLUMN_FLAGS COLUMN_FLAGS} и убедитесь, что провайдер поддерживает нужные вызовы.</p>
411
412<p>Если вы используете {@link android.provider.DocumentsProvider} и хотите, чтобы можно было выбрать поддерево, внедрите {@link android.provider.DocumentsProvider#isChildDocument(java.lang.String, java.lang.String) isChildDocument()} и добавьте {@link android.provider.DocumentsContract.Root#FLAG_SUPPORTS_IS_CHILD FLAG_SUPPORTS_IS_CHILD} в {@link android.provider.DocumentsContract.Root#COLUMN_FLAGS COLUMN_FLAGS}.</p>
413
414<p>В Android 5.0 также появились новые каталоги в едином хранилище. Они предназначены специально для пакетов. Медиафайлы оттуда включаются в {@link android.provider.MediaStore}. Новый элемент {@link android.content.Context#getExternalMediaDirs()} возвращает пути к каталогам на всех устройствах с единым хранилищем. Как и в случае {@link android.content.Context#getExternalFilesDir(java.lang.String) getExternalFilesDir()}, здесь не требуется дополнительных разрешений для перехода к возвращаемым файлам. Платформа периодически ищет новые файлы в указанных каталогах, но вы можете использовать для этого {@link android.media.MediaScannerConnection}.</p>
415
416<h2 id="Wireless">Беспроводные сети и подключения</h2>
417
418<h3 id="Multinetwork">Подключения к нескольким сетям</h3>
419<p>Android 5.0 поддерживает ряд API для работы в нескольких сетях одновременно. Приложение может постоянно искать доступные сети с определенными свойствами, а также подключаться к ним. Эта функция полезна, если ваше приложение работает в специальных сетях, таких как SUPL, MMS или сети с биллингом оператора связи, а также если для отправки данных используется определенный протокол.</p>
420
421<p>Чтобы приложение регулярно выполняло поиск доступных сетей и подключалось к ним, выполните следующие действия:</p>
422
423<ol>
424 <li>Создайте {@link android.net.ConnectivityManager}.</li>
425 <li>Используйте класс {@link android.net.NetworkRequest.Builder} для создания объекта {@link android.net.NetworkRequest}, укажите свойства сети и тип перехода, необходимый для приложения.</li>
426<li>Чтобы выполнить поиск подходящих сетей, вызовите {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) requestNetwork()} или {@link android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} и передайте объект {@link android.net.NetworkRequest}, а также внедрите {@link android.net.ConnectivityManager.NetworkCallback}. Если вы хотите сразу переключаться на подходящую сеть при ее обнаружении, используйте метод {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) requestNetwork()}. Если же вам нужно только получать уведомления о найденных сетях, используйте {@link android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}.</li>
427</ol>
428
429<p>При обнаружении подходящей сети система подключается к ней и отправляет ответ {@link android.net.ConnectivityManager.NetworkCallback#onAvailable(android.net.Network) onAvailable()}. Для получения дополнительных сведений о сети можно использовать объект {@link android.net.Network} в ответе. Он же применяется для перенаправления трафика в выбранную сеть.</p>
430
431<h3 id="BluetoothBroadcasting">Низкоэнергетический Bluetooth</h3>
432<p>В Android версии 4.3 была представлена поддержка <a href="{@docRoot}guide/topics/connectivity/bluetooth-le.html">низкоэнергетического Bluetooth</a> (<em>Bluetooth LE</em>) как основного способа передачи данных. Устройство на Android 5.0 может быть <em>периферийным</em> с поддержкой Bluetooth низкой мощности. Эта функция позволяет приложениям связываться с устройствами, расположенными неподалеку. Например, ваше приложение может работать как шагомер или отслеживать иные показатели, передавая данные на другое близко расположенное устройство по сети Bluetooth.</p>
433<p>Новый API {@link android.bluetooth.le} позволяет приложениям передавать рекламу, получать отчеты и устанавливать связь с другими устройствами, поддерживающими Bluetooth LE. Чтобы воспользоваться новыми функциями, добавьте в манифест разрешение {@link android.Manifest.permission#BLUETOOTH_ADMIN BLUETOOTH_ADMIN}. Скачивая приложение или обновления для него в Google Play, пользователи должны дать разрешение на сбор данных о Bluetooth, управление этой функцией, а также на обмен информацией с устройствами по соседству.</p>
434
435<p>Чтобы начать передачу рекламы по Bluetooth LE на другие устройства, вызовите {@link android.bluetooth.le.BluetoothLeAdvertiser#startAdvertising(android.bluetooth.le.AdvertiseSettings, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseCallback) startAdvertising()} и передайте данные о внедрении класса {@link android.bluetooth.le.AdvertiseCallback}. Объект обратного вызова получает отчет об успешном или неуспешном показе рекламы.</p>
436
437<p> С помощью класса {@link android.bluetooth.le.ScanFilter}, который появился в Android 5.0, ваше приложение сможет искать только определенные типы устройств. Чтобы начать поиск устройств с поддержкой Bluetooth LE, вызовите {@link android.bluetooth.le.BluetoothLeScanner#startScan(android.bluetooth.le.ScanCallback) startScan()} и передайте список фильтров. При вызове метода также следует внедрить {@link android.bluetooth.le.ScanCallback}, чтобы получать уведомления о найденной рекламе. </p>
438
439<h3 id="NFCEnhancements">Новые возможности NFC</h3>
440<p>В Android 5.0 реализованы следующие улучшения NFC:</p>
441
442<ul>
443<li>В меню <em>Поделиться</em> теперь доступен вариант Android Beam.</li>
444<li>Ваше приложение может активировать Android Beam на пользовательском устройстве путем вызова {@link android.nfc.NfcAdapter#invokeBeam(android.app.Activity) invokeBeam()}. Пользователю не нужно будет вручную подключаться к другому устройству с поддержкой NFC, чтобы передать данные.</li>
445<li>Новый метод {@link android.nfc.NdefRecord#createTextRecord(java.lang.String, java.lang.String) createTextRecord()} позволяет создать запись NDEF с текстовыми данными в кодировке UTF-8.</li>
446<li>В приложениях для платежей теперь можно динамически регистрировать идентификатор NFC (AID), просто вызывая <code><a href="{@docRoot}reference/android/nfc/cardemulation/CardEmulation.html#registerAidsForService(android.content.ComponentName, java.lang.String, java.util.List<java.lang.String>)">registerAidsForService()</a></code>. Вы также можете использовать {@link android.nfc.cardemulation.CardEmulation#setPreferredService(android.app.Activity, android.content.ComponentName) setPreferredService()}, чтобы указать предпочтительный сервис эмуляции карт, который будет использоваться при определенных действиях в фоне.</li>
447</ul>
448
449<h2 id="Power">Project Volta</h2>
450
451<p>Помимо новых функций Android 5.0 также отличается улучшенными возможностями для экономии заряда аккумулятора. С помощью новых API и инструментов можно оптимизировать расход энергии для приложения.</p>
452
453<h3 id="JobScheduler">Планирование заданий</h3>
454<p>В Android 5.0 есть API {@link android.app.job.JobScheduler}. Эта новинка позволяет оптимизировать расход энергии за счет асинхронного распределения заданий, которые выполняются не сразу или только в определенных условиях (например, при зарядке устройства). Планирование заданий полезно в следующих случаях:</p>
455<ul>
456  <li>В приложении есть недоступные пользователю процессы, которые можно отложить.</li>
457  <li>В приложении есть процессы, которые лучше выполнять во время зарядки.</li>
458  <li>В приложении есть задачи, которые требуют подключения к сети или Wi-Fi.</li>
459  <li>В приложении есть ряд задач, которые нужно выполнять одновременно и регулярно.</li>
460
461</ul>
462
463<p>Каждая элементарная операция заключена в объект {@link android.app.job.JobInfo}, который определяет критерии для расписания.</p>
464
465<p>Чтобы настроить процесс выполнения задачи, используйте класс {@link android.app.job.JobInfo.Builder}. Вы можете указать определенные условия, например:</p>
466
467<ul>
468  <li>Запуск при зарядке устройства.</li>
469  <li>Запуск при подключении устройства к неограниченной сети.</li>
470  <li>Запуск в режиме ожидания.</li>
471  <li>Завершение в указанный срок или максимально быстрое выполнение.</li>
472</ul>
473
474<p>Например, для выполнения задачи в неограниченной сети можно добавить следующий код:</p>
475
476<pre>
477JobInfo uploadTask = new JobInfo.Builder(mJobId,
478                                         mServiceComponent /* JobService component */)
479        .setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED)
480        .build();
481JobScheduler jobScheduler =
482        (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
483jobScheduler.schedule(uploadTask);
484</pre>
485
486<p>Если питание устройства стабильно (то есть оно подключено к сети более 2 минут, а аккумулятор <a href="{@docRoot}reference/android/content/Intent.html#ACTION_BATTERY_OKAY">достаточно заряжен</a>), система будет выполнять все запланированные задания, даже если указанное время еще не наступило.</p>
487
488<p>Пример использования API {@link android.app.job.JobScheduler} см. в образце {@code JobSchedulerSample} данного выпуска.</p>
489
490<h3 id="PowerMeasurementTools">Инструменты для разработчиков (использование батареи)</h3>
491
492<p>Новая команда {@code dumpsys batterystats} позволяет получить интересные статистические данные об использовании аккумуляторов в устройствах (с учетом уникальных идентификаторов пользователей&nbsp;– UID). Статистика включает в себя следующие данные:</p>
493
494<ul>
495<li>Историю событий, связанных с работой аккумулятора.
496<li>Общую статистику по работе устройства.
497<li>Примерные энергозатраты по отдельным идентификаторам пользователей и компонентам системы.
498<li>Расход на передачу мобильных данных для каждого приложения (мс на пакет).
499<li>Общую статистику системы для каждого идентификатора пользователя.
500<li>Общую статистику приложения для каждого идентификатора пользователя.
501</ul>
502
503<p>Чтобы узнать о разных функциях для вывода конкретных данных, используйте опцию {@code --help}. Например, чтобы получить статистику по энергозатратам для определенного приложения с момента последней зарядки устройства, выполните эту команду:
504<pre>
505$ adb shell dumpsys batterystats --charged &lt;package-name&gt;
506</pre>
507
508<p>Вы можете воспользоваться инструментом <a href="https://github.com/google/battery-historian" class="external-link">Battery Historian</a> при выводе команды {@code dumpsys}, чтобы создать HTML-визуализацию событий, связанных с расходом энергии и сохраненных в журналах. Это позволит вам обнаружить проблемы, приводящие к низкой энергоэффективности приложения.</p>
509
510<h2 id="Enterprise">Android для работы и учебы</h2>
511<h3 id="ManagedProvisioning">Контролируемые профили</h3>
512
513<p>В Android 5.0 представлены новые функции для использования приложений в корпоративной среде. <a href="{@docRoot}guide/topics/admin/device-admin.html">Администратор устройства</a> может создать отдельный <em>контролируемый профиль</em> для пользователя, у которого есть личный аккаунт. Приложения, связанные с такими профилями, отображаются наряду с прочими в списках недавно использованных, в уведомлениях и на экране запуска.</p>
514
515<p>Чтобы запустить процесс настройки контролируемых профилей, отправьте {@link android.app.admin.DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE ACTION_PROVISION_MANAGED_PROFILE} в {@link android.content.Intent}. При успешном вызове система вернет ответ {@link android.app.admin.DeviceAdminReceiver#onProfileProvisioningComplete(android.content.Context, android.content.Intent) onProfileProvisioningComplete()}. Затем вы сможете вызвать {@link android.app.admin.DevicePolicyManager#setProfileEnabled(android.content.ComponentName) setProfileEnabled()} и включить нужный профиль.</p>
516
517<p>По умолчанию в контролируемых профилях используется лишь небольшое число приложений. Чтобы установить дополнительные приложения, вызовите {@link android.app.admin.DevicePolicyManager#enableSystemApp(android.content.ComponentName, android.content.Intent) enableSystemApp()}.</p>
518
519<p>В модулях запуска можно использовать новый класс {@link android.content.pm.LauncherApps}, чтобы получить список возможных действий для текущего пользователя и для всех связанных с ним контролируемых профилей. Контролируемые приложения могут быть отмечены дополнительным значком. Чтобы добавить значок, вызовите {@link android.content.pm.PackageManager#getUserBadgedIcon(android.graphics.drawable.Drawable, android.os.UserHandle) getUserBadgedIcon()}.</p>
520
521<p>Подробнее об использовании новых функций см. в примере внедрения {@code BasicManagedProfile} в данном выпуске.</p>
522
523<h3 id="DeviceOwner">Владелец устройства</h3>
524<p>В Android 5.0 можно использовать приложение, которое назначает владельца устройства. <em>Владелец устройства</em>&nbsp;– это <a href="{@docRoot}guide/topics/admin/device-admin.html">администратор устройства</a>, который может создавать и удалять вторичных пользователей, а также менять глобальные настройки. Он использует методы из класса {@link android.app.admin.DevicePolicyManager} для точного управления конфигурацией, безопасностью и приложениями на доступных устройствах. У устройства может быть только один действующий владелец в определенный момент времени.</p>
525
526<p>Чтобы использовать эту функцию, необходимо с помощью NFC перенести данные из программируемого приложения на устройство, которое ещё не сконфигурировано. При этом передаются те же данные, что и в процессе, который описан в разделе <a href="#ManagedProvisioning">Контролируемые профили</a>.</p>
527
528<h3 id="ScreenPinning">Блокировка в приложении</h3>
529
530<p>В Android 5.0 используется новый API для блокировки в приложении. С его помощью можно временно запретить пользователям отменять задачи или получать уведомления. Это может быть полезно, например, если вы разрабатываете образовательные приложения, требующие высокой степени контроля, а также однозадачные или киоск-приложения. При такой блокировке пользователи не смогут просматривать уведомления, открывать другие приложения или переходить на главный экран, пока этот режим не будет отключен.</p>
531
532<p>Режим блокировки в приложении можно активировать двумя способами:</p>
533
534<ul>
535<li><strong>Вручную.</strong> В разделе <em>Настройки &gt; Безопасность &gt; Блокировка в приложении</em> пользователи могут выбрать задачи, которые требуется закрепить. Нужно просто нажать на зеленый значок.</li> <li><strong>Программно.</strong> Вызовите в приложении {@link android.app.Activity#startLockTask() startLockTask()}, чтобы активировать блокировку. Если запрашивающее приложение не является владельцем устройства, пользователь должен будет подтвердить действие. Владелец устройства может вызвать метод {@link android.app.admin.DevicePolicyManager#setLockTaskPackages(android.content.ComponentName, java.lang.String[]) setLockTaskPackages()}, чтобы разрешить приложениям активировать этот режим без согласия пользователя.</li>
536</ul>
537
538<p>Если блокировка задач активна, происходит следующее:</p>
539
540<ul>
541<li>Строка состояния пуста, уведомления и сведения о состоянии скрыты.</li>
542<li>Кнопки для перехода на главную страницу и к списку недавно использованных приложений скрыты.</li>
543<li>Новые действия в других приложениях недоступны.</li>
544<li>В действующем приложении действия выполняться могут, если при этом не создаются новые задачи.</li>
545<li>Если блокировка в приложении активирована владельцем устройства, пользователь не может выйти из приложения, пока последний не вызовет {@link android.app.Activity#stopLockTask() stopLockTask()}.</li>
546<li>Если блокировка активирована другим приложением или самим пользователем, переключиться в другой режим можно, нажав кнопки "Назад" и "Недавние".</li>
547
548</ul>
549
550<h2 id="Printing">Инфраструктура печати</h2>
551
552<h3 id="PDFRender">Обработка PDF как растрового изображения</h3>
553<p>Теперь PDF-документы можно превращать в растровые изображения для печати. Для этого создан новый класс {@link android.graphics.pdf.PdfRenderer}. Необходимо указать атрибут {@link android.os.ParcelFileDescriptor} с возможностью поиска (чтобы обеспечить удобный доступ к контенту). Система добавит туда содержимое для печати. Приложение получает страницу с помощью {@link android.graphics.pdf.PdfRenderer#openPage(int) openPage()}, а затем вызывает {@link android.graphics.pdf.PdfRenderer.Page#render(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Matrix, int) render()}, чтобы преобразовать {@link android.graphics.pdf.PdfRenderer.Page} в растровый формат. Вы также можете настроить дополнительные параметры, если в графический файл необходимо превратить только часть документа (например, для <a href="http://en.wikipedia.org/wiki/Tiled_rendering" class="external-link">мозаичной обработки</a> и увеличения фрагментов).</p>
554
555<p>Подробнее об использовании нового API см. в примере {@code PdfRendererBasic}.</p>
556
557<h2 id="System">Система</h2>
558<h3 id="AppUsageStatistics">Статистика по использованию приложений</h3>
559<p>Новый API {@link android.app.usage} позволяет просматривать историю использования приложений на устройствах Android. При этом вы получаете более подробные данные, чем в случае с устаревшим методом {@link android.app.ActivityManager#getRecentTasks(int, int) getRecentTasks()}. Чтобы использовать новый API, необходимо добавить разрешение {@code "android.permission.PACKAGE_USAGE_STATS"} в манифест. Пользователь также должен разрешить доступ к этому приложению в разделе <em>Настройки &gt; Безопасность &gt; Приложения</em>.</p>
560
561<p>Система собирает данные об использовании отдельных приложений за день, неделю, месяц и год. Максимальные сроки хранения данных в системе:</p>
562
563<ul>
564  <li>Ежедневные: 7&nbsp;дней.</li>
565  <li>Еженедельные: 1&nbsp;месяц.</li>
566  <li>Ежемесячные: 6&nbsp;месяцев.</li>
567  <li>Ежегодные: 2&nbsp;года.</li>
568</ul>
569
570<p>Для каждого приложения в системе сохраняются следующие данные:</p>
571<ul>
572<li>Дата последнего использования приложения.</li>
573<li>Общее время активной работы приложения за указанный срок (день, неделю, месяц или год).</li>
574<li>Временная метка, указывающая на то, когда компонент (определяемый по названию пакета или действия) был перемещен в фон или в основные процессы.</li>
575<li>Временная метка, указывающая на изменение конфигурации устройства (например, на поворот изображения на экране).</li>
576</ul>
577
578<h2 id="TestingA11y">Тестирование и доступность </h2>
579
580<h3 id="TestingA11yImprovements">Новые возможности тестирования и оценки доступности</h3>
581<p>В Android 5.0 реализованы следующие функции для тестирования и оценки доступности:</p>
582
583<ul>
584<li>Новые методы {@link android.app.UiAutomation#getWindowAnimationFrameStats() getWindowAnimationFrameStats()} и {@link android.app.UiAutomation#getWindowContentFrameStats(int) getWindowContentFrameStats()} собирают статистику по кадрам для анимации в окнах и для контента. С их помощью можно создавать диагностические тесты и оценивать, с достаточной ли частотой приложение показывает кадры. Так вы сможете следить за удобством для пользователей.</li>
585
586<li>Новый метод {@link android.app.UiAutomation#executeShellCommand(java.lang.String) executeShellCommand()} позволяет выполнять команды для оболочки непосредственно в диагностических тестах. Выполнение команды похоже на запуск {@code adb shell} с хоста, подключенного к устройству. Это позволяет использовать инструменты на основе оболочки, такие как {@code dumpsys}, {@code am}, {@code content} и {@code pm}.</li>
587
588<li>Сервисы и инструменты для тестирования, которые используют API специальных возможностей (например, <a href="{@docRoot}tools/help/uiautomator/index.html">{@code UiAutomator}</a>), теперь могут получать подробные сведения о свойствах окон на экране, с которыми взаимодействуют пользователи. Чтобы получить список объектов {@link android.view.accessibility.AccessibilityWindowInfo}, вызовите новый метод {@link android.accessibilityservice.AccessibilityService#getWindows() getWindows()}.</li>
589
590<li>Новый класс {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction} позволяет определить стандарт для пользовательских действий, выполняемых на {@link android.view.accessibility.AccessibilityNodeInfo}. Класс {@link android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction} заменяет API, связанные с действиями, которые ранее использовались в {@link android.view.accessibility.AccessibilityNodeInfo}.</li>
591
592<li>Android 5.0 обеспечивает более точное управление синтезом речи и распознаванием текста в приложении. Класс {@link android.speech.tts.Voice} позволяет использовать в приложении голосовые профили, связанные с определенными локалями, качеством и временем реакции, а также задавать параметры для определенных систем.</li>
593</ul>
594
595<h2 id="IME">Редактор способов ввода (IME)</h2>
596
597<h3 id="Switching">Упрощенное переключение между языками ввода</h3>
598
599<p>В Android 5.0 пользователям будет проще переключаться между <a href="{@docRoot}guide/topics/text/creating-input-method.html">редакторами способов ввода</a>, которые поддерживаются платформой. С помощью одного действия (обычно это нажатие на значок глобуса на электронной клавиатуре) можно будет переключаться между всеми доступными языками. Это обеспечивается посредством метода {@link android.view.inputmethod.InputMethodManager#shouldOfferSwitchingToNextInputMethod(android.os.IBinder) shouldOfferSwitchingToNextInputMethod()}.</p>
600
601<p>Кроме того, теперь инфраструктура проверяет, есть ли в следующем редакторе механизм переключения (то есть поддерживается ли такая функция). Для замены всегда выбирается редактор способов ввода с механизмом переключения. Это обеспечивается посредством метода {@link android.view.inputmethod.InputMethodManager#switchToNextInputMethod(android.os.IBinder, boolean) switchToNextInputMethod()}.
602
603<p>Пример использования обновленного API для переключения способов ввода см. в образце внедрения клавиатуры в данном выпуске. Подробнее о том, как обеспечить переключение между способами, читайте в разделе <a href="{@docRoot}guide/topics/text/creating-input-method.html">Создание способов ввода</a>.
604</p>
605
606<h2 id="Manifest">Объявление манифеста</h2>
607
608<h3 id="ManifestFeatures">Объявляемые обязательные функции</h3>
609<p>В элементе <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a> теперь могут содержаться приведенные ниже значения, а ваше приложение будет устанавливаться только на устройства, обладающие нужными функциями.</p>
610
611<ul>
612<li>{@link android.content.pm.PackageManager#FEATURE_AUDIO_OUTPUT}</li>
613<li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING}</li>
614<li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR}</li>
615<li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_CAPABILITY_RAW}</li>
616<li>{@link android.content.pm.PackageManager#FEATURE_CAMERA_LEVEL_FULL}</li>
617<li>{@link android.content.pm.PackageManager#FEATURE_GAMEPAD}</li>
618<li>{@link android.content.pm.PackageManager#FEATURE_LIVE_TV}</li>
619<li>{@link android.content.pm.PackageManager#FEATURE_MANAGED_USERS}</li>
620<li>{@link android.content.pm.PackageManager#FEATURE_LEANBACK}</li>
621<li>{@link android.content.pm.PackageManager#FEATURE_OPENGLES_EXTENSION_PACK}</li>
622<li>{@link android.content.pm.PackageManager#FEATURE_SECURELY_REMOVES_USERS}</li>
623<li>{@link android.content.pm.PackageManager#FEATURE_SENSOR_AMBIENT_TEMPERATURE}</li>
624<li>{@link android.content.pm.PackageManager#FEATURE_SENSOR_HEART_RATE_ECG}</li>
625<li>{@link android.content.pm.PackageManager#FEATURE_SENSOR_RELATIVE_HUMIDITY}</li>
626<li>{@link android.content.pm.PackageManager#FEATURE_VERIFIED_BOOT}</li>
627<li>{@link android.content.pm.PackageManager#FEATURE_WEBVIEW}</li>
628</ul>
629
630<h3 id="Permissions">Разрешения для пользователей</h3>
631
632<p>В элементе <a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">{@code <uses-permission>}</a> теперь поддерживается приведенное ниже разрешение, с помощью которого вы сможете обеспечить доступ приложения к определенным API.</p>
633
634<ul>
635<li>{@link android.Manifest.permission#BIND_DREAM_SERVICE}: при работе с API уровня 21 и выше это разрешение требуется для сервиса <a href="{@docRoot}about/versions/android-4.2.html#Daydream">Daydream</a>, чтобы к нему могла подключаться только система.</li>
636</ul>
637