Функции KitKat

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

Обзор

Операционная система Android 4.4 (уровень API 19), также известная как "KitKat", была выпущена в конце 2013 года. KitKat предлагает ряд новых функций и усовершенствований, в том числе:

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

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

  • Оборудование— превратить любое приложение в NFC карта с эмуляции карты на основе узла NFC; выполните датчики с низкой мощностью с SensorManager помощью.

  • Средства разработчика — приложения Screencast в действии с клиентом Android Debug Bridge, доступным в составе пакета SDK для Android.

Это руководство содержит рекомендации по миграции существующего приложения Xamarin.Android в KitKat, а также общий обзор KitKat для разработчиков для Xamarin.Android.

Требования

Для разработки приложений Xamarin.Android, использующих KitKat, требуется установить Xamarin.Android 4.11.0 или более поздней версии и Android 4.4 (уровень API 19) с помощью Диспетчера SDK Android, как показано на приведенном ниже снимке экрана.

Выбор Android 4.4 в Диспетчере SDK Android

Миграция приложения в KitKat

В этом разделе рассматриваются первоочередные рекомендации, которые помогут перенести существующие приложения в Android 4.4.

Проверка версии системы

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

if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat) {
    //KitKat only code here
}

Пакетная обработка сигналов

В Android используются службы сигнализации для пробуждения приложения в фоновом режиме в указанное время. В KitKat возможности данной функции расширены и применяется пакетная обработка сигналов для снижения энергопотребления. Это означает, что вместо пробуждения каждого приложения в точное время KitKat предпочитает сгруппировать несколько приложений, зарегистрированных для пробуждения в течение одного интервала времени, и одновременно вывести их из спящего режима. Чтобы указать Android пробудить приложение в течение заданного интервала времени, вызовите SetWindow для AlarmManager, передав минимальное и максимальное время пробуждения приложения в миллисекундах, а также операцию, выполняемую при пробуждении. В следующем коде приведен пример приложения, которое должно быть пробуждено в течение 0,5–1 часа после установки интервала.

AlarmManager alarmManager = (AlarmManager)GetSystemService(AlarmService);
alarmManager.SetWindow (AlarmType.Rtc, AlarmManager.IntervalHalfHour, AlarmManager.IntervalHour, pendingIntent);

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

alarmManager.SetExact (AlarmType.Rtc, AlarmManager.IntervalDay, pendingIntent);

KitKat больше не позволяет задать точный повторяющийся сигнал. Теперь в приложениях, использующих SetRepeating и требуются точные оповещения для работы, теперь потребуется активировать каждую сигнализацию вручную.

Внешнее хранилище

Теперь внешнее хранилище делится на два типа: уникальное хранилище для приложения и данные, совместно используемые несколькими приложениями. Для чтения и записи в конкретное расположение приложения во внешнем хранилище не требуются специальные разрешения. Для взаимодействия с данными в общем хранилище теперь требуется разрешение READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE. Эти два типа можно классифицировать следующим образом.

  • Если вы получаете путь к файлу или каталогу, вызывая метод, Context например, GetExternalFilesDir или GetExternalCacheDirs

    • то приложению не требуются дополнительные разрешения.
  • Если вы получаете путь к файлу или каталогу, получая доступ к свойству или вызывая метод Environment , например GetExternalStorageDirectory Или GetExternalStoragePublicDirectory Приложению требуется READ_EXTERNAL_STORAGE разрешение или WRITE_EXTERNAL_STORAGE разрешение.

Примечание.

WRITE_EXTERNAL_STORAGE подразумевает разрешение READ_EXTERNAL_STORAGE, поэтому нужно установить только одно разрешение.

Консолидация SMS

KitKat упрощает обмен сообщениями для пользователя, объединяя все содержимое SMS в одном приложении по умолчанию, выбранном пользователем. Разработчик должен обеспечить возможность выбора своего приложения для обмена сообщениями по умолчанию, а также корректную работу своего кода в реальной ситуации, если приложение не выбрано. Дополнительные сведения о переносе приложения для обмена SMS в KitKat см. в руководстве по подготовке приложений для обмена SMS к работе в KitKat от Google.

Приложения WebView

Возможности WebView в KitKat кардинально изменились. Самым значительным изменением является добавление защиты загружаемого содержимого в WebView. Хотя большинство приложений, нацеленных на предыдущие версии API, должно работать ожидаемым образом, настоятельно рекомендуется протестировать приложения, использующие класс WebView. Дополнительные сведения о затронутых API WebView см. в документации Android о переходе на WebView в Android 4.4.

Взаимодействие с пользователем

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

Платформа перехода

Платформа перехода упрощает реализацию анимации. KitKat поддерживает простую анимацию свойств с помощью только одной строки кода, а также настройку переходов с помощью сцен.

Простая анимация свойств

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

using Android.Transitions;

public class MainActivity : Activity
{
    LinearLayout linear;
    Button button;
    TextView text;

    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
        SetContentView (Resource.Layout.Main);

        linear = FindViewById<LinearLayout> (Resource.Id.linearLayout);
        button = FindViewById<Button> (Resource.Id.button);
        text = FindViewById<TextView> (Resource.Id.textView);

        button.Click += (o, e) => {

            TransitionManager.BeginDelayedTransition (linear);

            if(text.Visibility != ViewStates.Visible)
            {
                text.Visibility = ViewStates.Visible;
            }
            else
            {
                text.Visibility = ViewStates.Invisible;
            }
        };
    }
}

В приведенном выше примере используется платформа перехода для создания автоматического перехода по умолчанию между изменяющимися значениями свойств. Так как анимация обрабатывается одной строкой кода, вы можете легко обеспечить совместимость с более старыми версиями Android, заключив вызов BeginDelayedTransition в оболочку с проверкой версии системы. Дополнительные сведения см. в разделе Миграция приложения в KitKat.

На следующем снимке экрана показано приложение до запуска анимации.

Снимок экрана приложения перед началом анимации

На следующем снимке экрана показано приложение после завершения анимации.

Снимок экрана приложения после выполнения анимации

Вы можете точнее управлять переходом с помощью сцен, которые рассматриваются в следующем разделе.

Сцены Android

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

Статический элемент пользовательского интерфейса, в котором размещается динамическое содержимое, называется контейнером или базой сцены. В приведенном ниже примере для создания RelativeLayout с именем container используется Android Designer.

Создание контейнера RelativeLayout с помощью Android Designer

В примере макета также определена кнопка sceneButton под container. Эта кнопка будет активировать переход.

Для динамического содержимого в контейнере требуются два новых макета Android. Эти макеты задают только код внутри контейнера. Приведенный ниже пример кода определяет макет Scene1, который содержит два текстовых поля, названные "Kit" и "Kat" соответственно, и второй макет, Scene2, который содержит те же текстовые поля, но названные наоборот. Код XML выглядит следующим образом.

Scene1.axml

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:id="@+id/textA"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Kit"
        android:textSize="35sp" />
    <TextView
        android:id="@+id/textB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/textA"
        android:text="Kat"
        android:textSize="35sp" />
</merge>

Scene2.axml

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:id="@+id/textB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Kat"
        android:textSize="35sp" />
    <TextView
        android:id="@+id/textA"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/textB"
        android:text="Kit"
        android:textSize="35sp" />
</merge>

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

Сцена создается путем вызова Scene.GetSceneForLayout и передачи объекта контейнера, идентификатора ресурса файла макета сцены и текущего Context, как показано в следующем примере кода.

RelativeLayout container = FindViewById<RelativeLayout> (Resource.Id.container);

Scene scene1 = Scene.GetSceneForLayout(container, Resource.Layout.Scene1, this);
Scene scene2 = Scene.GetSceneForLayout(container, Resource.Layout.Scene2, this);

scene1.Enter();

При нажатии кнопки две сцены меняются местами посредством анимации Android со значениями перехода по умолчанию.

sceneButton.Click += (o, e) => {
    Scene temp = scene2;
    scene2 = scene1;
    scene1 = temp;

    TransitionManager.Go (scene1);
};

На следующем снимке экрана показана сцена перед анимацией.

Снимок экрана приложения перед началом анимации

На следующем снимке экрана показана сцена после анимации.

Снимок экрана приложения после завершения анимации

Примечание.

В библиотеке переходов Android имеется известная ошибка, из-за которой сцены, созданные с помощью GetSceneForLayout, прерываются, когда пользователь переходит к действию во второй раз.

Пользовательские переходы в сценах

Пользовательский переход можно определить в файле ресурсов XML в каталоге transition в разделе Resources, как показано на снимке экрана ниже.

Расположение файла transition.xml в каталоге Resources/transition

В следующем примере кода определяется переход, который анимирует в течение 5 секунд. Дополнительные сведения об анимации см . на странице.

<changeBounds
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:duration="5000"
  android:interpolator="@android:anim/overshoot_interpolator" />

Этот переход создается в действии с помощью TransitionInflater, как показано в следующем коде.

Transition transition = TransitionInflater.From(this).InflateTransition(Resource.Transition.transition);

Затем новый переход добавляется в вызов Go, который начинает анимацию.

TransitionManager.Go (scene1, transition);

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

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

  • windowTranslucentStatus — если задано значение true, верхняя строка состояния становится полупрозрачной;

  • windowTranslucentNavigation — если задано значение true, нижняя строка состояния становится полупрозрачной;

  • fitsSystemWindows — при включении полупрозрачности для верхней или нижней строки состояния смещается содержимое под прозрачными элементами пользовательского интерфейса. Это происходит по умолчанию. Присвоение этому свойству значения true — это простой способ предотвратить перекрытие содержимого полупрозрачными элементами пользовательского интерфейса системы.

Следующий код определяет тему с полупрозрачными панелями состояния и навигации.

<?xml version="1.0" encoding="UTF-8" ?>
<resources>
    <style name="KitKatTheme" parent="android:Theme.Holo.Light">
        <item name="android:windowBackground">@color/xamgray</item>
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:fitsSystemWindows">true</item>
        <item name="android:actionBarStyle">@style/ActionBar.Solid.KitKat</item>
    </style>

    <style name="ActionBar.Solid.KitKat" parent="@android:style/Widget.Holo.Light.ActionBar.Solid">
        <item name="android:background">@color/xampurple</item>
    </style>
</resources>

На снимке экрана ниже показана тема с полупрозрачными панелями состояния и навигации.

Пример снимка экрана приложения с полупрозрачными панелями состояния и навигации

Содержимое пользователя

Платформа доступа к хранилищу

Платформа доступа к хранилищу (SAF) — это новый способ взаимодействия пользователей с сохраненным содержимым, таким как изображения, видео и документы. Вместо того, чтобы отображать для пользователей диалоговое окно, позволяющее выбрать приложение для обработки содержимого, KitKat открывает новый пользовательский интерфейс, дающий пользователям возможность обращаться к своим данным в одном объединенном расположении. После выбора содержимого пользователь вернется в приложение, которое запросило это содержимое, и работа приложения продолжится в нормальном режиме.

Для этого изменения требуются два действия на стороне разработчика: сначала приложения, требующие содержимое от поставщиков, должны быть обновлены с учетом нового способа запроса содержимого. Затем приложения, которые записывают данные в ContentProvider, необходимо изменить для использования новой платформы. Оба сценария зависят от нового DocumentsProvider API.

DocumentsProvider

В KitKat взаимодействия с ContentProviders абстрагированы посредством класса DocumentsProvider. Это означает, что SAF не важно, где физически расположены данные, пока они доступны через API DocumentsProvider. Локальные поставщики, облачные службы и внешние запоминающие устройства используют один и тот же интерфейс и обрабатываются одинаково, предоставляя пользователю и разработчику единое место для взаимодействия с содержимым пользователя.

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

Запрос содержимого от поставщика

Мы можем указать KitKat, что нужно выбрать содержимое с помощью пользовательского интерфейса SAF и намерения ActionOpenDocument. Это означает, что нужно подключиться ко всем поставщикам содержимого, доступным для устройства. В это намерение можно добавить фильтрацию, указав CategoryOpenable. Это означает, что будет возвращено только содержимое, которое можно открыть (т. е. доступное для использования). KitKat также позволяет фильтровать содержимое с помощью MimeType. Например, код, приведенный ниже, фильтрует результаты по MimeType изображения.

Intent intent = new Intent (Intent.ActionOpenDocument);
intent.AddCategory (Intent.CategoryOpenable);
intent.SetType ("image/*");
StartActivityForResult (intent, save_request_code);

Вызов StartActivityForResult запускает пользовательский интерфейс SAF, в котором пользователь может выбрать изображение.

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

После того как пользователь выбрал изображение, OnActivityResult возвращает Android.Net.Uri выбранного файла. В приведенном ниже примере кода отображается выбранное пользователем изображение.

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);

    if (resultCode == Result.Ok && data != null && requestCode == save_request_code) {
        imageView = FindViewById<ImageView> (Resource.Id.imageView);
        imageView.SetImageURI (data.Data);
    }
}

Запись содержимого в поставщик

Помимо загрузки содержимого из пользовательского интерфейса SAF, KitKat также позволяет сохранять содержимое в любой ContentProvider, который реализует API DocumentProvider. При сохранении содержимого используется Intent с ActionCreateDocument.

Intent intentCreate = new Intent (Intent.ActionCreateDocument);
intentCreate.AddCategory (Intent.CategoryOpenable);
intentCreate.SetType ("text/plain");
intentCreate.PutExtra (Intent.ExtraTitle, "NewDoc");
StartActivityForResult (intentCreate, write_request_code);

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

Снимок экрана: пользователь изменяет имя файла на NewDoc в каталоге Downloads

Когда пользователь нажимает кнопку Сохранить, OnActivityResult передает Android.Net.Uri созданного файла, доступ к которому можно получить с помощью data.Data. Универсальный код ресурса (URI) можно использовать для потоковой передачи данных в новый файл.

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);

    if (resultCode == Result.Ok && data != null && requestCode == write_request_code) {
        using (Stream stream = ContentResolver.OpenOutputStream(data.Data)) {
            Encoding u8 = Encoding.UTF8;
            string content = "Hello, world!";
            stream.Write (u8.GetBytes(content), 0, content.Length);
        }
    }
}

Обратите внимание на то, что ContentResolver.OpenOutputStream(Android.Net.Uri) возвращает значение System.IO.Stream, поэтому весь процесс потоковой передачи можно записать в .NET.

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

Печать

KitKat упрощает печать содержимого благодаря введению служб печати и PrintManager. KitKat также является первой версией API для полного использования API облачной печати Google с помощью приложений Google Cloud Print. Большинство устройств, поставляемых с KitKat, автоматически скачивает приложение Google Cloud Print и подключаемый модуль HP Print Service при первом подключении к сети Wi-Fi. Пользователь может проверка параметры печати своего устройства, перейдя к Параметры > системной > печати:

Пример снимка экрана параметров печати

Примечание.

Хотя интерфейсы API печати настроены для работы с Google Cloud Print по умолчанию, Android позволяет разработчикам подготавливать содержимое для печати с помощью новых интерфейсов API и передавать их в другие приложения для управления печатью.

Печать содержимого HTML

KitKat автоматически создает PrintDocumentAdapter для веб-представления с помощью WebView.CreatePrintDocumentAdapter. Печать веб-содержимого — это скоординированное взаимодействие WebViewClient, который ожидает загрузки содержимого HTML и сообщает о нем действию, чтобы параметр печати стал доступен в меню "Параметры", и действия, которое ожидает от пользователя выбора параметра "Печать" и вызывает Printдля PrintManager. В этом разделе описывается базовая настройка, необходимая для печати экранного содержимого HTML.

Обратите внимание на то, что для загрузки и печати веб-содержимого требуется разрешение на использование Интернета.

Настройка разрешения на использование Интернета в параметрах приложения

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

Пример снимка экрана пункта меню

Дополнительный пункты меню можно определить в каталоге menu в папке Resources. Приведенный ниже код определяет пример пункта меню Print.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_print"
        android:title="Print"
        android:showAsAction="never" />
</menu>

Взаимодействие с меню параметров в действии осуществляется с помощью методов OnCreateOptionsMenu и OnOptionsItemSelected. OnCreateOptionsMenu служит для добавления новых пунктов меню, таких как "Печать", из каталога Resources menu. OnOptionsItemSelected ожидает, пока пользователь не выберет пункт "Печать" в меню, после чего начинает печать.

bool dataLoaded;

public override bool OnCreateOptionsMenu (IMenu menu)
{
    base.OnCreateOptionsMenu (menu);
    if (dataLoaded) {
        MenuInflater.Inflate (Resource.Menu.print, menu);
    }
    return true;
}

public override bool OnOptionsItemSelected (IMenuItem item)
{
    if (item.ItemId == Resource.Id.menu_print) {
        PrintPage ();
        return true;
    }
    return base.OnOptionsItemSelected (item);
}

В приведенном выше коде также определена переменная dataLoaded, используемая для отслеживания состояния содержимого HTML. WebViewClient задаст для этой переменной значение true после загрузки всего содержимого, чтобы действие могло добавить пункт меню "Печать" в меню параметров.

WebViewClient

Задача WebViewClient — убедиться, что данные в WebView полностью загружены, прежде чем в меню появится параметр печати. Для этого используется метод OnPageFinished. OnPageFinished ожидает завершения загрузки веб-содержимого и указывает действию повторно создать меню параметров с использованием InvalidateOptionsMenu.

class MyWebViewClient : WebViewClient
{
    PrintHtmlActivity caller;

    public MyWebViewClient (PrintHtmlActivity caller)
    {
        this.caller = caller;
    }

    public override void OnPageFinished (WebView view, string url)
    {
        caller.dataLoaded = true;
        caller.InvalidateOptionsMenu ();
    }
}

OnPageFinished также задает для dataLoaded значение true, поэтому OnCreateOptionsMenu может повторно создать меню с параметром "Печать".

PrintManager

Приведенный ниже пример кода печатает содержимое WebView.

void PrintPage ()
{
    PrintManager printManager = (PrintManager)GetSystemService (Context.PrintService);
    PrintDocumentAdapter printDocumentAdapter = myWebView.CreatePrintDocumentAdapter ();
    printManager.Print ("MyWebPage", printDocumentAdapter, null);
}

Print принимает в качестве аргументов: имя задания печати (MyWebPage в этом примере) PrintDocumentAdapter создает документ печати из содержимого и PrintAttributes (null в приведенном выше примере). Можно указать PrintAttributes, чтобы разместить содержимое на печатной странице, хотя в большинстве случаев должны подойти атрибуты по умолчанию.

При вызове Print загружается пользовательский интерфейс печати, в котором перечислены параметры задания печати. Пользовательский интерфейс предоставляет пользователям возможность печати или сохранения содержимого HTML в формате PDF, как показано на снимках экрана ниже.

Снимок экрана PrintHtmlActivity с меню

Снимок экрана PrintHtmlActivity с меню

Оборудование

KitKat добавляет несколько API для новых функций устройства. Наиболее важными из них являются эмуляция банковской карты на телефоне и новый SensorManager.

Эмуляция банковской карты на телефоне в NFC

Эмуляция банковской карты на телефоне (HCE) позволяет приложениям выполнять функции NFC-карт или устройств чтения NFC-карт, не используя собственный защищенный элемент оператора связи. Перед настройкой HCE убедитесь, что эта функция доступна на устройстве с помощью PackageManager.HasSystemFeature.

bool hceSupport = PackageManager.HasSystemFeature(PackageManager.FeatureNfcHostCardEmulation);

Для работы HCE требуется, чтобы функция HCE и разрешение Nfc были зарегистрированы в файле AndroidManifest.xml приложения.

<uses-feature android:name="android.hardware.nfc.hce" />

Настройка разрешения NFC в параметрах приложения

Для работы HCE нужна возможность выполнения в фоновом режиме. Эта служба должна запускаться, когда пользователь выполняет NFC-транзакцию, даже если приложение, использующее HCE, не запущено. Это можно сделать, написав код HCE как объект Service. Служба HCE реализует интерфейс HostApduService, который реализует следующие методы.

  • ProcessCommandApdu — протокольный блок данных прикладного уровня (APDU), который передается между устройством чтения NFC и службой HCE. Этот метод принимает ADPU из устройства чтения и возвращает блок данных.

  • OnDeactivatedHostAdpuService деактивируется, когда служба HCE прекращает взаимодействие с устройством чтения NFC.

Служба HCE также должна быть зарегистрирована в манифесте приложения и декорирована соответствующими разрешениями, фильтром намерений и метаданными. Следующий код представляет собой пример HostApduService, зарегистрированного в манифесте Android с помощью атрибута Service. Дополнительные сведения об атрибутах см. в руководстве по Xamarin Манифест приложения.

[Service(Exported=true, Permission="android.permissions.BIND_NFC_SERVICE"),
    IntentFilter(new[] {"android.nfc.cardemulation.HOST_APDU_SERVICE"}),
    MetaData("android.nfc.cardemulation.host.apdu_service",
    Resource="@xml/hceservice")]

class HceService : HostApduService
{
    public override byte[] ProcessCommandApdu(byte[] apdu, Bundle extras)
    {
        ...
    }

    public override void OnDeactivated (DeactivationReason reason)
    {
        ...
    }
}

Приведенная выше служба предоставляет устройству чтения NFC способ взаимодействия с приложением, но устройство чтения NFC не может узнать, эмулирует ли эта служба NFC-карту, которую необходимо считать. Чтобы помочь устройству чтения NFC идентифицировать службу, можно назначить службе уникальный идентификатор приложения (AID). Мы указываем AID, а также другие метаданные о службе HCE, в XML-файле ресурсов, зарегистрированном с помощью атрибута MetaData (см. пример кода выше). В этом файле ресурсов указывается один или несколько фильтров AID. Это строки уникальных идентификаторов в шестнадцатеричном формате, которые соответствуют идентификаторам AID одного или нескольких устройств чтения NFC.

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/hce_service_description"
    android:requireDeviceUnlock="false"
    android:apduServiceBanner="@drawable/service_banner">
    <aid-group android:description="@string/aid_group_description"
                android:category="payment">
        <aid-filter android:name="1111111111111111"/>
        <aid-filter android:name="0123456789012345"/>
    </aid-group>
</host-apdu-service>

В дополнение к фильтрам AID XML-файл ресурсов содержит описание службы HCE для пользователя, в котором указывается группа AID (платежное приложение или другое), а в случае платежного приложения — баннер размером 260x96 точек, отображаемый для пользователя.

Конфигурация, описанная выше, содержит основные стандартные блоки для приложения, имитирующего NFC-карту. Для настройки NFC требуется выполнить еще нескольких действий, а затем провести тестирование. Дополнительные сведения об эмуляции банковской карты на телефоне см. на портале документации по Android. Чтобы получить дополнительные сведения об использовании NFC в Xamarin, ознакомьтесь с этими примерами.

Датчики

KitKat обеспечивает доступ к датчикам устройства посредством SensorManager. SensorManager позволяет операционной системе запланировать доставку данных датчиков в приложение в пакетах, увеличивая время работы аккумулятора.

KitKat также содержит два новых типа датчика для отслеживания действий пользователя. Они основаны на акселерометре и приведены ниже.

  • StepDetector — приложение получает уведомление и пробуждается, когда пользователь делает шаг, а детектор предоставляет значение времени выполнения шага.

  • StepCounter отслеживает количество шагов, сделанных пользователем с момента регистрации датчика до следующей перезагрузки устройства.

На следующем снимке экрана показан шагомер в действии.

Снимок экрана приложения SensorsActivity, отображающего шагомер

Можно создать SensorManager, вызвав GetSystemService(SensorService) и приведя результат как SensorManager. Чтобы использовать шагомер, вызовите GetDefaultSensor для SensorManager. Вы можете зарегистрировать датчик и ожидать передачи изменений количества шагов с помощью интерфейса ,ISensorEventListener интерфейс, как показано в примере кода ниже:

public class MainActivity : Activity, ISensorEventListener
{
    float count = 0;

    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
        SetContentView (Resource.Layout.Main);

        SensorManager senMgr = (SensorManager) GetSystemService (SensorService);
        Sensor counter = senMgr.GetDefaultSensor (SensorType.StepCounter);
        if (counter != null) {
            senMgr.RegisterListener(this, counter, SensorDelay.Normal);
        }
    }

    public void OnAccuracyChanged (Sensor sensor, SensorStatus accuracy)
    {
        Log.Info ("SensorManager", "Sensor accuracy changed");
    }

    public void OnSensorChanged (SensorEvent e)
    {
        count = e.Values [0];
    }
}

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

Помните, что значение числа шагов является накопительным во всех приложениях, в которых зарегистрирован датчик. Это означает, что даже если вы удалите и переустановите приложение, а затем инициализируете переменную count нулем (0) при его запуске, значением, которое передает датчик, останется общее число шагов, выполненных, пока датчик был зарегистрирован в вашем или другом приложении. Вы можете запретить приложению увеличивать значение шагомера, вызвав UnregisterListener для SensorManager, как показано в следующем коде.

protected override void OnPause()
{
    base.OnPause ();
    senMgr.UnregisterListener(this);
}

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

Примечание.

Хотя API для обнаружения и подсчета шагов входит в состав KitKat, не все телефоны оснащены датчиком. Вы можете проверить наличие датчика, выполнив PackageManager.HasSystemFeature(PackageManager.FeatureSensorStepCounter);, или убедиться, что GetDefaultSensor не возвращает значение null.

Средства для разработчиков

Запись экрана

KitKat включает в себя новые возможности записи экрана, чтобы разработчики могли записывать приложения в действии. Запись экрана доступна с помощью клиента Android Debug Bridge (ADB), который можно скачать в составе пакета SDK для Android.

Чтобы записать экран, подключите свое устройство, затем найдите установленный пакет SDK для Android, перейдите в каталог platform-tools и запустите клиент adb.

adb shell screenrecord /sdcard/screencast.mp4

Приведенная выше команда запишет 3-минутное видео со скоростью по умолчанию, равной 4 Мбит/с. Чтоб изменить продолжительность, добавьте флаг --time-limit. Чтобы изменить скорость, добавьте флаг --bit-rate. Приведенная ниже команда запишет минутное видео со скоростью 8 Мбит/с.

adb shell screenrecord --bit-rate 8000000 --time-limit 60 /sdcard/screencast.mp4

Видео можно найти на устройстве. Оно появится в коллекции после завершения записи.

Другие дополнения в KitKat

Помимо описанных выше изменений KitKat обеспечивает следующие возможности.

  • Полноэкранный режим. В KitKat введен новый иммерсивный режим для просмотра содержимого, запуска игр и других приложений, которые могут использовать преимущества полноэкранного режима.

  • Настройка уведомлений— получение дополнительных сведений о системных уведомлениях с помощью NotificationListenerService . Это позволяет по-разному представлять информацию в приложении.

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

  • Приостановка анимации — приостановка и возобновление анимаций, созданных с помощью КлассAnimator .

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

  • Улучшение звука — сделать треки громче с помощью LoudnessEnhancer , поиск пиковых и RMS аудиопотока с помощью Visualizer класс и получение сведений из метки времени звука для поддержки синхронизации аудио-видео.

  • Синхронизация ContentResolver с настраиваемым интервалом. KitKat дает возможность настроить время выполнения запроса на синхронизацию. Можно синхронизировать ContentResolver, используя настраиваемое время или интервал, вызвав ContentResolver.RequestSync и передав SyncRequest.

  • Различение контроллеров. KitKat контроллерам назначаются уникальные целочисленные идентификаторы, доступ к которым можно получить с помощью свойства ControllerNumber устройства. Это помогает различать игроков в игре.

  • Удаленный контроль . С несколькими изменениями на стороне оборудования и программного обеспечения KitKat позволяет превратить устройство, оснащенное датчиком IR в удаленный элемент управления с помощью ConsumerIrService, и взаимодействовать с периферийными устройствами с новыми RemoteController Api.

Дополнительные сведения об изменениях, описанных выше, см. в обзоре интерфейсов API Android 4.4 от Google.

Итоги

В этой статье представлены некоторые новые API, доступные в Android 4.4 (уровень API 19), и рекомендации по переносу приложения в KitKat. В ней рассмотрены изменения в интерфейсах API, влияющие на взаимодействие с пользователем, включая платформу перехода и новые параметры управления темами. Далее в ней рассматривается платформа доступа к хранилищу и класс DocumentsProvider, а также новые API печати. В ней описывается эмуляция NFC-карты на телефоне и работа с маломощными датчиками, включая два новых датчика для отслеживания действий пользователя. Наконец, в статье демонстрируется запись роликов приложений в реальном времени с помощью функции записи экрана, а также приводится подробный список изменений и дополнений в API KitKat.