工作資料夾

Android 平台可讓裝置 工作 設定檔 (有時稱為受管理的設定檔)。工作資料夾受到控管 可用功能獨立於 IT 管理員 使用者主要個人資料的功能。這個方法可讓機構 使用者裝置上的公司專用應用程式和資料執行環境 同時讓使用者使用個人應用程式和設定檔

本課程將說明如何修改應用程式,使其可正常運作 安全可靠您不必採取任何行動 以及一般的應用程式開發最佳做法不過 會變得格外重要這個 該文件會醒目顯示您應留意的問題。

總覽

使用者通常希望在企業環境中使用個人裝置。這個 情況可能代表有困境的機構。如果使用者可以使用自己的 因此機構必須擔憂員工等機密資訊 電子郵件和聯絡人) 都位於機構沒有控管的裝置上。

為解決此問題,Android 5.0 (API 級別 21) 可讓機構 設定工作資料夾。如果裝置設有工作資料夾, 設定由 IT 管理員控管。 IT 管理員可以選擇要允許哪些應用程式存取該設定檔,也能 控制設定檔可使用的裝置功能。

如果裝置設有工作資料夾,應用程式會受到的影響 在裝置上執行的任何設定檔為何:

  • 根據預設,大多數意圖不會從一個設定檔跨越至另一個設定檔。如果 設定檔執行的應用程式會觸發意圖, 該設定檔的意圖也不得跨越另一個設定檔 由於設定檔限制,要求失敗,應用程式也可能會關閉 不如預期外
  • 設定檔 IT 管理員可以限制使用者能存取 工作資料夾。這項限制也可能造成 一些常見的意圖
  • 由於個人資料夾和工作資料夾具有獨立的儲存空間區域,因此 檔案 URI 在某個設定檔上無效。不限 視設定檔而定,在一個設定檔上觸發的意圖或許也會在另一個設定檔上處理 所以將檔案 URI 附加至意圖並不安全。

防止失敗的意圖

在設有工作資料夾的裝置上,意圖是否 可以跨越不同的設定檔在大多數情況下,當意圖觸發時 關閉時,也會處理觸發該動作的同一個設定檔。如果沒有處理常式 針對「該設定檔」的意圖,系統不會處理意圖和應用程式 就會意外關閉 — 即使有 另一個設定檔的意圖

設定檔管理員可以選擇 標籤可以跨越設定檔的資料由於 IT 管理員 最終的決定,在 YouTube 中 事先瞭解哪些意圖允許跨越這個邊界。 這項政策由 IT 管理員設定,且可隨時變更。

在應用程式啟動活動之前,您應驗證活動 合適的解析度。個人中心 ,請呼叫 Intent.resolveActivity(),確認其解析度為可接受的。如果沒有 解析意圖的方式 null。如果方法傳回非空值,則至少有一個方法可 解析意圖,而且可以安全地觸發意圖。在此情況下, 或 kubectl 因為目前設定檔中有處理常式,或者意圖是 可跨越另一個設定檔的處理常式。(如要進一步瞭解 解析意圖,請參閱常見意圖)。

舉例來說,如果您的應用程式需要設定計時器,就需要檢查 ACTION_SET_TIMER 意圖具備有效的處理常式。如果應用程式無法解析 意圖,則應採取適當動作 (例如顯示錯誤 訊息)。

Kotlin

fun startTimer(message: String, seconds: Int) {

    // Build the "set timer" intent
    val timerIntent = Intent(AlarmClock.ACTION_SET_TIMER).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_LENGTH, seconds)
        putExtra(AlarmClock.EXTRA_SKIP_UI, true)
    }

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(packageManager) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent)

    }
}

Java

public void startTimer(String message, int seconds) {

    // Build the "set timer" intent
    Intent timerIntent = new Intent(AlarmClock.ACTION_SET_TIMER)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
            .putExtra(AlarmClock.EXTRA_SKIP_UI, true);

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(getPackageManager()) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent);

    }
}

在設定檔之間分享檔案

有時候,應用程式需要將自己的檔案存取權授予其他應用程式。 舉例來說,圖片庫應用程式可能會想將圖片與圖片分享 編輯一般而言,共用檔案的方法有兩種:使用 file URI內容 URI

檔案 URI 的開頭為 file: 前置字串,後接 裝置儲存空間中檔案的絕對路徑。不過,由於 工作資料夾和個人資料夾使用不同的儲存空間區域、檔案 URI 只在其中一個設定檔中有效。這種情況 也就是說 將檔案 URI 附加至意圖,而另一個設定檔則處理意圖 處理常式無法存取檔案。

相反地,您應該使用內容 URI 共用檔案。內容 URI 以更安全、更可分享的方式識別檔案內容 URI 包含 檔案路徑,也包括提供檔案的授權和 ID 號碼 識別檔案您可以使用 FileProvider。接著,你就可以 將 ID 用於其他應用程式 (即使在另一個設定檔上)。接收者可以使用 內容 ID 來取得實際檔案的存取權。

以下舉例說明您可以如何取得特定檔案的內容 URI URI:

Kotlin

// Open File object from its file URI
val fileToShare = File(fileUriToShare)

val contentUriToShare: Uri = FileProvider.getUriForFile(
        context,
        "com.example.myapp.fileprovider",
        fileToShare
)

Java

// Open File object from its file URI
File fileToShare = new File(fileUriToShare);

Uri contentUriToShare = FileProvider.getUriForFile(getContext(),
        "com.example.myapp.fileprovider", fileToShare);

呼叫 getUriForFile() 方法時, 必須包含檔案供應商的授權 (在本例中為 "com.example.myapp.fileprovider"),後者是在 <provider>敬上 部分。 如需進一步瞭解如何使用內容 URI 共用檔案,請參閱 分享 檔案

聽取通知

應用程式通常會提供 NotificationListenerService 子類別變更為 接收系統發出的通知變更回呼。搭載 工作資料夾可能會影響 NotificationListenerService 的運作方式 互動情形

在工作資料夾中

無法透過應用程式使用 NotificationListenerService 。應用程式在工作資料夾中執行時, 系統會忽略應用程式的 NotificationListenerService。不過 個人資料夾中執行的應用程式皆可監聽通知。

在個人資料夾中

當應用程式在個人資料夾中執行時,你可能不會收到通知 針對工作資料夾中執行的應用程式。根據預設,所有個人資料夾應用程式 接收回呼,但 IT 管理員可以將一或多個個人資料夾加入許可清單 允許監聽通知異動的應用程式。接著,系統會封鎖 未加入許可清單的應用程式。在 Android 8.0 (API 級別 26) 以上版本中,裝置政策 管理工作資料夾的控制器 (DPC) 可能會導致應用程式無法監聽 使用 DevicePolicyManager前往工作資料夾的通知 種方式 setPermittedCrossProfileNotificationListeners()。 應用程式仍可收到回呼,指出在個人資料夾中張貼的通知

測試應用程式與工作資料夾的相容性

建議您在工作資料夾環境中測試應用程式, 找出可能導致應用程式無法在 工作資料夾。特別是,測試工作資料夾的裝置是個好方法。 如何確保應用程式正確處理意圖: 無法處理、附加沒有跨設定檔運作的 URI 保持開啟。

我們提供了範例應用程式 TestDPC 這樣就能在搭載 Android 的 Android 裝置上設定工作資料夾 Android 5.0 (API 級別 21) 以上版本。這款應用程式提供簡便的測試方式 。您還可以使用這個應用程式 請按照下列步驟設定工作資料夾:

  • 指定受管理平台可使用的預設應用程式 個人資料
  • 設定哪些意圖可從一個設定檔跨越至 另一個

如果是透過 USB 傳輸線手動安裝應用程式,且裝置具有 工作資料夾,那麼個人和工作都會安裝這個應用程式 安裝應用程式後,您可以在以下位置測試應用程式: 下列情況:

  • 如果意圖通常會由預設應用程式處理 (例如 停用相機應用程式),請嘗試在工作資料夾中停用該預設應用程式,並且 檢查應用程式能否妥善處理這個問題
  • 如果您觸發意圖,且希望其他應用程式處理該意圖,請嘗試 啟用及停用該意圖的權限,從一個設定檔跨越剖析資料 另一個例子。確認應用程式在這兩種情況下正常運作。如果 意圖無法在設定檔之間跨入,因此請同時驗證應用程式行為 應用程式設定檔上有適當的處理常式,且在沒有該處理常式的情況下。 舉例來說,如果您的應用程式觸發了地圖相關意圖,請嘗試使用下列各項功能: 情境:
    • 裝置可讓地圖意圖從一個設定檔跨越至另一個設定檔 其他設定檔 (適用於應用程式的設定檔) 有適當的處理常式 執行時間)
    • 裝置不允許在不同的設定檔之間交互地圖意圖,但 是應用程式設定檔上的適當處理常式
    • 裝置不允許在不同的設定檔之間交互地圖意圖; 不適用於裝置設定檔中的地圖意圖
  • 如要將內容附加至意圖,請確認意圖是否正常運作 以及限制在應用程式的設定檔中處理時,以及

測試工作資料夾:提示與秘訣

測試您的 Google Cloud 行動應用程式時 工作資料夾裝置上。

  • 如上所述,當您在工作資料夾的裝置上側載應用程式時, 兩個設定檔中。如有需要,您可以將應用程式從一個設定檔中刪除 讓手機移到另一端
  • Android Debug Bridge (ADB) 殼層提供的大多數活動管理員指令 支援 --user 旗標,可讓您指定要執行的使用者 如同指定使用者後,您可以選擇是否以非受管的主要使用者的身分執行 或工作資料夾詳情請參閱 ADB 殼層指令
  • 如要找出裝置上的活躍使用者,請使用 ADB 套件管理工具 list users 指令。輸出字串中的第一個數字是 使用者 ID,您可以與 --user 旗標搭配使用。如要 請參閱 ADB 殼層 指令

舉例來說,如要找出裝置上的使用者,您可以執行以下指令:

$ adb shell pm list users
UserInfo{0:Drew:13} running
UserInfo{10:Work profile:30} running

在本例中,主要使用者 (「Drew」) 的使用者 ID 為 0,而 工作資料夾的使用者 ID 為 10如要在工作資料夾中執行應用程式,您必須 應該使用類似以下的指令:

$ adb shell am start --user 10 \
-n "com.example.myapp/com.example.myapp.testactivity" \
-a android.intent.action.MAIN -c android.intent.category.LAUNCHER