共用方式為


KitKat 功能

Android 4.4 (KitKat) 為使用者和開發人員載入了一系列功能。 本指南強調這些功能的數個,並提供程式碼範例和實作詳細數據,以協助您充分利用 KitKat。

概觀

Android 4.4 (API 層級 19),也稱為 “KitKat”,於 2013 年底發行。 KitKat 提供各種新功能和改進功能,包括:

  • 用戶體驗 – 具有轉換架構、半透明狀態和導覽列的簡易動畫,以及全螢幕沉浸式模式有助於為用戶創造更好的體驗。

  • 用戶內容 – 使用記憶體存取架構簡化的使用者檔案管理;使用改良的列印 API,列印圖片、網站和其他內容會更容易。

  • 硬體 – 使用 NFC 主機型卡片模擬,將任何應用程式轉換成 NFC 卡;使用 SensorManager 執行低功率感測器。

  • 開發人員工具 – 使用 Android 偵錯網橋用戶端運作的螢幕廣播應用程式,可在 Android SDK 中取得。

本指南提供將現有 Xamarin.Android 應用程式移轉至 KitKat 的指引,以及適用於 Xamarin.Android 開發人員的 KitKat 概觀。

需求

若要使用 KitKat 開發 Xamarin.Android 應用程式,您需要 透過 Android SDK 管理員安裝 Xamarin.Android 4.11.0 或更高版本和 Android 4.4(API 層級 19),如下列螢幕快照所示:

在 Android SDK 管理員中選取 Android 4.4

將您的應用程式移轉至 KitKat

本節提供一些第一個響應專案,可協助將現有的應用程式轉換為Android 4.4。

檢查系統版本

如果應用程式必須與舊版 Android 相容,請務必將任何 KitKat 特定程式代碼包裝在系統版本檢查中,如下列程式代碼範例所示:

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

警示批處理

Android 會使用警示服務在指定的時間喚醒背景中的應用程式。 KitKat 藉由批處理警示來進一步保持電源。 這表示,除了完全喚醒每個應用程式之外,KitKat 偏好將註冊為在相同時間間隔內喚醒的數個應用程式分組,並同時喚醒它們。 若要告訴Android在指定的時間間隔內喚醒應用程式,請在上AlarmManager呼叫 SetWindow ,傳入最少和最長的時間,以毫秒為單位,可在應用程式喚醒前經過,以及在喚醒時執行的作業。 下列程式代碼提供一個應用程式範例,此應用程式必須在設定視窗的一個半小時到一小時之間喚醒:

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_STORAGEWRITE_EXTERNAL_STORAGE 許可權。 這兩種類型可以分類為:

注意

WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE表示許可權,因此您只需要設定一個許可權。

簡訊合併

KitKat 藉由匯總使用者所選取的一個預設應用程式中的所有 SMS 內容,簡化使用者的傳訊。 開發人員負責讓應用程式選取為預設傳訊應用程式,並在未選取應用程式時適當地在程式代碼和生活中運作。 如需將SMS應用程式轉換為 KitKat 的詳細資訊,請參閱 從Google取得適用於 KitKat 的 SMS 應用程式指南。

WebView Apps

WebView 在 KitKat 中得到了改造。 最大的變更是將內容載入的安全性新增至 WebView。 雖然大部分以舊版 API 為目標的應用程式應該如預期般運作,但強烈建議測試使用 WebView 類別的應用程式。 如需受影響 WebView API 的詳細資訊,請參閱 Android 4.4 檔中的 Android 遷移至 WebView。

使用者體驗

KitKat 隨附數個新的 API 來增強用戶體驗,包括處理屬性動畫的新轉換架構,以及適用於主題的半透明 UI 選項。 以下涵蓋這些變更。

轉換架構

轉換架構可讓動畫更容易實作。 KitKat 可讓您使用一行程式代碼來執行簡單的屬性動畫,或使用 Scenes 自定義轉換

Simple 屬性動畫

新的 Android Transitions 連結庫可簡化屬性動畫背後的程式代碼。 架構可讓您使用最少的程式代碼執行簡單的動畫。 例如,下列程式代碼範例使用 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;
            }
        };
    }
}

上述範例會使用轉換架構來建立變更屬性值之間的自動預設轉換。 由於動畫是由單行程式代碼處理,因此您可以在系統版本檢查中包裝 BeginDelayedTransition 呼叫,輕鬆地讓這個與舊版 Android 相容。 如需詳細資訊,請參閱將您的應用程式移轉至 KitKat 一節。

下列螢幕快照顯示動畫之前的應用程式:

動畫開始前的應用程式螢幕快照

下列螢幕快照顯示動畫之後的應用程式:

動畫完成之後的應用程式螢幕快照

您可以使用下一節所涵蓋的場景,取得轉換的更多控制權。

Android 場景

場景是在轉換架構中引進的,可讓開發人員更充分掌控動畫。 場景會在UI中建立動態區域:您可以為容器內的 XML 內容指定容器和數個版本或「場景」,而Android會執行其餘工作來以動畫顯示場景之間的轉換。 Android Scenes 可讓您在開發端使用最少的工作來建置複雜的動畫。

包含動態內容的靜態 UI 元素稱為 容器場景基底。 下列範例會使用 Android Designer 來建立 RelativeLayout 名為 container的 :

使用 Android 設計工具建立 RelativeLayout 容器

範例版面配置也會在 下方定義名為 sceneButtoncontainer按鈕。 此按鈕會觸發轉換。

容器內的動態內容需要兩個新的 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 Transitions 連結庫中有一個 已知的 Bug ,會導致使用者在第二次瀏覽活動時,使用 GetSceneForLayout 建立場景來中斷。

場景中的自定義轉換

自訂轉換可以在 目錄Resourcestransition xml 資源檔案中定義,如下列螢幕快照所示:

資源/轉換目錄下transition.xml檔案的位置

下列程式代碼範例會定義動畫 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);

半透明 UI

KitKat 可讓您更充分掌控使用選擇性的半透明狀態和導覽列來設定應用程式主題。 您可以在用來定義 Android 主題的相同 XML 檔案中變更系統 UI 元素的半透明。 KitKat 引進下列屬性:

  • windowTranslucentStatus - 設定為 true 時,讓頂端狀態列變透明。

  • windowTranslucentNavigation - 設定為 true 時,使底部導覽列變透明。

  • fitsSystemWindows - 根據預設,將頂端或下列設定為半透明 UI 元素下移位內容。 將此屬性 true 設定為 是防止內容與半透明系統 UI 元素重疊的簡單方式。

下列程式代碼會定義具有半透明狀態和導覽列的主題:

<?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>

下列螢幕快照顯示上方具有半透明狀態和導覽列的主題:

具有半透明狀態和導覽列之應用程式的範例螢幕快照

使用者內容

儲存體-Access Framework

儲存體 Access Framework (SAF) 是使用者與儲存內容互動的新方式,例如影像、影片和檔。 KitKat 會開啟新的 UI,讓用戶能夠在一個匯總位置存取其數據,而不是顯示對話方塊來選擇應用程式來處理內容。 選擇內容之後,使用者會返回要求內容的應用程式,而應用程式體驗會如常繼續。

這項變更需要開發人員端的兩個動作:首先,需要提供者內容的應用程式必須更新為要求內容的新方式。 其次,寫入數據至 ContentProvider 的應用程式必須經過修改,才能使用新的架構。 這兩個案例都取決於新的案例 DocumentsProvider Api。

DocumentsProvider

在 KitKat 中,與 ContentProviders 的互動會與 DocumentsProvider 類別抽象化。 這表示只要可透過 DocumentsProvider API 存取數據,SAF 就不在乎數據的實體位置。 本機提供者、雲端服務和外部儲存裝置全都使用相同的介面,並以相同方式處理,為使用者提供與使用者內容互動的一個位置。

本節說明如何使用 儲存體 Access Framework 載入和儲存內容。

向提供者要求內容

我們可以告訴 KitKat,我們想要使用 SAF UI 搭配 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 UI,然後使用者可以瀏覽以選擇影像:

使用 儲存體 Access Framework 瀏覽至影像的應用程式範例螢幕快照

在使用者選擇影像之後, OnActivityResultAndroid.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 UI 載入內容之外,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 UI,讓使用者變更檔名,然後選取目錄來存放新檔案:

用戶在下載目錄中將檔名變更為 NewDoc 的螢幕快照

當使用者按下 [儲存] 時, 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 撰寫。

如需使用 儲存體 Access Framework 載入、建立和編輯內容的詳細資訊,請參閱 儲存體 Access Framework 的 Android 檔。

列印

在 KitKat 中簡化列印內容,並引進 列印服務和PrintManager。 KitKat 也是第一個使用 Google Cloud Print 應用程式充分運用 Google 雲端列印服務 API 的 API版本。 大部分隨附 KitKat 的裝置會在第一次連線到WiFi時自動下載 Google Cloud Print 應用程式和 HP 印印服務外掛程式。 使用者可以瀏覽至 設定 [>系統>列印] 來檢查其裝置的 [列印] 設定:

[列印設定] 畫面的範例螢幕快照

注意

雖然列印 API 預設會設定為使用 Google Cloud Print,但 Android 仍可讓開發人員使用新的 API 準備列印內容,並將它傳送給其他應用程式來處理列印。

列印 HTML 內容

KitKat 會自動使用 建立 PrintDocumentAdapter 網頁檢視 WebView.CreatePrintDocumentAdapter的 。 列印 Web 內容是等候 HTML 內容載入之間的WebViewClient協調工作,並讓活動知道讓 [選項] 選單中的列印選項可供使用,而 [活動] 會等候使用者選取 [列印] 選項,並在 上PrintManager呼叫 Print。 本節涵蓋列印螢幕上 HTML 內容所需的基本設定。

請注意,載入和列印 Web 內容需要因特網許可權:

在應用程式選項中設定因特網許可權

列印選項通常會出現在 [活動 的選項] 功能表中。 選項功能表可讓使用者對活動執行動作。 它位於畫面右上角,如下所示:

螢幕右上角顯示的 [列印] 功能表項範例螢幕快照

您可以在 [資源] 底下的選單目錄中定義其他功能表項。 下列程式代碼會定義名為 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>

活動中的選項功能表會透過 OnCreateOptionsMenuOnOptionsItemSelected 方法進行互動。 OnCreateOptionsMenu是從功能表資源目錄新增功能表項的位置,例如 [列印] 選項。 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 會接聽 Web 內容以完成載入,並告知活動使用 重新建立其選項功能表 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” ), a PrintDocumentAdapter 從內容產生列印檔,以及 PrintAttributesnull 在上述範例中)。 您可以指定 PrintAttributes 來協助在列印頁面上配置內容,不過預設屬性應該處理大部分的案例。

呼叫 Print 會載入列印 UI,其中會列出列印作業的選項。 UI 可讓使用者選擇列印或儲存 HTML 內容至 PDF,如下列螢幕快照所示:

顯示 [列印] 功能表的 PrintHtmlActivity 螢幕快照

PrintHtmlActivity 的螢幕快照,其中顯示 [另存新檔 PDF] 功能表

硬體

KitKat 新增數個 API 以配合新的裝置功能。 其中最值得注意的是主機型卡片模擬和新的 SensorManager

NFC 中的主機型卡片模擬

主機型卡片模擬 (HCE) 可讓應用程式像NFC 卡或 NFC 卡片讀取器一樣運作,而不需要依賴電信業者的專屬安全元素。 設定 HCE 之前,請確定 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,並傳回回應中的數據單位。

  • OnDeactivated - HostAdpuService 當 HCE 服務不再與 NFC 讀取器通訊時,會停用 。

HCE 服務也必須向應用程式的指令清單註冊,並以適當的許可權、意圖篩選和元數據裝飾。 下列程式代碼是使用 Service 屬性向 Android 指令清單註冊的HostApduService範例(如需屬性的詳細資訊,請參閱 Xamarin 使用 Android 指令清單指南):

[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)。 我們會在向 屬性註冊 MetaData 的 xml 資源檔中,指定 AID 以及其他 HCE 服務的元數據(請參閱上述程式碼範例)。 此資源檔案會指定一或多個 AID 篩選器 - 符合一或多個 NFC 讀取器裝置之 AID 之十六進位格式的唯一識別符字串:

<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 dp 橫幅。

上述設定提供模擬NFC卡之應用程式的基本建置組塊。 NFC 本身需要更多步驟和進一步測試才能進行設定。 如需主機型卡片仿真的詳細資訊,請參閱 Android 檔入口網站。 如需搭配 Xamarin 使用 NFC 的詳細資訊,請參閱 Xamarin NFC 範例

感應器

KitKat 可讓您透過 SensorManager存取裝置的感測器。 SensorManager可讓 OS 排程以批次方式將感測器資訊傳遞至應用程式,以保留電池使用時間。

KitKat 也隨附兩種新的感測器類型,用於追蹤使用者的步驟。 這些是以加速計為基礎,包括:

  • StepDetector - 當使用者採取步驟時,應用程式會收到通知/喚醒,而偵測器會提供步驟發生的時間值。

  • StepCounter - 追蹤使用者自感測器註冊 到下一次裝置重新啟動之前所採取的步驟數目。

下列螢幕快照說明步驟計數器的運作方式:

顯示步驟計數器的 SensorsActivity 應用程式螢幕快照

您可以藉由呼叫 GetSystemService(SensorService) 並將結果SensorManager轉換成 來建立 SensorManager 。 若要使用步驟計數器,請在上SensorManager呼叫 GetDefaultSensor 。 您可以使用 的協助,註冊感測器並接聽步驟計數中的變更 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 ,步驟會繼續計算。

請記住, 步驟計數值是所有註冊感測器的應用程式累積的。 這表示即使您卸載並重新安裝應用程式,並在應用程式啟動時於 0 初始化 count 變數,感測器所報告的值仍會保留在感測器註冊時所採取的步驟總數,無論是您的應用程式或其他。 您可以藉由在 上SensorManager呼叫 UnregisterListener 來防止應用程式新增至步驟計數器,如下列程式代碼所示:

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

重新啟動裝置會將步驟計數重設為 0。 無論您使用感測器或裝置狀態的其他應用程式為何,您的應用程式都需要額外的程式代碼,以確保它報告應用程式的準確計數。

注意

雖然步驟偵測和計算隨附於 KitKat 的 API,但並非所有手機都配備感測器。 您可以執行 PackageManager.HasSystemFeature(PackageManager.FeatureSensorStepCounter);檢查感測器是否可用,或檢查以確保 傳回的值 GetDefaultSensor 不是 null

開發人員工具

屏幕錄製

KitKat 包含新的螢幕錄製功能,讓開發人員可以記錄應用程式運作情形。 屏幕錄製可透過 Android 偵錯網橋 (ADB) 用戶端取得,可下載為 Android SDK 的一部分。

若要錄製螢幕,請連線您的裝置;然後,找出 Android SDK 安裝,流覽至 平臺工具 目錄,然後執行 adb 用戶端:

adb shell screenrecord /sdcard/screencast.mp4

上述命令會在預設解析度為 4Mbps 時錄製預設 3 分鐘的視訊。 若要編輯長度,請新增 --time-limit 旗標。 若要變更解析度,請新增 --bit-rate 旗標。 下列命令會在 8Mbps 錄製長達一分鐘的視訊:

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

您可以在裝置上找到您的視訊 - 錄製完成時會出現在資源庫中。

其他 KitKat 新增專案

除了上述的變更之外,KitKat 還可讓您:

  • 使用全螢幕 - KitKat 引進了新的 沈浸式模式 ,可用於瀏覽內容、玩遊戲,以及執行其他可能受益於全螢幕體驗的應用程式。

  • 自訂通知 - 使用 取得系統通知的其他詳細數據 NotificationListenerService . 這可讓您以不同的方式在應用程式內呈現資訊。

  • 鏡像可繪製資源 - 可繪製的資源 有新的 autoMirrored 屬性,告知系統針對需要針對從左至右版面配置翻轉的映射建立鏡像版本。

  • 暫停動畫 - 使用 建立的暫停和繼續動畫 Animator 類別。

  • 讀取動態變更文字 - 表示以新文字動態更新為「實時區域」的UI部分 accessibilityLiveRegion 屬性,讓新的文字在輔助功能模式中自動讀取。

  • 增強音訊體驗 - 使用 更響亮的曲目 LoudnessEnhancer ,使用 尋找音訊數據流的 Peak 和 RMS Visualizer類別,並從音訊時間戳取得資訊,以協助進行音訊視訊同步處理。

  • 在自定義間隔 同步處理 ContentResolver - KitKat 會將一些變化新增至執行同步要求的時間。 ContentResolver藉由呼叫 ContentResolver.RequestSync 並傳入 ,以自訂時間或間隔同步SyncRequest處理 。

  • 區分控制器 - 在 KitKat 中,控制器會獲指派可透過裝置 ControllerNumber 屬性存取的唯一整數標識碼。 這可讓您更輕鬆地區分遊戲中的玩家。

  • 遠端控制 - 在硬體和軟體端進行一些變更時,KitKat 可讓您使用 ConsumerIrService將配備 IR 傳輸器的裝置轉換成遠端控制,並與新的周邊裝置互動 RemoteController Api。

如需上述 API 變更的詳細資訊,請參閱 Google Android 4.4 API 概 觀。

摘要

本文介紹 Android 4.4 中提供的一些新 API(API 層級 19),並涵蓋將應用程式轉換至 KitKat 時的最佳做法。 它概述影響用戶體驗的 API 變更,包括轉換架構和主題的新選項。 接下來,它引進了 儲存體-Access FrameworkDocumentsProvider 類別,以及新的列印 API。 它探索了 NFC 主機型卡片模擬 ,以及如何使用 低功率感測器,包括兩個新的感測器來追蹤使用者的步驟。 最後,它示範使用 螢幕錄製來擷取應用程式的即時示範,並提供 KitKat API 變更和新增的詳細清單。