1. 程式人生 > >RemoteInput.Builder 多視窗 Android7(N)開發者

RemoteInput.Builder 多視窗 Android7(N)開發者

公共建設者

RemoteInput.Builder(String resultKey)

RemoteInput物件建立構建器物件。

公共方法

RemoteInput.Builder addExtras(Bundle extras)

將其他元資料合併到此構建器中。

RemoteInput build()

合併已設定的所有選項並返回一個新RemoteInput 物件。

Bundle
getExtras()

獲取此Builder使用的元資料包。

RemoteInput.Builder setAllowDataType(String mimeType, boolean doAllow)

指定使用者是否可以提供任意值。

RemoteInput.Builder setAllowFreeFormInput(boolean allowFreeFormTextInput)

指定使用者是否可以提供任意文字值。

RemoteInput.Builder
setChoices(CharSequence[] choices)

指定使用者可用於滿足此輸入的選項。

RemoteInput.Builder setLabel(CharSequence label)

設定收集此輸入時要顯示給使用者的標籤。

 

 

 

1.通知欄

Android N 引入了一些新 API,允許應用釋出具有高度可見性和互動性的通知。

Android N 擴充套件了現有RemoteInput通知 API,以支援手持式裝置上的內聯回覆。 此功能允許使用者從通知欄快速進行回覆,無需訪問應用。

此外,Android N 還允許捆綁類似的通知並將它們顯示為一則通知。 為了實現此功能,Android N 使用現有的NotificationCompat.Builder.setGroup()方法。使用者可以從通知欄展開各通知,並分別對每則通知進行回覆和清除等操作。

最後,Android N 還添加了一些新 API,允許您在應用的自定義通知檢視中使用系統裝飾元素。 這些 API 可幫助確保通知檢視與標準模板的展示效果相一致。

本文重點介紹您在應用中使用新通知功能時應加以考慮的一些重要變更。

直接回復

利用 Android N 中的直接回復功能,使用者可以直接在通知介面內快速回復簡訊或更新任務列表。 在手持式裝置上,可通過通知中另外附加的按鈕進行內聯回覆操作。 當用戶通過鍵盤迴復時,系統會將文本回復附加到您為通知操作指定的 Intent,並將 Intent 傳送到手持式裝置應用。

 

\

 

圖 1.Android N 添加了Reply操作按鈕。

新增內聯回覆操作

要建立支援直接回復的通知操作:

建立一個可新增到通知操作的RemoteInput.Builder例項。 該類的建構函式接受系統用作文字輸入金鑰的字串。 之後,手持式裝置應用使用該金鑰檢索輸入的文字。

// Key for the string that's delivered in the action's intent.

    private static final String KEY_TEXT_REPLY = "key_text_reply";

    String replyLabel = getResources().getString(R.string.reply_label);

    RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
    
    .setLabel(replyLabel)

    .build();

 //使用addRemoteInput()向操作附加RemoteInput物件。

// Create the reply action and add the remote input.

    Notification.Action action =

    new Notification.Action.Builder(R.drawable.ic_reply_icon,

    getString(R.string.label), replyPendingIntent)

    .addRemoteInput(remoteInput)

    .build();

//對通知應用操作併發出通知。

// Build the notification and add the action.

Notification newMessageNotification =

new Notification.Builder(mContext)

.setSmallIcon(R.drawable.ic_message)

.setContentTitle(getString(R.string.title))

.setContentText(getString(R.string.content))

.addAction(action))

.build();

// Issue the notification.

NotificationManager notificationManager =

NotificationManager.from(mContext);

notificationManager.notify(notificationId, newMessageNotification);

在觸發通知操作時系統提示使用者輸入回覆。

 

\

 

圖 2.使用者從通知欄輸入文字。

從內聯回覆檢索使用者輸入

要從通知介面接收使用者輸入併發送到在回覆操作的 Intent 中宣告的 Activity:

通過傳遞通知操作的 Intent 作為輸入引數來呼叫getResultsFromIntent()。 該方法返回含有文本回復的Bundle。

Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);

使用產生的金鑰查詢捆綁包(提供給RemoteInput.Builder建構函式)。以下程式碼段說明了方法如何從捆綁包檢索輸入文字:

// Obtain the intent that started this activity by calling

// Activity.getIntent() and pass it into this method to

// get the associated string.

    private CharSequence getMessageText(Intent intent) {

    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);

    if (remoteInput != null) {

        return remoteInput.getCharSequence(KEY_TEXT_REPLY);

    }

    return null;

}

使用您為上一項通知提供的相同的通知 ID 來建立和釋出另一項通知。 進度指示器從通知介面消失,以告知使用者已回覆成功。 在處理這項新通知時,使用被傳遞到接收器onReceive()方法的上下文。

// Build a new notification, which informs the user that the system

// handled their interaction with the previous notification.

    Notification repliedNotification =

    new Notification.Builder(context)

    .setSmallIcon(R.drawable.ic_message)

    .setContentText(getString(R.string.replied))
    
    .build();

// Issue the new notification.
    
    NotificationManager notificationManager =

    NotificationManager.from(context);

    notificationManager.notify(notificationId, repliedNotification);

對於互動式應用(例如聊天),這可以用來在處理檢索到的文字時新增其他上下文。 例如,這些應用可以顯示多行聊天記錄。 當用戶通過RemoteInput回覆時,您可以使用setRemoteInputHistory()方法更新回覆歷史。

在應用收到遠端輸入後,必須更新或取消通知。 如果使用者使用直接回復來對遠端更新進行回覆,則不可取消通知。 否則,更新通知以顯示使用者的回覆。對於使用MessagingStyle的通知,您應該添加回復來作為最新訊息。 當使用其它模板時,您可以將使用者的回覆追加到遠端輸入歷史。

捆綁通知

Android N 為開發者提供了表示通知佇列的新方法:捆綁通知。這類似於 Android Wear 中的通知堆疊功能。 例如,如果應用為接收的訊息建立通知,那麼在接收到多個訊息時,應用會將通知捆綁在一起成為一個群組。 您可以使用現有的Builder.setGroup()方法捆綁類似的通知。

通知組對組內的通知施加層次結構。 層次結構的頂層是父級通知,其顯示該群組的摘要資訊。 使用者可以逐步展開通知組,隨著使用者深入展開,系統將顯示更多資訊。 當用戶展開捆綁包時,系統將顯示其所有子通知的更多資訊;當用戶展開其中一則通知時,系統顯示該通知的所有內容。

 

\

 

圖 3.使用者可以逐步展開通知組。

注:如果同一應用傳送了四條或以上通知,並且未指定分組,系統會自動將它們分到一組。

如需瞭解如何將通知新增到組,請參閱將各通知新增到組。

捆綁通知最佳做法

本節提供了有關何時使用通知組而非早期版本 Android 平臺中的InboxStyle通知的指南。

何時使用捆綁通知

只有在您的用例滿足以下所有條件時才應使用通知組:

子通知為完整通知,且可以單獨顯示,無需群組摘要。

單獨顯示子通知更合理。例如:

子通知可操作,且每個子通知均有特定的操作。

子通知中包含使用者想要檢視的更多資訊。

好的通知組用例示例包括:顯示傳入訊息列表的簡訊應用,或顯示收到的電子郵件列表的電子郵件應用。

適合顯示單一通知的用例示例包括:從某一個人收到的單獨訊息,或以列表表示的單行文字專案。 您可以使用InboxStyle或BigTextStyle實現此功能。

顯示捆綁通知

即使組內僅含有一則子通知,應用也應釋出組摘要。 如果只含有一則通知,系統將取消摘要並直接顯示子通知。 這樣可確保使用者在滑動切換組內的子通知時,系統仍可以提供一致的使用者體驗。

注:本版本 Android N 目前還無法在僅含一則子通知時取消通知組的摘要。 我們將在之後版本的 Android N 中新增此功能。

掃視通知

雖然系統通常以群組的方式顯示子通知,但您可以進行設定,使其暫時作為浮動通知顯示。 該功能非常實用,因為其允許使用者立即訪問最近的子通知以及與其相關的操作。

後向相容性

自 Android 5.0(API 級別 21)起,NotificationAPI 中就添加了通知組和遠端輸入,以支援 Android Wear 裝置。 如果您已經使用這些 API 構建通知,則只需驗證應用行為是否符合上述指南,並考慮實現setRemoteInputHistory()。

為了支援後向相容性,支援庫的NotificationCompat類中提供了相同的 API,以便您構建可在早期 Android 版本中執行的通知。 在手持式裝置和平板電腦上,使用者只能看到摘要通知,因此應用應仍提供收件箱式或類似形式的通知顯示模式,以顯示群組的全部資訊內容。 鑑於 Android Wear 裝置允許使用者檢視所有子通知,包括更早級別平臺上的通知,您應在不依賴 API 級別的基礎上構建子通知。

自定義檢視

從 Android N 開始,您將可以自定義通知檢視,同時仍可以使用系統裝飾元素,例如通知標頭、操作和可展開的佈局。

為啟用該功能,Android N 添加了以下 API,以便您樣式化自己的自定義檢視:

DecoratedCustomViewStyle()

樣式化除媒體通知外的其他通知。

DecoratedMediaCustomViewStyle()

樣式化媒體通知。

如需使用這些新 API,可呼叫setStyle()方法,並向其傳遞所需的自定義檢視樣式。

此程式碼段顯示瞭如何使用DecoratedCustomViewStyle()方法構建自定義通知物件。

Notification notification = new Notification.Builder()

.setSmallIcon(R.drawable.ic_stat_player)

.setLargeIcon(albumArtBitmap))

.setCustomContentView(contentView);

.setStyle(new Notification.DecoratedCustomViewStyle())

.build();

訊息傳遞樣式

Android N 引入了一項新的 API 來自定義通知樣式。 使用MessageStyle類,您可以更改在通知中顯示的多個標籤,包括會話標題、其他訊息和通知的內容檢視。

以下程式碼段演示瞭如何使用MessageStyle類來自定義通知樣式。

Notification notification = new Notification.Builder()

.setStyle(new Notification.MessagingStyle("Me")

.setConversationTitle("Team lunch")

.addMessage("Hi", timestamp1, null) // Pass in null for user.

.addMessage("What's up?", timestamp2, "Coworker")

.addMessage("Not much", timestamp3, null)

.addMessage("How about lunch?", timestamp4, "Coworker"));

3.Data Saver

在智慧手機的整個生命週期,蜂窩資料計劃的成本通常會超出裝置本身的成本。 在 N Developer Preview 中,使用者可以在整個裝置上啟用 Data Saver,以減少流量消耗,無論是在漫遊,賬單週期即將結束,還是使用少量的預付費資料包。

當用戶在Settings中啟用 Data Saver 且裝置位於按流量計費的網路上時,系統遮蔽後臺流量消耗,同時指示應用在前臺儘可能使用較少的資料。 使用者可以將特定應用加入白名單以允許後臺按流量計費的流量消耗,即使在開啟 Data Saver 時也是如此。

N Developer Preview 擴充套件ConnectivityManagerAPI,為應用提供檢索使用者的 Data Saver 首選項和監控首選項變更的方式。 這被認為是應用檢查使用者是否啟用了 Data Saver 並努力限制前臺和後臺流量消耗的有效方法。

檢查 Data Saver 首選項

在 N Developer Preview 中,應用可以使用ConnectivityManagerAPI 來確定正在應用的是哪些流量消耗限制。getRestrictBackgroundStatus()方法返回下列值之一:

RESTRICT_BACKGROUND_STATUS_DISABLED

Data Saver 已禁用。

RESTRICT_BACKGROUND_STATUS_ENABLED

使用者已為此應用禁用 Data Saver。應用應努力限制前臺流量消耗,並妥善處理後臺流量消耗限制。

RESTRICT_BACKGROUND_STATUS_WHITELISTED

使用者已啟用 Data Saver,但應用在白名單中。應用應努力限制前臺和後臺流量消耗。

這被認為是在裝置連線到按流量計費的網路時限制流量消耗的有效方法,即使 Data Saver 被禁用或應用在白名單中。 以下示例程式碼使用

請求白名單許可權

ConnectivityManager.isActiveNetworkMetered()和ConnectivityManager.getRestrictBackgroundStatus()來確定應用應使用多少資料:

ConnectivityManager connMgr = (ConnectivityManager)

getSystemService(Context.CONNECTIVITY_SERVICE);

// Checks if the device is on a metered network

    if (connMgr.isActiveNetworkMetered()) {

// Checks user’s Data Saver settings.

    switch (connMgr.getRestrictBackgroundStatus()) {

            case RESTRICT_BACKGROUND_STATUS_ENABLED:

// Background data usage is blocked for this app. Wherever possible,

// the app should also use less data in the foreground.

            case RESTRICT_BACKGROUND_STATUS_WHITELISTED:

// The app is whitelisted. Wherever possible,

// the app should use less data in the foreground and background.

            case RESTRICT_BACKGROUND_STATUS_DISABLED:

// Data Saver is disabled. Since the device is connected to a

// metered network, the app should use less data wherever possible.

        }
    
        } else {

// The device is not on a metered network.

// Use data as required to perform syncs, downloads, and updates.

        }

如果您的應用需要使用後臺資料,它可以通過傳送一項包含您的應用軟體包名稱的 URI 的Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGSIntent 來請求白名單許可權:例如package:MY_APP_ID。

傳送 Intent 和 URI 將啟動Settings應用,還會顯示您的應用的流量消耗設定。 使用者隨後可以決定是否啟用應用的後臺資料。 在您傳送此 Intent 之前,先詢問使用者是否希望啟用Settings應用,以啟用後臺流量消耗,這是一種有效的做法。

監控 Data Saver 首選項變更

應用可以通過建立一條BroadcastReceiver以偵聽ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED以及使用Context.registerReceiver()動態註冊接收器來監控 Data Saver 首選項變更。 當應用接收到這條廣播時,應通過呼叫ConnectivityManager.getRestrictBackgroundStatus()來檢查新的 Data Saver 首選項是否會影響其許可權。

注:系統只會向使用Context.registerReceiver()進行動態註冊的應用傳送此廣播。 在其清單中註冊接收此廣播的應用將不會收到它們。

使用 Android 除錯橋命令測試

Android 除錯橋 (ADB)提供了多條命令,可用於檢查和配置網路許可權:

從白名單中移除指定軟體包 UID,以阻止當 Data Saver 啟用時後臺按流量計費的流量消耗。

4.TV

TV 輸入服務允許使用者通過時移 API 暫停和繼續頻道播放。 Android N 通過允許使用者儲存多個錄製的會話,擴充套件了時移。

使用者可以提前安排錄製,或在觀看節目時開始錄製。 系統保存錄制後,使用者即可使用系統 TV 應用瀏覽、管理和播放錄製。

如果想要為 TV 輸入服務提供錄製功能,您必須指示系統您的應用支援錄製,實現錄製節目功能,處理和傳達錄製期間發生的所有錯誤,並管理錄製的會話。

注:Live Channels 應用尚不提供可讓使用者建立或訪問錄製的方式。 在變更 Live Channels 應用之前,可能無法充分測試您的 TV 輸入服務的錄製體驗。

指示支援錄製

為了通知系統您的 TV 輸入服務支援錄製,請將您的服務元資料 XML 檔案中的android:canRecord屬性設定為true:

如需瞭解有關服務元資料檔案的詳細資訊,請參閱在清單中宣告您的 TV 輸入。

或者,您可以使用以下步驟在您的程式碼中表明錄製支援:

在TvInputService.onCreate()方法中,使用TvInputInfo.Builder類建立一個新的TvInputInfo物件。

建立新的TvInputInfo物件時,在呼叫build()之前先呼叫setCanRecord(true),以表明您的服務支援錄製。

通過呼叫TvInputManager.updateTvInputInfo()在系統中註冊TvInputInfo物件。

錄製會話

TV 輸入服務註冊其支援錄製功能後,系統會在需要訪問應用的錄製實現時呼叫TvInputService.onCreateRecordingSession()。 實現您自己的TvInputService.RecordingSession子類並在觸發onCreateRecordingSession()回撥後返回它。 此子類負責切換到正確的頻道資料,錄製請求的資料,以及向系統傳達錄製狀態和錯誤。

系統呼叫在頻道 URI 中傳遞的RecordingSession.onTune()時,將調到該 URI 指定的頻道。 通過呼叫notifyTuned()通知系統應用已調到所需的頻道,或者,如果應用無法調到正確的頻道,請呼叫notifyError()。

系統接下來呼叫RecordingSession.onStartRecording()回撥。您的應用必須立即開始錄製。系統呼叫此回撥時,它可能會提供一個 URI,其中包含有關將錄製的節目的資訊。 完成錄製後,您需要將此資料複製到RecordedPrograms資料表。

最後,系統呼叫RecordingSession.onStopRecording()。此時,您的應用必須立即停止錄製。 您還需要在RecordedPrograms表中建立一個條目。 此條目應在RecordedPrograms.COLUMN_RECORDING_DATA_URI列中包含錄製的會話資料 URI,以及在初始呼叫onStartRecording()時系統提供的任何節目資訊。

如需瞭解有關如何訪問RecordedPrograms表的更多詳情,請參閱管理錄製的會話。

處理錄製錯誤

如果錄製期間發生錯誤,使錄製的資料無法使用,則通過呼叫RecordingSession.notifyError()通知系統。同樣,您可以在建立錄製會話後呼叫notifyError(),以通知系統您的應用不再錄製會話。

如果錄製期間發生錯誤,但您想提供可使用的部分錄制供使用者播放,則呼叫RecordingSession.notifyRecordingStopped()以使系統可以使用部分會話。

管理錄製的會話

系統在TvContract.RecordedPrograms內容提供程式表中維護來自所有支援錄製的頻道應用的所有已錄製會話的資訊。 此資訊可通過RecordedPrograms.Uri內容 URI 訪問。使用內容提供程式 API 讀取、新增和刪除此表中的條目。

如需瞭解有關使用內容提供程式資料的詳細資訊,請參閱內容提供程式基本知識。

最佳做法

TV 裝置的儲存可能有限,因此請運用您的最佳判斷來分配儲存,以保存錄制的會話。 如果沒有足夠的空間儲存錄製的會話,請使用RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)。

當用戶發起錄製時,您應儘快開始錄製資料。 為便於執行此操作,請在系統呼叫onCreateRecordingSession()回撥時完成前期的所有耗時任務,如訪問和分配儲存空間。 這樣做讓您能夠在觸發onStartRecording()回撥時立即開始錄製。

5.密匙Key Attestation

金鑰認證會給你更多的信心,你在使用你的應用程式 的金鑰儲存在裝置的硬體支援的金鑰庫。下面的部分 描述如何驗證效能的硬體支援的金鑰和如何 解釋認證證書的擴充套件資料模式。

檢索和驗證金鑰對硬體支援

在金鑰認證,你指定一個金鑰對的別名。在返回的認證 工具,提供了一個證書鏈,您可以使用它來驗證 ,金鑰對的性質。

在這個鏈的根證書籤名使用的認證金鑰, 該裝置製造商注入裝置的硬體支援 金鑰儲存在。

筆記在裝置與Android和谷歌播放 服務船,根證書是由谷歌發行。你應該確認 在谷歌的根證書列表出現這個根證書。

實施重點認證,完成以下步驟:

使用金鑰庫物件的getcertificatechain()得到一個參考的X.509證書與金鑰相關的 硬體支援外鏈的方法。

通過檢查每個證書的有效性CRL物件的isrevoked()方法

警告:雖然你可以在你的應用程式 直接完成這個過程,它的安全檢查證書吊銷列表 單獨的伺服器上,你的信任。

建立一個認證物件,通過在 證書鏈作為引數的第一個元素:

/“證書”包含一個特定的證書關聯的金鑰鏈

/ /對在裝置的硬體支援的金鑰庫。

attestationcert X509Certificate= (X509Certificate)證書【零]

認證hardwarekeyattestation= 新 認證(attestationcert)

認證物件提取擴充套件資料在這個證書 將這些資訊儲存在一個更方便的格式。更多的細節 擴充套件的資料模式,看證書擴充套件資料模式。

在使用訪問器方法認證類 從證書檢索擴充套件資料。這些方法使用相同的名稱和結構層次 在證書擴充套件資料 圖式。

例如,檢視裝置的TEE驗證啟動鍵,使用以下方法 序列:

/“hardwarekeyattestation”包含了認證的第一要素

/ /證書鏈。

authorizationlistteeauthlist=hardwarekeyattestation。getteeenforced()

rootoftrustteerootoftrust=teeauthlist。getrootoftrust()

位元組[ ]teeverifiedbootkey=teerootoftrust。getverifiedbootkey()

從擴充套件資料比較認證與 設定的值,您期望的硬體支援的金鑰包含物件。

警告:雖然你可以在你的應用程式 直接完成這個過程,它的安全檢查在一個單獨的伺服器,你信任證書的擴充套件資料 。

證書擴充套件資料模式

金鑰認證驗證擴充套件資料顯示在第一 證書在裝置的硬體支援的金鑰庫內的鏈。的 證書儲存的資訊根據ASN。1模式:

    KeyDescription ::= SEQUENCE {
    attestationVersion INTEGER,
    attestationSecurityLevel SecurityLevel,
    keymasterVersion INTEGER,
    keymasterSecurityLevel SecurityLevel,
    attestationChallenge OCTET_STRING,

保留octet_string,
    softwareEnforced AuthorizationList,
    teeEnforced AuthorizationList,
}
    SecurityLevel ::= ENUMERATED {
    Software (0),
    TrustedEnvironment (1),
}

    AuthorizationList ::= SEQUENCE {
    purpose [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm [2] EXPLICIT INTEGER OPTIONAL,
        keySize [3] EXPLICIT INTEGER OPTIONAL,
    digest [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired [503] EXPLICIT NULL OPTIONAL,
    userAuthType [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody [506] EXPLICIT NULL OPTIONAL,
    allApplications [600] EXPLICIT NULL OPTIONAL,
    applicationId [601] EXPLICIT OCTET_STRING OPTIONAL,
    creationDateTime [701] EXPLICIT INTEGER OPTIONAL,
    origin [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel [706] EXPLICIT INTEGER OPTIONAL,
    attestationChallenge [708] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL,
}

    RootOfTrust ::= SEQUENCE {
    verifiedBootKey OCTET_STRING,
    deviceLocked BOOLEAN,
    verifiedBootState VerifiedBootState,

}

    VerifiedBootState ::= ENUMERATED {
    Verified (0),
    SelfSigned (1),
    Unverified (2),
    Failed (3),

}

下面的列表給出了各元素在圖式:

keydescription

這個序列的值提供了金鑰對被 通過金鑰認證驗證的一般資訊和提供容易獲得額外的 細節。

attestationversion

金鑰的認證功能的版本。應設定為1。

attestationsecurity

這個安全 水平該認證。

筆記雖然它可能證明是 金鑰儲存在Android系統,如果attestationsecurity值設定為軟體你 不能信任這些證明如果Android系統成為損害。

keymasterversion

大師的硬體抽象層(HAL)版本。使用0 代表0.2版或0.3版,1代表1,2代表 版本2。

keymastersecurity

這個安全 水平實施的大師。

attestationchallenge

一個金鑰對,利用關鍵 認證驗證有關的挑戰字串。

保留

只有系統的應用程式使用該值。在所有其他應用程式,這個值是空的。

softwareenforced

可選的。keymaster the授權 列表這是由Android系統的執行,不是由裝置的通。

teeenforced

可選的。keymaster the授權 列表這是由裝置的TEE執行。

安全級別

這個資料結構在多大程度上反映了軟體的功能,如 金鑰對,是基於它的位置在保護裝置。

因為資料結構是一個列舉,它具有完全相同的一個 以下值:

軟體

建立和管理功能是在 Android系統實現邏輯。用於建立和儲存金鑰對的目的,這 位置比發球不太安全但比你的應用程式的 程序空間更安全。

trustedenvironment

邏輯用於建立和管理的特點是實施安全 硬體,如T恤。用於建立和儲存金鑰的目的, 這個位置更安全,因為安全的硬體抗 遠端高度。

authorizationlist

這個資料結構包含金鑰對的性質本身,在大師的硬體抽象層(HAL)的定義 。你比較這些值 到裝置的當前狀態或一組預期值進行驗證,使用你的應用程式的一 金鑰仍然有效。

每個域名對應一個類似命名的大師標籤。例如,金鑰大小在授權列表欄位對應的km_tag_key_size大師的標籤。

在下面的列表中的每個欄位是可選的:

目的

對應於km_tag_purpose大師的標籤,它使用1個標籤ID值。

演算法

對應於km_tag_algorithm大師的標籤,它使用的 2標籤的ID值。

當一個authorizationlist物件是關鍵 認證有關,該值始終是km_algorithm_rsa或_公里_ EC演算法。

金鑰大小

對應於km_tag_key_size大師的標籤,它使用3個標籤ID值。

消化

對應於一天_公里_文摘大師的標籤,它使用5個標籤ID值。

襯墊

對應於km_tag_padding大師的標籤,它使用6個標籤ID值。

eccurve

對應於_公里_ EC標記_曲線大師的標籤,它使用一個10 標籤ID值。

用於生成橢圓曲線的引數集(EC)的金鑰對, 採用ECDSA簽名與驗證,在Android系統 。

rsapublicexponent

對應於_ _公里_ RSA公共_指數標籤大師的標籤,它使用一個標籤ID 值200。

activedatetime

對應於_ Active DateTime _公里_標籤大師的標籤,它使用一個標籤ID值 400。

originationexpiredatetime

對應於一天_公里_起源_ datetime _ expire大師的標籤,它使用一個 標籤ID值為401。

usageexpiredatetime

對應於km_tag_usage_expire_datetime大師的標籤,它使用一個標籤ID 值402。

noauthrequired

對應於公里_標籤_沒有_ auth _ required大師的標籤,它使用一個標籤ID 值503。

當一個authorizationlist物件是關鍵 認證有關,該值始終是真實的。

userauthtype

對應於_標籤使用_ auth公里_ _型別大師的標籤,它使用一個標籤ID值 504。

authtimeout

對應於公里_標籤_ auth _暫停。大師的標籤,它使用的 505標籤的ID值。

allowwhileonbody

對應於km_tag_allow_while_on_body大師的標籤, 使用價值的標籤ID。

允許使用的身份驗證超時時間,如果 使用者還穿著他們身上的裝置後的關鍵。注意安全 身體上的感測器確定裝置是否被佩戴在使用者的 體。

當一個authorizationlist物件是關鍵 認證有關,該值始終是真實的。

所有應用

對應於_標籤應用全_ _公里大師的標籤, 使用價值的標籤ID。

指示是否在裝置上的所有應用程式都可以訪問金鑰對。

當一個authorizationlist物件是關鍵 認證有關,該值始終是真實的。

applicationid

對應於km_tag_application_id大師的標籤,它使用一個標籤ID值 601。

creationdatetime

對應於一天_公里_ _創作的DateTime大師的標籤,它使用一個標籤ID 值701。

起源

對應於km_tag_origin大師的標籤,它使用702個標籤ID值。

當一個authorizationlist物件是關鍵 認證有關,這個值通常設定為km_origin_generated。如果認證使用大師 版本0.2或0.3,然而,起源可設定為km_origin_unknown相反。

rollbackresistant

對應於km_tag_rollback_resistant大師的標籤,它使用一個標籤ID 值703。

rootoftrust

對應於km_tag_root_of_trust大師的標籤,它使用一個標籤ID值 704。

更多詳情,請參見描述rootoftrust資料結構。

osversion

對應於我們把_公里_ _版本大師的標籤,這 使用705標籤ID值。

與 大師相關的Android作業系統的版本,指定為一六位整數。例如,版本6.0.1 表示為060001。

只有大師1或更高版本包含此值在 授權清單。

ospatchlevel

對應於km_tag_patchlevel大師的標籤,這 使用706標籤ID值。

與安全補丁,在大師用 相關的年份和月份,指定為一六位整數。例如,六月的 2016補丁是表示為201606。

只有大師1或更高版本包含此值在 授權清單。

attestationchallenge

對應於km_tag_attestation_challenge大師 標籤,它使用一個708標籤的ID值。

那是在 大師定義的金鑰相關的挑戰字串。

attestationapplicationid

對應於km_tag_attestation_application_id大師的標籤,它使用709個標籤ID值。

那個簽名金鑰對 是在大師認證證書的唯一ID。

rootoftrust

這個值的集合定義了裝置的狀態資訊。

需要的是下面列表中的每個欄位:

verifiedbootkey

一個安全的關鍵,驗證了系統的影象雜湊。建議 你使用SHA-256演算法對這個雜湊。

devicelocked

如果裝置的Bootloader鎖定真實,使驗證啟動 檢查和防止符號裝置的影象被閃到 裝置。有關此功能的更多資訊,參見驗證 啟動文件

verifiedbootstate

這個引導 狀態該裝置根據驗證啟動特徵。

osversion

裝置上的Android作業系統的新版本, 指定為一六位數。例如,版本6.0.1表示 060001。

patchmonthyear

與安全補丁,目前 裝置上安裝相關的年份和月份,指定為一六位整數。例如,六月的 2016補丁是表示為201606。

verifiedbootstate

這個資料結構提供了裝置當前的啟動狀態,這 代表提供給使用者和應用程式的 裝置啟動完後保護水平。有關此功能的更多資訊,參見開機狀態在驗證啟動檔案部分。

這是資料結構中的列舉,因此需要準確的 以下值之一:

表明該裝置已驗證失敗。認證 證書不應使用該值為verifiedbootstate。

6.網路安全配置

Android N 包含一個網路安全配置特性,讓應用可以在一個安全的宣告性配置檔案中自定義其網路安全設定,而無需修改應用程式碼。 可以針對特定域和特定應用配置這些設定。 該特性的主要功能如下所示:

自定義信任錨:針對應用的安全連線自定義哪些證書頒發機構 (CA) 值得信賴。 例如,信任特定的自簽署證書或限制應用信任的公共 CA 集。

僅除錯重寫:在應用中以安全方式除錯安全連線,而不會增加安裝基數的風險。

Cleartext traffic 選擇退出:防止應用意外使用 cleartext traffic。

證書固定:將應用的安全連線限制為特定的證書。

新增安全配置檔案

網路安全配置特性使用一個 XML 檔案,您可以在該檔案中指定應用的設定。 您必須在應用的清單中包含一個條目來指向該檔案。 以下程式碼摘自一份清單,演示瞭如何建立此條目:

...

自定義信任的 CA

應用可能需要信任自定義的 CA 集,而不是平臺預設值。 出現此情況的最常見原因包括:

連線到具有自定義證書頒發機構(自簽署、由公司內部 CA 簽發等)的主機。

將 CA 集僅限於您信任的 CA,而不是每個預裝 CA。

信任系統中未包含的附加 CA。

預設情況下,來自所有應用的安全(例如 TLS、HTTPS)連線均信任預裝的系統 CA,而面向 API 級別 23 (Android M) 及更低級別的應用預設情況下還會信任使用者新增的 CA 儲存。 應用可以使用base-config(針對應用範圍的定製)或domain-config(針對每個域的定製)自定義自己的連線。

配置自定義 CA

假設您要連線到使用自簽署 SSL 證書的主機,或者連線到其 SSL 證書是由您信任的非公共 CA(如公司內部 CA)簽發的主機。

res/xml/network_security_config.xml:

example.com

以 PEM 或 DER 格式將自簽署或非公共 CA 證書新增到res/raw/my_ca。

限制信任的 CA 集

如果應用不想信任系統信任的所有 CA,則可以自行指定,縮減要信任的 CA 集。 這樣可防止應用信任任何其他 CA 簽發的欺詐性證書。

限制信任的 CA 集的配置與針對特定域信任自定義 CA相似,不同的是,前者要在資源中提供多個 CA。

res/xml/network_security_config.xml:

secure.example.com

cdn.example.com

以 PEM 或 DER 格式將信任的 CA 新增到res/raw/trusted_roots。 請注意,如果使用 PEM 格式,檔案必須僅包含 PEM 資料,且沒有額外的文字。您還可以提供多個元素,而不是隻能提供一個元素。

信任附加 CA

應用可能需要信任系統不信任的附加 CA,出現此情況的原因可能是系統還未包含此 CA,或 CA 不符合新增到 Android 系統中的要求。 應用可以通過為一個配置指定多個證書源來實現此目的。

res/xml/network_security_config.xml:

配置用於除錯的 CA

除錯通過 HTTPS 連線的應用時,您可能需要連線到沒有用於生產伺服器的 SSL 證書的本地開發伺服器。 為了支援此操作,而又不對應用的程式碼進行任何修改,您可以通過使用debug-overrides指定僅在android:debuggable為true時才信任的僅除錯 CA。通常,IDE 和構建工具會自動為非釋出版本設定此標誌。

這比一般的條件程式碼更安全,因為出於安全考慮,應用儲存不接受被標記為可除錯的應用。

res/xml/network_security_config.xml:

選擇退出 Cleartext Traffic

旨在連線到僅使用安全連線的目標的應用可以選擇不再對這些目標提供 cleartext(使用解密的 HTTP 協議而非 HTTPS)支援。 此選項有助於防止應用因外部源(如後端伺服器)提供的 URL 發生變化而意外迴歸。 請參閱NetworkSecurityPolicy.isCleartextTrafficPermitted()瞭解更多詳情。

例如,應用可能需要確保所有與secure.example.com的連線始終是通過 HTTPS 完成,以防止來自惡意網路的敏感流量。

res/xml/network_security_config.xml:

secure.example.com

固定證書

一般情況下,應用信任所有預裝 CA。如果有預裝 CA 要簽發欺詐性證書,則應用將面臨被中間人攻擊 (MiTM) 的風險。 有些應用通過限制信任的 CA 集或通過證書固定來選擇限制其接受的證書集。

通過按公鑰的雜湊值(X.509 證書的 SubjectPublicKeyInfo)提供證書集完成證書固定。 然後,證書鏈僅在至少包含一個已固定的公鑰時才有效。

請注意,使用證書固定時,您應始終包含一個備份金鑰,這樣,當您需要強制切換到新金鑰時,或更改 CA 時(固定到某個 CA 證書或該 CA 的中間證書時),您應用的連線性不會受到影響。 否則,您必須推送應用的更新以恢復連線性。

此外,可以設定固定到期時間,在該時間之後不執行證書固定。 這有助於防止尚未更新的應用出現連線問題。 不過,設定固定到期時間可能會繞過證書固定。

res/xml/network_security_config.xml:

example.com

7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=

fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=

配置繼承行為

繼承未在特定配置中設定的值。此行為允許進行更復雜的配置,同時保證配置檔案可讀。

如果未在特定條目中設定值,則使用來自下一個更通用的條目中的值。 未在domain-config中設定的值從父級domain-config(如果已巢狀)或從base-config(如果未巢狀)中獲取。 未在base-config中設定的值使用平臺預設值。

例如,考慮所有與example.com的子域的連線必須使用自定義 CA 集。此外,允許使用這些域的 cleartext traffic,連線到secure.example.com時除外。通過在example.com的配置中巢狀secure.example.com的配置,不需要重複trust-anchors。

res/xml/network_security_config.xml:

example.com

secure.example.com

配置檔案格式

網路安全配置特性使用 XML 檔案格式。 檔案的整體結構如以下程式碼示例所示:

...

android.com

...

...

...

...

...

...

以下部分介紹語法和檔案格式的其他詳細資訊。

可包含:

0 或 1 個

任意數量的

0 或 1 個

usesCleartextTraffic=["true" | "false"]>

...

語法:

可包含:

說明:

目標不在domain-config涵蓋範圍內的所有連線所使用的預設配置。

未設定的任何值均使用平臺預設值。面向上述 API 級別 24 及更高級別的應用的預設配置:

面向 API 級別 23 及更低級別的應用的預設配置:

語法:

usesCleartextTraffic=["true" | "false"]>

...

可包含:

1 個或多個

0 或 1 個

0 或 1 個

任意數量的已巢狀

說明

用於按照domain元素的定義連線到特定目標的配置。

請注意,如果有多個domain-config元素涵蓋某個目標,則使用匹配域規則最具體(最長)的配置。

語法:

example.com

屬性:

includeSubdomains

如果為"true",則此域規則與域及所有子域(包括子域的子域)匹配,否則,該規則僅適用於精確匹配項。

說明:

語法:

...

可包含:

0 或 1 個

說明:

當android:debuggable為"true"時將應用的重寫,IDE 和構建工具生成的非釋出版本通常屬於此情況。 將在debug-overrides中指定的信任錨新增到所有其他配置,並且當伺服器的證書鏈使用其中一個僅除錯信任錨時不執行證書固定。 如果android:debuggable為"false",則完全忽略此部分。

語法:

...

可包含:

任意數量的

說明:

用於安全連線的信任錨集

語法:

說明:

用於trust-anchors元素的 X.509 證書集。

屬性:

src

CA 證書的來源,可以是

指向包含 X.509 證書的檔案的原始資源 id。 證書必須以 DER 或 PEM 格式編碼。如果為 PEM 證書,則檔案不得包含額外的非 PEM 資料,如註釋。

用於預裝系統 CA 證書的"system"

用於使用者新增的 CA 證書的"user"

overridePins

指定來自此源的 CA 是否繞過證書固定。如果為"true",則為穿過此源的其中一個 CA 的鏈頒發證書,並且不執行證書固定。 這對於除錯 CA 或支援使用者對應用的安全流量進行中間人攻擊 (MiTM) 非常有用。

預設值為"false",除非在debug-overrides元素中另外指定(在這種情況下,預設值為"true")。

語法:

...

可包含:

任意數量的

說明:

公鑰固定 (PKP) 集。對於要信任的安全連線,信任鏈中必須有一個公鑰位於 PKP 集中。 有關固定形式,請參閱。

屬性:

expiration

採用yyyy-MM-dd格式的日期,在該日期及之後固定過期,因而禁用固定。 如果未設定該屬性,則固定不會過期。

設定到期時間有助於防止未更新到其 PKP 集(例如,由於使用者禁用應用更新)的應用出現連線問題。

語法:

base64 encoded digest of X.509

SubjectPublicKeyInfo (SPKI)

屬性:

用於生成 PKP 的摘要演算法。目前僅支援"SHA-256"。

7.ICU4J Android

ICU4J 是一個廣泛使用的開源 Java 庫集合,為軟體應用提供 Unicode 和全球化支援。 Android N 在android.icu軟體包下顯示 Android 框架中的 ICU4J API 子集,供應用開發者使用。 這些 API 使用裝置上具有的本地化資料。 因此,您可以通過不將 ICU4J 庫編譯到 APK 來減少 APK 佔用空間;相反,您可以只在框架中呼叫它們。 (在此情況下,您可能想要提供多個版本的 APK,這樣,執行比 Android N 低的 Android 版本的使用者可以下載包含 ICU4J 庫的應用版本。)

本文件開頭提供了有關支援這些庫所需的最低 Android API 級別的一些基本資訊。 然後,介紹關於 Android 特定的 ICU4J 實現您需要了解的內容。 最後,介紹如何在 Android 框架中使用 ICU4J API。

與 ICU4J 的關係

Android N 通過android.icu軟體包(而非com.ibm.icu)顯示 ICU4J API 的子集。由於種種原因,Android 框架可能選擇不顯示 ICU4J API;例如,Android N 不顯示一些已棄用的 API 或 ICU 團隊尚未將其宣告為“穩定”的 API。 由於 ICU 團隊將來會棄用這些 API,因此,Android 也會將其標記為已棄用,但將繼續包含它們。

表 1.Android N 中使用的 ICU 和 CLDR 版本。

Android API 級別ICU 版本CLDR 版本

Android N5628

以下是幾點注意事項:

ICU4J Android 框架 API 不包含所有的 ICU4J API。

NDK 開發者應瞭解 Android ICU4C 不受支援。

Android 框架中的 API 不會取代 Android 對使用資源進行本地化的支援。

從 com.ibm.icu 遷移至 android.icu 軟體包

如果您已在應用中使用 ICU4J API,且android.icuAPI 符合您的要求,那麼要遷移至框架 API,需要將 Java 匯入從com.ibm.icu更改為android.icu。 然後,您可以從 APK 移除您自己的 ICU4J 檔案的副本。

注:ICU4J 框架 API 使用android.icu名稱空間,而不是com.ibm.icu。這是為了避免在包含自己的com.ibm.icu庫的 APK 中出現名稱空間衝突。

從其他 Android SDK API 遷移至 android.icu API

java和android軟體包中的某些類與在 ICU4J 中找到的一些類等效。 不過,ICU4J 通常為標準和語言提供更廣泛的支援。

下面是一些入門示例:

類替代項

java.lang.Characterandroid.icu.lang.UCharacter

java.text.BreakIteratorandroid.icu.text.BreakIterator

java.text.DecimalFormatandroid.icu.text.DecimalFormat

java.util.Calendarandroid.icu.util.Calendar

android.text.BidiFormatterandroid.icu.text.Bidi

android.text.format.DateFormatandroid.icu.text.DateFormat

android.text.format.DateUtilsandroid.icu.text.DateFormatandroid.icu.text.RelativeDateTimeFormatter

授權

ICU4J 按照 ICU 許可釋出。如需瞭解詳情,請參閱ICU 使用者指南。

8.Java 8 支援

Android N 支援 Java 8 語言功能,您可以在開發面向 Android N 的應用時使用這些功能。本頁面介紹了 Android N Preview 中支援的新語言功能、如何正確設定專案以使用這些功能,以及您可能遇到的任何已知問題。

要開始使用這些功能,您需要下載並設定 Android Studio 2.1 和 Android N Preview SDK,包括所需的 Jack 工具鏈和更新的 Android Plugin for Gradle。 如果您尚未安裝 Android N Preview SDK,請參閱Develop for Android N 設定。

注:開發面向 Android N 平臺的應用並不要求必須使用新的 Java 8 語言功能。 如果您不想使用 Java 8 語言功能編寫程式碼,您可以將專案的源和目標相容性值保留為 Java 7,但您仍必須使用 JDK 8 進行編譯,以便針對 Android N 平臺進行構建。

支援的 Java 8 語言功能和 API

Android 目前僅支援部分 Java 8 語言功能。在開發面向 Android N Preview 的應用時,現已可使用以下功能:

預設和靜態介面方法

Lambda 表示式(也在 API 級別 23 及更低版本中使用)

重複註解

方法引用(也在 API 級別 23 及更低版本中使用)

注:在 Android 的較早版本中測試 Lambda 表示式和方法引用,前往您的build.gradle檔案,將compileSdkVersion和targetSdkVersion設定為 23 或更低版本。 您仍需要啟用 Jack 工具鏈以使用這些 Java 8 功能。

此外,現已可使用以下 Java 8 語言功能 API:

反映和語言相關 API:

java.lang.FunctionalInterface

java.lang.annotation.Repeatable

java.lang.reflect.Method.isDefault()

和與重複註解關聯的反映 API,例如AnnotatedElement.getAnnotationsByType(Class)

實用程式 API:

java.util.function

java.util.stream

啟用 Java 8 功能和 Jack 工具鏈

要使用新的 Java 8 語言功能,還需使用新的Jack 工具鏈。新的 Android 工具鏈將 Java 源語言編譯成 Android 可讀取的 Dalvik 可執行檔案位元組碼,且有其自己的.jack庫格式,在一個工具中提供了大多數工具鏈功能:重新打包、壓縮、模糊化以及 Dalvik 可執行檔案分包。

以下是構建 Android Dalvik 可執行檔案可用的兩種工具鏈的對比:

舊版 javac 工具鏈:

javac(.java-->.class) -->dx(.class-->.dex)

新版 Jack 工具鏈:

Jack(.java-->.jack-->.dex)

配置 Gradle

如需為您的專案啟用 Java 8 語言功能和 Jack,請在模組層級的build.gradle檔案中輸入以下內容:

android {

...

defaultConfig {

...

jackOptions {

enabled true

}

}

compileOptions {

sourceCompatibility JavaVersion.VERSION_1_8

targetCompatibility JavaVersion.VERSION_1_8

}

}

已知問題

Instant Run目前不能用於 Jack,在使用新的工具鏈時將被禁用。

由於 Jack 在編譯應用時不生成中間類檔案,依賴這些檔案的工具目前不能用於 Jack。例如以下工具:

對類檔案進行操作的 Lint 檢測工具

需要應用類檔案的工具和庫(例如使用 JaCoCo 進行儀器測試中)

如果您在使用 Jack 的過程中發現其他問題,請提交錯誤。

9.Android for Work 更新

QR 碼配置

Android for Work 現在支援使用 QR 碼來配置企業負責的裝置。 安裝嚮導現在允許您通過掃描 QR 碼來配置裝置。

工作資料安全性挑戰

個人資料所有者可以要求使用者為在工作資料中執行的應用指定安全性挑戰。 系統會在使用者嘗試開啟任何工作應用時顯示安全性挑戰。 如果使用者成功完成安全性挑戰,系統可解鎖工作資料並將其解密(如果需要)。

如果個人資料所有者傳送一項ACTION_SET_NEW_PASSWORDIntent,系統會提示使用者設定一項安全性挑戰。 個人資料所有者也可以傳送一項ACTION_SET_NEW_PARENT_PROFILE_PASSWORDIntent 來提示使用者設定裝置鎖定。

個人資料所有者可以選擇為工作挑戰設定不同於其他裝置密碼策略的密碼策略。 例如,裝置挑戰響應的最小長度可以與其它密碼要求的長度不同。 個人資料所有者使用常見的DevicePolicyManager方法來設定挑戰策略,如setPasswordQuality()和setPasswordMinimumLength()。 個人資料所有者還能通過使用由新的DevicePolicyManager.getParentProfileInstance()方法返回的DevicePolicyManager例項來設定裝置鎖定, 此外,個人資料所有者可以使用DevicePolicyManager類的新setOrganizationColor()和setOrganizationName()方法來自定義工作挑戰的憑據螢幕。

有關新方法和常量的詳細資訊,請參閱N Preview SDK 參考中的DevicePolicyManager參考頁面。

停用應用訪問

裝置所有者和個人資料所有者可以通過呼叫新DevicePolicyManager.setPackagesSuspended()方法來臨時暫停軟體包訪問。 所有者可以用同樣的方法來重新啟用這些軟體包。

在軟體包被暫停期間,它不能啟動 Activity ,到軟體包的通知會被阻止,而概覽螢幕中的應用條目會被隱藏。 暫停的軟體包不會顯示在概覽螢幕中,並且它們不能顯示對話(包括提醒和 Snackbar), 也不能播放音訊或振動裝置。

啟動器應對暫停的應用應用一個獨特的 UI,以指示應用目前不可用;例如它們可以將應用圖示顯示為灰色。 啟動器可以通過呼叫新DevicePolicyManager.getPackageSuspended()方法來確定應用是否被暫停。

切換工作模式

在雙個人資料裝置上,使用者可以開啟或關閉工作模式。在工作模式關閉時,託管個人資料會被暫時關閉。 工作資料應用、後臺同步和通知都會被停用,包括個人資料所有者應用。 在工作資料被停用時,系統會顯示一個持久的狀態圖示,以提醒使用者他們將無法啟動工作應用。 系統啟動器會指示工作應用和小工具都將無法訪問。

Always-On VPN

裝置所有者和個人資料所有者可以要求工作應用始終通過指定的 VPN 連線到網路。 如果所有者設定了此要求,裝置會在啟動時自動開始 VPN。

所有者可以通過呼叫新DevicePolicyManager.setAlwaysOnVpnPackage()方法來要求使用 VPN。 通過呼叫新DevicePolicyManager.GetAlwaysOnVpnPackage()方法來確定所有者是否設定了 VPN 要求。

由於 VPN 服務無需應用互動即可由系統直接繫結,因此,VPN 客戶端必須針對 Always on VPN 處理新的入口點。 像以前一樣,您可以通過使用與操作android.net.VpnService匹配的 Intent 過濾器查詢活動的服務。

使用者可以使用Settings > More > VPN螢幕來手動設定實現VpnService的 Always on VPN 客戶端。

聯絡人與工作資料整合

個人資料所有者可以允許主使用者對工作聯絡人進行本地搜尋和目錄查詢。 例如,使用者可以從他們的個人撥號器或聯絡人應用訪問個人和工作目錄聯絡人(如果他們的個人資料管理員允許)。

利用聯絡人提供程式的開發者可以使用企業聯絡人 API 從主使用者訪問工作資料目錄條目(如果策略允許):

ContactsContract.Contacts.ENTERPRISE_CONTENT_FILTER_URI

ContactsContract.Phone.ENTERPRISE_CONTENT_FILTER_URI

ContactsContract.Email.ENTERPRISE_CONTENT_FILTER_URI

ContactsContract.Callable.ENTERPRISE_CONTENT_FILTER_URI

ContactsContract.Directory.ENTERPRISE_CONTENT_URI

ContactsContract.Directory.isEntepriseDirectoryId()

個人資料所有者可以使用以下新方法來控制主使用者的工作聯絡人可見性:

DevicePolicyManager.setCrossProfileContactsSearchDisabled()

DevicePolicyManager.getCrossProfileContactsSearchDisabled()

遠端重新啟動

裝置所有者可以遠端重新啟動裝置。有些情況下,部署在公共場所的封裝內裝置會阻止訪問電源按鈕。 如果裝置需要重新啟動,管理員可以使用新DevicePolicyManager.reboot()方法來進行此操作。

停用資料網路漫遊

裝置所有者可以使用新的UserManager使用者限制DISALLOW_DATA_ROAMING來停用資料網路漫遊。

企業程序記錄

裝置所有者可以通過遠端跟蹤裝置活動來識別可疑活動 ,包括應用啟動、ADB Activity 和螢幕解鎖。 程序記錄不要求使用者同意。 若要檢索記錄,裝置所有者可以使用DevicePolicyManager.setSecurityLoggingEnabled()來啟用裝置記錄。

API 更改包括:

新類android.app.admin.SecurityLog和它的方法

void DevicePolicyManager.setSecurityLoggingEnabled()

boolean DevicePolicyManager.isSecurityLoggingEnabled()

ListDevicePolicyManager.retrieveSecurityLogs()

ListDevicePolicyManager.retrievePreRebootSecurityLogs()

void DeviceAdminReceiver.onSecurityLogsAvailable()

遠端錯誤報告

裝置所有者可以遠端觸發和檢索包含裝置狀態轉儲檔案的錯誤報告,這允許對已知事故或受損害的裝置進行取證調查。 鑑於錯誤報告的詳細性質,需要經過使用者同意。

Android N 包括以下 API 新增來支援此功能。如需詳細資訊,請參閱N Preview SDK 參考。

DevicePolicyManager.requestBugreport()

DeviceAdminReceiver.onBugreportFailed()

DeviceAdminReceiver.onBugreportShared()

DeviceAdminReceiver.onBugreportSharingDeclined()

DeviceAdminReceiver.BUGREPORT_FAILURE_FAILED_COMPLETING

DeviceAdminReceiver.BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE

移除客戶端證書

個人資料所有者和裝置所有者現在可以通過呼叫新方法DevicePolicyManager.removeKeyPair()來移除通過installKeyPair()安裝的客戶端證書。

允許訪問安裝裝置上的客戶端證書

如果個人資料所有者或裝置所有者授予第三方應用管理證書的許可權,應用便可授予自身訪問其所安裝證書的許可權,無需所有者進行任何干預。

用於管理證書的現有 API 經過擴充套件,現包括:

DevicePolicyManager.installKeyPair()

系統 UI 策略透明度

影響使用者體驗或限制使用者設定的策略是向用戶完全公開的,個人資料所有者和裝置所有者可以將策略歸於他們公司的 IT 部門。 除了“Settings”中一貫的“Action not allowed”訊息之外,IT 管理員可以通過以下新DevicePolicyManager方法在裝置設定中設定組織特定的支援訊息:

DevicePolicyManager.setShortSupportMessage()

DevicePolicyManager.setLongSupportMessage()

應用限制管理增強

裝置或個人資料所有者可以通過新DevicePolicyManager.setApplicationRestrictionsManagingPackage()方法啟用另一項應用,以管理應用限制。 提名的應用可以通過呼叫DevicePolicyManager.isCallerApplicationRestrictionsManagingPackage()來檢查是否已被授予此許可權。

提名管理應用限制的應用可以為該使用者或個人資料內的任何軟體包呼叫setApplicationRestrictions()和getApplicationRestrictions()。

位置關閉開關

使用者可以停用工作應用的位置許可權,同時仍可繼續在個人應用中訪問位置資訊。 Location Settings 中的一個單獨的位置訪問開關允許使用者拒絕對工作資料內執行的應用的位置更新或最後位置查詢。

頂層位置關閉開關停用對主個人資料和託管個人資料的位置訪問許可權。

自定義配置

應用可以用企業顏色和徽標來自定義個人資料所有者和裝置所有者配置流程。

DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR

自定義流程顏色。

DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI

用企業徽標來自定義流程。

多 Wi-Fi CA 證書

個人資料所有者和裝置所有