Android 創(chuàng)建設(shè)備策略控制器

2018-08-02 18:04 更新

編寫:zenlynn 原文:http://developer.android.com/training/enterprise/work-policy-ctrl.html

在 Android for Work 的部署中,企業(yè)需要保持對(duì)員工設(shè)備的某些方面的控制。企業(yè)需要確保工作相關(guān)的信息被加密,并與員工的私人數(shù)據(jù)分離。企業(yè)也可能需要限制設(shè)備的功能,例如設(shè)備是否被允許使用相機(jī)。而且企業(yè)也可能需要那些被批準(zhǔn)的應(yīng)用提供應(yīng)用限制,所以企業(yè)可以根據(jù)需要關(guān)閉或打開應(yīng)用的功能。

為了處理這些任務(wù),企業(yè)開發(fā)并部署設(shè)備策略控制器應(yīng)用(以前稱為工作策略控制器)。該應(yīng)用被安裝在每一個(gè)員工的設(shè)備中。安裝在每一個(gè)員工設(shè)備中的控制應(yīng)用創(chuàng)建了一個(gè)企業(yè)用戶 profile,它可以區(qū)別用戶的私人賬戶以訪問企業(yè)應(yīng)用和數(shù)據(jù)。該控制應(yīng)用同時(shí)也是企業(yè)管理軟件和設(shè)備之間的橋梁;當(dāng)企業(yè)需要改變配置的時(shí)候就告訴控制應(yīng)用,然后控制應(yīng)用適當(dāng)?shù)貫樵O(shè)備和其他應(yīng)用改變?cè)O(shè)置。

該課程描述了如何在 Android for Work 的部署中為設(shè)備開發(fā)一個(gè)設(shè)備策略控制器。該課程描述了如何創(chuàng)建一個(gè)企業(yè)用戶 profile,如何設(shè)置設(shè)備策略,以及如何在 managed profile 中為其他運(yùn)行中的應(yīng)用進(jìn)行限制。

注意:該課程的內(nèi)容并不包括在企業(yè)控制之下,設(shè)備中唯一的 profile 就是 managed profile 的情況。

設(shè)備管理概述

在 Android for Work 的部署中,企業(yè)管理員可以設(shè)置策略來控制員工設(shè)備和應(yīng)用的行為。企業(yè)管理員用企業(yè)移動(dòng)管理(EMM)供應(yīng)商提供的軟件設(shè)置這些策略。EMM 軟件與每一個(gè)設(shè)備上的設(shè)備策略控制器進(jìn)行通訊。設(shè)備策略控制器相應(yīng)地對(duì)每一個(gè)私人設(shè)備上企業(yè)用戶 profile 的設(shè)置和行為進(jìn)行管理。

設(shè)備政策管理器內(nèi)置于設(shè)備管理應(yīng)用現(xiàn)有的模式中,如設(shè)備管理中所說。特別是,你的應(yīng)用需要?jiǎng)?chuàng)建 DeviceAdminReceiver 的子類,如上述文件所說。

Managed profiles

用戶經(jīng)常想在企業(yè)環(huán)境中使用他們的私人設(shè)備。這種情況可能讓企業(yè)陷入困境。如果用戶使用他們的私人設(shè)備,企業(yè)不得不擔(dān)心在這個(gè)不受控制的設(shè)備上的機(jī)密信息(例如員工的電子郵件和通訊錄)。

為了處理這種情況,Android 5.0(API 21)允許企業(yè)使用 managed profile 建立一個(gè)特別的企業(yè)用戶 profile,或是在 Android for Work 計(jì)劃中建立一個(gè)企業(yè) profile。如果設(shè)備有企業(yè) managed profile,該 profile 的設(shè)置是在企業(yè)管理員的控制之下的。管理員可以選擇在這個(gè) profile 之下,什么應(yīng)用程序可以運(yùn)行,什么設(shè)備功能可以允許。

創(chuàng)建 Managed Profile

要在一個(gè)已經(jīng)有了私人 profile 的設(shè)備上創(chuàng)建一個(gè) managed profile,首先得看看該設(shè)備是否支持 FEATURE_MANAGED_USERS 系統(tǒng)特性,才能確定該設(shè)備是否支持 managed profile:

PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) {

    // This device does not support native managed profiles!

}

如果該設(shè)備支持 managed profile,通過發(fā)送一個(gè)帶有 ACTION_PROVISION_MANAGED_PROFILE 行動(dòng)的 intent 來創(chuàng)建一個(gè) managed profile。另外要包括該設(shè)備的管理包名。

Activity provisioningActivity = getActivity();

// You'll need the package name for the WPC app.
String myWPCPackageName = "com.example.myWPCApp";

// Set up the provisioning intent
Intent provisioningIntent =
        new Intent("android.app.action.PROVISION_MANAGED_PROFILE");
intent.putExtra(myWPCPackageName,
        provisioningActivity.getApplicationContext().getPackageName());

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();
}

系統(tǒng)通過以下行為響應(yīng)這個(gè) intent:

  • 驗(yàn)證設(shè)備是被加密的。如果沒有加密,在繼續(xù)操作之前系統(tǒng)會(huì)提示用戶對(duì)設(shè)備進(jìn)行加密。
  • 創(chuàng)建一個(gè) managed profile。
  • 從 managed profile 中移除非必需的應(yīng)用。
  • 復(fù)制設(shè)備策略控制器應(yīng)用到 managed profile 中,并將設(shè)備策略控制器設(shè)置為該 profile 的所有者。

如以下實(shí)例代碼所示,重寫 onActivityResult() 來查看部署是否完成。

@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) {
            // Hurray! Managed profile created and provisioned!
        } else {
            // Boo! Provisioning failed!
        }
        return;

    } else {
        // This is the result of some other activity, call the superclass
        super.onActivityResult(requestCode, resultCode, data);
    }
}

創(chuàng)建 Managed Profile 之后

當(dāng) profile 部署完成,系統(tǒng)調(diào)用設(shè)備策略控制器應(yīng)用的 DeviceAdminReceiver.onProfileProvisioningComplete() 方法。重寫該回調(diào)方法來完成啟用 managed profile。

通常,你的 DeviceAdminReceiver.onProfileProvisioningComplete() 會(huì)執(zhí)行這些任務(wù):

  • 如果設(shè)備使用 Google Play for Work,用 AccountManager.addAccount() 在 managed profile 中添加 Google 賬號(hào),管理員就能往設(shè)備中安裝應(yīng)用了。

一旦你完成了這些任務(wù),調(diào)用設(shè)備策略管理器的 setProfileEnabled() 方法來激活 managed profile:

// 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 managed profile.
myDevicePolicyMgr.setProfileName(componentName, "My New Managed Profile");

// ...and enable the profile
manager.setProfileEnabled(componentName);

建立設(shè)備策略

設(shè)備策略管理器應(yīng)用負(fù)責(zé)實(shí)行企業(yè)的設(shè)備策略。例如,某個(gè)企業(yè)可能需要在輸錯(cuò)一定次數(shù)的設(shè)備密碼后鎖定所有設(shè)備。該控制器應(yīng)用需要 EMM 查出當(dāng)前的策略是什么,然后使用設(shè)備管理 API 來實(shí)行這些策略。

更多關(guān)于如何實(shí)行設(shè)備策略的信息,請(qǐng)查看設(shè)備管理指南。

實(shí)行應(yīng)用限制

企業(yè)環(huán)境可能需要那些批準(zhǔn)的應(yīng)用實(shí)現(xiàn)安全性或功能限制。應(yīng)用開發(fā)人員必須實(shí)現(xiàn)這些限制,并聲明由企業(yè)管理員使用,如實(shí)現(xiàn)應(yīng)用的限制所說。設(shè)備政策管理器接收來自企業(yè)管理員改變的限制,并將這些限制的改變傳送給相關(guān)應(yīng)用。

例如,某個(gè)新聞應(yīng)用有一個(gè)控制應(yīng)用是否允許在蜂窩網(wǎng)絡(luò)下下載視頻的限制設(shè)定。當(dāng) EMM 想要禁用蜂窩下載,它就給控制器應(yīng)用發(fā)送通知。于是控制器應(yīng)用轉(zhuǎn)而通知新聞應(yīng)用限制設(shè)定被改變了。

注意:本文檔涵蓋了設(shè)備策略管理器應(yīng)用如何改變 managed profile 中其他應(yīng)用的限制設(shè)定。關(guān)于設(shè)備策略管理器應(yīng)用如何與 EMM 進(jìn)行通訊的細(xì)節(jié)并不在本文檔的范圍之內(nèi)。

為了改變一個(gè)應(yīng)用的限制,調(diào)用 DevicePolicyManager.setApplicationRestrictions() 方法。該方法需要傳入三個(gè)參數(shù):該控制器應(yīng)用的 DeviceAdminReceiver,限制被改變的應(yīng)用的包名,以及包含了你想要設(shè)置的限制的 Bundle。

例如,假設(shè) managed profile 中有一個(gè)應(yīng)用包名是 "com.example.newsfetcher"。該應(yīng)用有一個(gè)布爾型限制可以被配置,key 是 "downloadByCellular"。如果這個(gè)限制被設(shè)置為 false,該應(yīng)用在蜂窩網(wǎng)絡(luò)下就不能下載數(shù)據(jù),它必須使用 Wi-Fi 網(wǎng)絡(luò)代替。

如果你的設(shè)備策略管理器應(yīng)用需要關(guān)掉蜂窩下載,它首先要取得設(shè)備策略服務(wù)對(duì)象,如上文所說。然后集合一個(gè)限制 bundle 并將該 bundle 傳入 setApplicationRestrictions()

// Fetch the DevicePolicyManager
DevicePolicyManager myDevicePolicyMgr =
        (DevicePolicyManager) thisActivity
                .getSystemService(Context.DEVICE_POLICY_SERVICE);

// Set up the restrictions bundle
bundle restrictionsBundle = new Bundle();
restrictionsBundle.putBoolean("downloadByCellular", false);

// Pass the restrictions to the policy manager. Assume the WPC app
// already has a DeviceAdminReceiver defined (myDeviceAdminReceiver).
myDevicePolicyMgr.setApplicationRestrictions(
        myDeviceAdminReceiver, "com.example.newsfetcher", restrictionsBundle);

注意:該設(shè)備策略服務(wù)將限制改變傳遞給了你所指定的應(yīng)用。然而,實(shí)際是由應(yīng)用來執(zhí)行該限制。例如,在這個(gè)情況中,該應(yīng)用要負(fù)責(zé)禁用它本身的使用蜂窩網(wǎng)絡(luò)下載視頻的功能。設(shè)置限制并不能讓系統(tǒng)強(qiáng)制在應(yīng)用上實(shí)現(xiàn)限制。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)