打造裝置政策控制器

本指南將說明如何開發裝置政策控制器 (DPC), 搭載 Android 企業的裝置過去已知的裝置政策控制器 (DPC) 應用程式 以工作政策控制器的身分,控管本機裝置政策和系統 應用程式。

關於裝置政策控制器 (DPC)

在 Android Enterprise 部署作業中,企業可自行控管 使用者裝置的不同層面,例如區分工作相關 擷取來自使用者的資訊個人資料、預先設定核准的應用程式, 或是停用裝置功能 (例如相機)。

EMM 是由你開發的 DPC 應用程式,供客戶在 搭配 EMM 控制台 伺服器客戶將 DPC 部署至他們管理的使用者裝置。 DPC 會充當 EMM 控制台 (和伺服器) 與裝置之間的橋樑。 管理員會使用 EMM 控制台執行各種工作,包括 調整裝置設定和應用程式。

DPC 會在已安裝該設定檔的裝置上建立及管理工作資料夾。 工作資料夾會加密工作相關資訊,並將資訊與 使用者個人應用程式與資料建立工作資料夾之前,DPC 也可以在建立工作資料夾前 佈建可在裝置上使用的 Google Play 管理版帳戶。

本指南將說明如何開發可建立及管理工作資料夾的 DPC。

EMM 專用 DPC 支援資料庫

EMM 適用的 DPC 支援資料庫包含公用程式和輔助類別, 協助企業佈建及管理 Android 裝置 環境。這個程式庫可讓您使用 裝置政策控制器 (DPC) 應用程式:

  • Google Play 管理版帳戶佈建支援: 佈建中已受管理 如要透過 DPC 應用程式使用 Google Play 帳戶,Google Play 和 Google Play 服務應用程式符合最低版本需求。不過,更新這些項目 有時可能相當複雜DPC 支援資料庫會負責更新 應用程式,也能確保日後新版受管理 Google 服務的更新相容性 Play 帳戶佈建程序。 請參閱「Google Play 管理版帳戶」 帳戶管理支援
  • 受管理設定支援: 要使用 Play EMM API 處理已核准應用程式的受管理設定, 在 DPC 上實作受管理的設定。DPC 支援 程式庫可讓您委派 Google Play 套用受管理設定的工作 設定 (原稱應用程式限制),即管理員使用 EMM 所設的限制 控制台。使用 Play EMM API 處理受管理的設定, 要在安裝期間自動套用的應用程式設定詳情請見 套用受管理的設定 工作應用程式,進一步瞭解如何運用 DPC。

請按照下列步驟下載程式庫。本指南中詳述的工作 假設您使用 DPC 支援資料庫。

下載 DPC 支援資料庫

如要使用 DPC 支援資料庫,請前往 Android Enterprise EMM 供應商社群下載程式庫。 您必須將程式庫新增至 build.gradle 檔案中,並處理其他 依附於 DPC 應用程式舉例來說,程式庫需要 11.4.0 Google Play 服務驗證用戶端程式庫

  1. 將程式庫新增至 build.gradle 檔案:

    Groovy

    implementation(name:'dpcsupport-yyyymmdd', ext:'aar')
    

    Kotlin

    implementation(name = "dpcsupport-yyyymmdd", ext = "aar")
    
  2. 新增 11.4.0 Google Play 服務驗證用戶端程式庫新增至 build.gradle 檔案:

    Groovy

    implementation 'com.google.android.gms:play-services-auth:11.4.0'
    

    Kotlin

    implementation("com.google.android.gms:play-services-auth:11.4.0")
    
,瞭解如何調查及移除這項存取權。

程式庫需要特定權限才能執行,因此您必須將這些權限新增至 上傳至 Google Play 的 DPC 應用程式資訊清單:

  <uses-permission android:name=
      "android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
  <uses-permission android:name=
      "android.permission.GET_ACCOUNTS"/>
  <uses-permission android:name=
      "android.permission.MANAGE_ACCOUNTS"/>
  <uses-permission android:name=
      "android.permission.WRITE_SYNC_SETTINGS"/>
  <uses-permission android:name=
      "com.google.android.providers.gsf.permission.READ_GSERVICES"/>

除了這些初步設定和部署步驟之外,您還必須 初始化 DPC 程式碼中的特定程式庫功能,具體情況取決於 您想實作的功能相關詳細資料會包含在 。

建立裝置政策控制器 (DPC)

在用於裝置管理應用程式的現有模型上建構裝置政策控制器 (DPC)。 具體來說,您的應用程式必須建立 DeviceAdminReceiver 子類別 (來自 android.app.admin 的類別) 套件中所述, 裝置管理

建立工作資料夾

如需建立基本工作資料夾的範例,請參閱 GitHub 的 BasicManagedProfile

如要在已有個人資料夾的裝置上建立工作資料夾,請按照下列步驟操作: 首先,請檢查裝置是否支援工作資料夾 FEATURE_MANAGED_USERS 系統功能:

Kotlin

if (!packageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) {
    // This device does not support work profiles!
}

Java

PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) {
    // This device does not support work profiles!
}

如果裝置支援工作資料夾,請傳送意圖來建立工作資料夾 具有 ACTION_PROVISION_MANAGED_PROFILE 動作。(在部分說明文件中,受管理的設定檔是 一般詞彙是指跟工作資料夾一樣。 使用 Android 1 和 Google 解決方案 加入裝置管理員套件名稱 額外的優點:

Kotlin

val provisioningActivity = getActivity()

// You'll need the package name for the DPC app.
val myDPCPackageName = "com.example.myDPCApp"

// Set up the provisioning intent
val adminComponent = ComponentName(provisioningActivity.applicationContext, MyAdminReceiver::class.java)
provisioningIntent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, adminComponent.flattenToString())
if (provisioningIntent.resolveActivity(provisioningActivity.packageManager) == null) {
    // No handler for intent! Can't provision this device.
    // Show an error message and cancel.
} else {
    // REQUEST_PROVISION_MANAGED_PROFILE is defined
    // to be a suitable request code
    startActivityForResult(provisioningIntent,
            REQUEST_PROVISION_MANAGED_PROFILE)
    provisioningActivity.finish()
}

Java

Activity provisioningActivity = getActivity();
// You'll need the package name for the DPC app.
String myDPCPackageName = "com.example.myDPCApp";
// Set up the provisioning intent
Intent provisioningIntent =
        new Intent("android.app.action.PROVISION_MANAGED_PROFILE");
ComponentName adminComponent = new ComponentName(provisioningActivity.getApplicationContext(), MyAdminReceiver.class);
provisioningIntent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, adminComponent.flattenToString());
if (provisioningIntent.resolveActivity(provisioningActivity.getPackageManager())
         == null) {
    // No handler for intent! Can't provision this device.
    // Show an error message and cancel.
} else {
    // REQUEST_PROVISION_MANAGED_PROFILE is defined
    // to be a suitable request code
    startActivityForResult(provisioningIntent,
            REQUEST_PROVISION_MANAGED_PROFILE);
    provisioningActivity.finish();
}

系統會執行下列動作來回應這項意圖:

  • 驗證裝置已加密。如果兩者皆不同,系統會提示 使用者必須加密裝置再繼續操作。
  • 建立工作資料夾。
  • 系統會將非必要的應用程式從工作資料夾中移除。
  • 將 DPC 應用程式複製到工作資料夾,並將 DPC 設為 資料擁有者

onActivityResult() 覆寫為 查看佈建是否成功:

Kotlin

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    // Check if this is the result of the provisioning activity
    if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) {
        // If provisioning was successful, the result code is
        // Activity.RESULT_OK
        if (resultCode == Activity.RESULT_OK) {
            // Work profile created and provisioned.
        } else {
            // Provisioning failed.
        }
        return
    } else {
        // This is the result of some other activity. Call the superclass.
        super.onActivityResult(requestCode, resultCode, data)
    }
}

Java

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check if this is the result of the provisioning activity
    if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) {
        // If provisioning was successful, the result code is
        // Activity.RESULT_OK
        if (resultCode == Activity.RESULT_OK) {
            // Work profile created and provisioned.
        } else {
            // Provisioning failed.
        }
        return;
    } else {
        // This is the result of some other activity. Call the superclass.
        super.onActivityResult(requestCode, resultCode, data);
    }
}

完成工作資料夾啟用程序

設定檔佈建完成後,系統會呼叫 DPC 應用程式的 DeviceAdminReceiver.onProfileProvisioningComplete() 方法。覆寫 以完成工作資料夾的啟用程序。

一般DeviceAdminReceiver.onProfileProvisioningComplete() 回呼實作會進行以下作業:

啟用工作資料夾

完成上述工作後,請呼叫裝置政策管理員的 啟用工作資料夾的 setProfileEnabled() 方法:

Kotlin

// Get the device policy manager
val myDevicePolicyMgr = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val componentName = myDeviceAdminReceiver.getComponentName(this)
// Set the name for the newly created work profile.
myDevicePolicyMgr.setProfileName(componentName, "My New Work Profile")
// ...and enable the profile
myDevicePolicyMgr.setProfileEnabled(componentName)

Java

// Get the device policy manager
DevicePolicyManager myDevicePolicyMgr =
        (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName componentName = myDeviceAdminReceiver.getComponentName(this);
// Set the name for the newly created work profile.
myDevicePolicyMgr.setProfileName(componentName, "My New Work Profile");
// ...and enable the profile
myDevicePolicyMgr.setProfileEnabled(componentName);

設定裝置政策

DPC 應用程式會套用管理員設定的裝置政策,以符合 組織的需求和限制舉例來說,安全性政策可能會 要求在密碼輸入錯誤達到一定次數後鎖定裝置。 裝置政策控制器 (DPC) 控制台向 EMM 控制台查詢目前政策,然後套用政策 使用裝置 管理 API。

如要瞭解如何套用裝置政策,請參閱 政策

套用受管理的設定 到工作應用程式

受管理設定可讓您的客戶: 預先設定獲準部署的應用程式,並且更新 應用程式。請先設定應用程式, 確保符合組織的安全性及其他政策 並在目標裝置上安裝應用程式時。

應用程式功能是由應用程式開發人員在 XML 架構 (即 受管理的設定結構定義) 會將應用程式上傳至 Google Play (應用程式開發人員,請參閱調整受管理的設定瞭解詳情)。

您將從應用程式擷取這個結構定義以供客戶管理員查看 提供的使用者介面,當中定義了 結構定義顯示,並讓管理員預先設定應用程式的設定。 一般來說,由管理員設定的受管理設定 再使用 GMM 伺服器 透過 EMM API 完成設定 適用於裝置的受管理設定Managedconfigurationsforuser。詳情請見 受管理的設定 。

您可以使用 Play EMM API 將受管理設定套用至應用程式 (建議方法) 或直接透過 DPC (詳情請參閱「套用受管理的設定》 。使用 Play EMM API 有許多優點,包括簡易的導入程序,因為您可以使用 DPC 支援資料庫:簡化裝置政策控制器 (DPC) 工作。 以及 Play EMM API:

  • 在使用者安裝新應用程式時,以不可分割的形式設定設定,以確保使用者第一次啟動應用程式時就已準備妥當。
  • 可讓您針對個別使用者管理設定,避免監控各裝置的佈建情形。

使用 Play EMM API

如要將 Play EMM API 用於受管理的設定,DPC 必須允許 進行相關設定。由裝置政策控制器 (DPC) 支援資料庫負責處理 對 Google Play 傳送的設定進行 Proxy 處理

如何使用 Play EMM API,下載 DPC 支援資料庫 並在 DPC 中啟用受管理設定支援功能。

啟用以下項目的受管理設定支援功能: DPC

將這個類別匯入裝置政策控制器 (DPC):

com.google.android.apps.work.dpcsupport.ManagedConfigurationsSupport

初始化受管理的設定程式庫。在這個範例中,「admin」為 DeviceAdminReceiver 的 ComponentName。

Kotlin

var managedConfigurationsSupport = ManagedConfigurationsSupport(context, admin)

Java

ManagedConfigurationsSupport managedConfigurationsSupport =
    new ManagedConfigurationsSupport(context, admin);

啟用受管理的設定:

Kotlin

managedConfigurationsSupport.enableManagedConfigurations()

Java

managedConfigurationsSupport.enableManagedConfigurations();

這個程式庫已在 DPC 中初始化後,您就能使用 EMM 中的 Google Play EMM API 將受管理的設定套用到核准的應用程式,而非 直接在 DPC 中編寫這些工作詳情請見 透過 Play 管理的設定

套用受管理的設定 直接下載

如要從 DPC 直接變更應用程式的配置設定,請呼叫 DevicePolicyManager.setApplicationRestrictions() 方法 然後傳送 則必須針對 DPC 應用程式的 DeviceAdminReceiver、目標應用程式的套件名稱 以及隨附的套裝組合 管理員配置的應用程式受管理設定。詳情請見 您的 DPC 和 EMM 控制台互動調整受管理的設定,瞭解詳細資訊。不過 請注意,如果選擇這種方式, 部署 Google Play 管理版帳戶時,不建議部署設定。

Google Play 管理版帳戶佈建 支援團隊

DPC 支援資料庫提供相關支援 佈建 Google Play 管理版帳戶。如要使用這項支援功能,您必須先初始化 然後確保 新增 Google Play 管理版帳戶

初始化 Google Play 管理版帳戶 DPC 的支援

將這個類別匯入裝置政策控制器 (DPC):

com.google.android.apps.work.dpcsupport.AndroidForWorkAccountSupport

初始化佈建相容性程式庫。在這個範例中,「admin」是 DeviceAdminReceiverComponentName

Kotlin

var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)

Java

AndroidForWorkAccountSupport androidForWorkAccountSupport =
    new AndroidForWorkAccountSupport(context, admin);

請確保應用程式的工作環境 Google Play 管理版帳戶

DPC 以設定檔擁有者模式 (ACTION_PROVISION_MANAGED_PROFILE) 或裝置佈建裝置後 擁有者模式 (ACTION_PROVISION_MANAGED_DEVICE),請撥打:

Kotlin

androidForWorkAccountSupport.ensureWorkingEnvironment(callback)

Java

androidForWorkAccountSupport.ensureWorkingEnvironment(callback);

回呼會回報這項程序執行成功或失敗。回呼時間 後,即可新增 Google Play 管理版帳戶。如果 回呼會回報錯誤、提示使用者確認 裝置有網路連線 (例如下載失敗時)。在其他 如有任何問題,請向 Google 回報。

Kotlin

object : WorkingEnvironmentCallback() {
    override fun onSuccess() {
        // Can now provision the managed Google Play Account
    }
    override fun onFailure(error: Error) {
        // Notify user, handle error (check network connection)
    }
}

Java

new WorkingEnvironmentCallback() {
    @Override
    public void onSuccess() {
        // Can now provision the managed Google Play Account
    }

    @Override
    public void onFailure(Error error) {
        // Notify user, handle error (check network connection)
    }
}

新增 Google Play 管理版帳戶

Android 架構的 AccountManager 可以在裝置上新增 Google Play 管理版帳戶。為了簡化與 AccountManager,使用輔助函式 (如以下範例所示) 來自DPC 支援資料庫。函式 處理 Google Play 伺服器傳回的權杖,並協助進行佈建作業 Google Play 管理版帳戶。這個函式會在 Google Play 管理版傳回時傳回 帳戶處於有效狀態:

Kotlin

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback)

Java

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
  • token:Google 播放 EMM API Users.generateAuthenticationToken() 呼叫。
  • accountAddedCallback:傳回 Google Play 管理版帳戶 。這個回呼應包含 onAccountReady()onFailure() 方法。

Kotlin

val workAccountAddedCallback = object : WorkAccountAddedCallback() {
    override fun onAccountReady(account: Account, deviceHint: String) {
        // Device account was successfully added to the device
        // and is ready to be used.
    }

    override fun onFailure(error: Error) {
        // The account was not successfully added. Check that the token
        // provided was valid (it expires after a certain period of time).
    }
}

Java

WorkAccountAddedCallback workAccountAddedCallback =
    new WorkAccountAddedCallback() {
        @Override
        public void onAccountReady(Account account, String deviceHint) {
            // Device account was successfully added to the device
            // and is ready to be used.
        }

        @Override
        public void onFailure(Error error) {
            // The account was not successfully added. Check that the token
            // provided was valid (it expires after a certain period of time).
        }
};
  • 如要進一步瞭解 Device 管理 API,請參閱 裝置 管理
  • 如要瞭解 Android Enterprise 佈建方法,請參閱 佈建裝置,請造訪: 《Android Enterprise 開發人員指南》
  • 如要查看說明如何建立基本工作資料夾的 GitHub 範例, 請參閱 BasicManagedProfile
  • 這個 GitHub 範例示範如何以下列形式,將其他應用程式的設定 個人資料擁有者,請參閱 AppRestrictionEnforcer