ตั้งค่าการกำหนดค่าที่มีการจัดการ

ถ้าคุณกำลังพัฒนาแอปสำหรับตลาดองค์กร คุณอาจต้อง เพื่อปฏิบัติตามข้อกำหนดเฉพาะที่กำหนดโดยนโยบายขององค์กร การกำหนดค่าที่มีการจัดการ ซึ่งก่อนหน้านี้เรียกว่าการจำกัดแอปพลิเคชัน อนุญาตให้ผู้ดูแลระบบไอทีขององค์กรระบุการตั้งค่าสำหรับ แอป ซึ่งความสามารถนี้มีประโยชน์มากเป็นพิเศษสำหรับโปรแกรมที่องค์กรอนุมัติ แอปที่ทำให้ใช้งานได้กับโปรไฟล์งาน

ตัวอย่างเช่น องค์กรอาจกำหนดให้แอปที่ได้รับอนุมัติต้องอนุญาต สำหรับผู้ดูแลระบบไอที

  • อนุญาตหรือบล็อก URL สำหรับเว็บเบราว์เซอร์
  • กำหนดค่าว่าจะอนุญาตให้แอปซิงค์เนื้อหาผ่านเครือข่ายมือถือหรือไม่ หรือ โดย Wi-Fi
  • กำหนดการตั้งค่าอีเมลของแอป

คู่มือนี้จะแสดงวิธีนำการตั้งค่าการกำหนดค่าที่มีการจัดการไปใช้ใน แอปของคุณ ดูตัวอย่างแอปที่มีการกำหนดค่าที่มีการจัดการได้ที่ ManagedConfigurations หากคุณเป็นนักพัฒนาซอฟต์แวร์ Enterprise Mobility Management (EMM) โปรดดูคู่มือ Android Management API

หมายเหตุ: ด้วยเหตุผลที่ผ่านมา การตั้งค่าการกำหนดค่าเหล่านี้เรียกว่า ข้อจำกัดและนำไปใช้กับไฟล์และชั้นเรียนที่ใช้ฟีเจอร์นี้ คำ (เช่น RestrictionsManager) อย่างไรก็ตาม สามารถใช้ตัวเลือกการกำหนดค่าได้หลากหลาย ไม่ใช่แค่ข้อจำกัดฟังก์ชันการทำงานของแอป

ภาพรวมการกำหนดค่าระยะไกล

แอปจะกำหนดตัวเลือกการกำหนดค่าที่มีการจัดการซึ่งทำจากระยะไกลได้ ที่ผู้ดูแลระบบไอทีตั้งค่าไว้ ซึ่งเป็นการตั้งค่าที่กำหนดเองที่สามารถ เปลี่ยนแปลงโดยผู้ให้บริการกำหนดค่าที่มีการจัดการ หากแอปกำลังทำงานในโปรไฟล์งาน ผู้ดูแลระบบไอทีจะเปลี่ยนการกำหนดค่าที่มีการจัดการของแอปได้

ผู้ให้บริการการกำหนดค่าที่มีการจัดการเป็นอีกแอปหนึ่งที่ทำงานในอุปกรณ์เดียวกัน โดยทั่วไปแอปนี้จะควบคุมโดยผู้ดูแลระบบไอที ผู้ดูแลระบบไอทีจะแจ้งการเปลี่ยนแปลงการกำหนดค่าไปยังอุปกรณ์ที่มีการจัดการ แอปผู้ให้บริการกำหนดค่า และแอปนั้นก็จะเปลี่ยนการกำหนดค่าในแอปของคุณด้วย

หากต้องการระบุการกำหนดค่าที่จัดการจากภายนอก ให้ทำดังนี้

  • ประกาศการกำหนดค่าที่มีการจัดการในไฟล์ Manifest ของแอป กำลังทำ ซึ่งช่วยให้ผู้ดูแลระบบไอทีอ่านไฟล์ กำหนดค่าผ่านทาง Google Play API
  • เมื่อใดก็ตามที่แอปกลับมาทำงานอีกครั้ง ให้ใช้ออบเจ็กต์ RestrictionsManager เพื่อตรวจสอบเหตุการณ์ปัจจุบัน ที่มีการจัดการอยู่แล้ว และเปลี่ยน UI และลักษณะการทำงานของแอปเป็น ให้สอดคล้องกับการกำหนดค่าเหล่านั้น
  • ฟังภาษา Intent ACTION_APPLICATION_RESTRICTIONS_CHANGED เมื่อคุณได้รับข้อมูลนี้ ประกาศ, ตรวจสอบ RestrictionsManager เพื่อดู การกำหนดค่าที่มีการจัดการในปัจจุบันไว้ แล้วทำการเปลี่ยนแปลงที่จำเป็น ลักษณะการทำงานของแอป

กำหนดค่าที่มีการจัดการ

แอปของคุณสามารถรองรับการกำหนดค่าที่มีการจัดการตามที่คุณต้องการ คุณประกาศ การกำหนดค่าที่มีการจัดการของแอปในไฟล์การกำหนดค่าที่มีการจัดการ แล้วประกาศ ไฟล์การกำหนดค่าในไฟล์ Manifest การสร้างไฟล์การกำหนดค่าช่วยให้ แอปอื่นๆ เพื่อตรวจสอบการกำหนดค่าที่มีการจัดการที่แอปของคุณมีให้ พาร์ทเนอร์ EMM สามารถอ่านการกำหนดค่าของแอปโดยใช้ Google Play API

ในการกำหนดตัวเลือกการกำหนดค่าระยะไกลของแอป ให้ใส่องค์ประกอบต่อไปนี้ ในไฟล์ Manifest องค์ประกอบ <application>:

<meta-data android:name="android.content.APP_RESTRICTIONS"
    android:resource="@xml/app_restrictions" />

สร้างไฟล์ชื่อ app_restrictions.xml ในแอป ไดเรกทอรี res/xml โครงสร้างของไฟล์นั้นจะอธิบายไว้ใน ข้อมูลอ้างอิงสำหรับ RestrictionsManager ไฟล์มีแอตทริบิวต์ องค์ประกอบ <restrictions> ระดับบนสุดรายการเดียวซึ่งมี องค์ประกอบย่อย <restriction> 1 รายการสำหรับการกำหนดค่าทั้งหมด ตัวเลือกที่แอปมี

หมายเหตุ: โปรดอย่าสร้างเวอร์ชันแปลของ ไฟล์การกำหนดค่าที่มีการจัดการ แอปของคุณได้รับอนุญาตให้มี ไฟล์การกำหนดค่าที่มีการจัดการเดี่ยวๆ ดังนั้น การกำหนดค่าจะเป็น สอดคล้องกับแอปของคุณในทุกภาษา

ในสภาพแวดล้อมขององค์กร โดยทั่วไป EMM จะใช้ สคีมาการกำหนดค่าเพื่อสร้างคอนโซลระยะไกลสำหรับฝ่ายไอที เพื่อให้ผู้ดูแลระบบกำหนดค่า แอปพลิเคชัน

ผู้ให้บริการการกำหนดค่าที่มีการจัดการจะค้นหาแอปเพื่อดูรายละเอียดได้ การกำหนดค่าที่ใช้ได้ของแอป รวมถึงคำอธิบาย ข้อความ ผู้ให้บริการกำหนดค่าและผู้ดูแลระบบไอทีจะเปลี่ยนแปลงสิ่งต่อไปนี้ได้ กำหนดค่าที่มีการจัดการได้ทุกเมื่อ แม้ว่าแอปจะไม่ได้ทำงานอยู่ก็ตาม

ตัวอย่างเช่น สมมติว่าแอปของคุณสามารถกำหนดค่าจากระยะไกลเพื่ออนุญาตหรือห้าม เพื่อดาวน์โหลดข้อมูลผ่านการเชื่อมต่อเครือข่ายมือถือ แอปของคุณอาจมี องค์ประกอบ <restriction> มีลักษณะดังนี้

<?xml version="1.0" encoding="utf-8"?>
<restrictions xmlns:android="http://schemas.android.com/apk/res/android">

  <restriction
    android:key="downloadOnCellular"
    android:title="@string/download_on_cell_title"
    android:restrictionType="bool"
    android:description="@string/download_on_cell_description"
    android:defaultValue="true" />

</restrictions>

คุณใช้แอตทริบิวต์ android:key ของการกำหนดค่าแต่ละรายการเพื่อ อ่านค่าจากแพ็กเกจการกำหนดค่าที่มีการจัดการ ด้วยเหตุนี้ การกำหนดค่าแต่ละรายการต้องมีสตริงคีย์ที่ไม่ซ้ำกัน และสตริง ไม่สามารถแปลได้ ต้องระบุด้วยสัญพจน์ของสตริง

หมายเหตุ: ในแอปเวอร์ชันที่ใช้งานจริง android:titleและ android:description ควรดึงมาจากแหล่งข้อมูลที่แปลแล้ว ตามที่อธิบายไว้ใน การแปลโดยใช้แหล่งข้อมูล

แอปกำหนดข้อจำกัดโดยใช้ Bundle ภายใน bundle_array เช่น แอปที่มีตัวเลือกการเชื่อมต่อ VPN หลายรายการจะกำหนดเซิร์ฟเวอร์ VPN แต่ละรายการได้ การกำหนดค่าใน bundle ที่มีหลายรายการ Bundle ที่จัดกลุ่มไว้ด้วยกันใน Bundle Array:

<?xml version="1.0" encoding="utf-8"?>
<restrictions xmlns:android="http://schemas.android.com/apk/res/android" >

  <restriction
    android:key="vpn_configuration_list"
    android:restrictionType="bundle_array">
    <restriction
      android:key="vpn_configuration"
      android:restrictionType="bundle">
      <restriction
        android:key="vpn_server"
        android:restrictionType="string"/>
      <restriction
        android:key="vpn_username"
        android:restrictionType="string"/>
      <restriction
        android:key="vpn_password"
        android:restrictionType="string"/>
    </restriction>
  </restriction>

</restrictions>

ประเภทที่รองรับสำหรับองค์ประกอบ android:restrictionType แสดงอยู่ในตาราง 1 และจัดทำเป็นเอกสารใน ข้อมูลอ้างอิงสำหรับ RestrictionsManager และ RestrictionEntry

ตาราง 1 ประเภทรายการข้อจำกัดและการใช้งาน

ประเภท android:restrictionType การใช้งานทั่วไป
TYPE_BOOLEAN "bool" ค่าบูลีนเป็นจริงหรือเท็จ
TYPE_STRING "string" ค่าสตริง เช่น ชื่อ
TYPE_INTEGER "integer" จำนวนเต็มที่มีค่าจาก MIN_VALUE ถึง MAX_VALUE
TYPE_CHOICE "choice" ค่าสตริงที่เลือกจาก android:entryValues มักแสดงเป็นรายการแบบเลือกรายการเดียว
TYPE_MULTI_SELECT "multi-select" อาร์เรย์สตริงที่มีค่าซึ่งเลือกไว้จาก android:entryValues ใช้เพื่อนำเสนอรายการที่เลือกหลายรายการซึ่งมีตัวเลือกมากกว่า 1 รายการ รายการที่เลือกได้ เช่น เพื่อเลือกหนังสือที่เฉพาะเจาะจงลงในรายการที่อนุญาต
TYPE_NULL "hidden" ประเภทข้อจำกัดที่ซ่อนอยู่ ใช้ประเภทนี้สำหรับข้อมูลที่ จะต้องโอนข้าม แต่ไม่ควรนำเสนอต่อ ผู้ใช้ใน UI จัดเก็บค่าสตริงเดียว
TYPE_BUNDLE_ARRAY "bundle_array" ใช้เพื่อจัดเก็บอาร์เรย์ข้อจำกัด bundles พร้อมใช้งานใน Android 6.0 (API ระดับ 23)

หมายเหตุ: android:entryValues เป็นภาษาที่เครื่องอ่านได้และไม่สามารถ แปลแล้ว ใช้ android:entries เพื่อแสดงค่าที่มนุษย์อ่านได้ซึ่งแปลได้ แต่ละรายการต้องมีดัชนีที่เกี่ยวข้องใน android:entryValues

ตรวจสอบการกำหนดค่าที่มีการจัดการ

แอปของคุณไม่ได้รับการแจ้งเตือนโดยอัตโนมัติเมื่อแอปอื่นๆ เปลี่ยนแปลง การตั้งค่าการกำหนดค่าก่อน แต่คุณต้องตรวจสอบสิ่งที่จัดการ คือตอนที่แอปของคุณเริ่มหรือกลับมาทำงานอีกครั้ง และจะคอยตรวจจับ เพื่อดูว่าการกำหนดค่ามีการเปลี่ยนแปลงขณะที่ ที่กำลังทำงาน

หากต้องการดูการตั้งค่าปัจจุบัน แอปของคุณใช้ ออบเจ็กต์ RestrictionsManager รายการ แอปของคุณควร ตรวจสอบการกำหนดค่าที่มีการจัดการในปัจจุบันดังต่อไปนี้

หากต้องการรับออบเจ็กต์ RestrictionsManager ให้ใช้ออบเจ็กต์ปัจจุบัน กับ getActivity() จากนั้น เรียกเมธอด Activity.getSystemService() ของกิจกรรมนั้น:

Kotlin

var myRestrictionsMgr =
        activity?.getSystemService(Context.RESTRICTIONS_SERVICE) as RestrictionsManager

Java

RestrictionsManager myRestrictionsMgr =
    (RestrictionsManager) getActivity()
        .getSystemService(Context.RESTRICTIONS_SERVICE);

เมื่อมี RestrictionsManager คุณจะได้รับ การตั้งค่ากำหนดปัจจุบันโดยการเรียกใช้ เมธอด getApplicationRestrictions():

Kotlin

var appRestrictions: Bundle = myRestrictionsMgr.applicationRestrictions

Java

Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();

หมายเหตุ: คุณยังดึงข้อมูล การกำหนดค่าด้วย UserManager โดยการเรียก UserManager.getApplicationRestrictions() วิธีนี้มีลักษณะเหมือน เท่ากันกับ RestrictionsManager.getApplicationRestrictions()

เมธอด getApplicationRestrictions() ต้องมีการอ่านจากพื้นที่เก็บข้อมูล ควรทำเท่าที่จำเป็น อย่าเรียกใช้วิธีนี้ทุกครั้งที่คุณต้องการ การกำหนดค่าปัจจุบัน แต่ควรเรียกใช้เพียงครั้งเดียวเมื่อแอป เริ่มต้นหรือกลับมาทำงานอีกครั้ง และแคชกลุ่มการกำหนดค่าที่มีการจัดการที่ดึงมา จากนั้นฟัง สำหรับ Intent ACTION_APPLICATION_RESTRICTIONS_CHANGED เพื่อดูว่าการกำหนดค่า เปลี่ยนแปลงไปขณะที่แอปทำงานอยู่ ตามที่อธิบายไว้ใน ฟังการเปลี่ยนแปลงการกำหนดค่าที่มีการจัดการ

การอ่านและการใช้การกำหนดค่าที่มีการจัดการ

เมธอด getApplicationRestrictions() แสดงผล Bundle ที่มีคู่คีย์-ค่าสำหรับการกำหนดค่าแต่ละรายการที่ตั้งไว้ ค่าทั้งหมดเป็นประเภท Boolean, int String และ String[] เมื่อคุณมี การกำหนดค่าที่มีการจัดการ Bundle คุณสามารถตรวจสอบ การตั้งค่าด้วยเมธอด Bundle มาตรฐานสำหรับ ประเภทข้อมูลเหล่านั้น เช่น getBoolean() หรือ getString()

หมายเหตุ: การกำหนดค่าที่มีการจัดการ Bundle มี 1 รายการสำหรับการกำหนดค่าทุกรายการที่ตั้งค่าอย่างชัดแจ้งโดย ผู้ให้บริการการกำหนดค่าที่มีการจัดการ อย่างไรก็ตาม คุณไม่สามารถคาดเดาได้ว่า จะปรากฏในแพ็กเกจเพียงเพราะคุณได้กำหนดค่าเริ่มต้นไว้ ในไฟล์ XML การกำหนดค่าที่มีการจัดการ

แอปของคุณจะดำเนินการอย่างเหมาะสมโดยอิงตามสถานการณ์ การตั้งค่าการกำหนดค่าที่มีการจัดการ เช่น หากแอปของคุณมี ที่ระบุว่าจะสามารถดาวน์โหลดข้อมูลผ่าน การเชื่อมต่อเครือข่ายมือถือ และพบว่ามีการตั้งค่าการกำหนดค่าเป็น false คุณจะต้องปิดใช้การดาวน์โหลดข้อมูล ยกเว้นเมื่อ อุปกรณ์มีการเชื่อมต่อ Wi-Fi ดังที่แสดงในรหัสตัวอย่างต่อไปนี้

Kotlin

val appCanUseCellular: Boolean =
        if (appRestrictions.containsKey("downloadOnCellular")) {
            appRestrictions.getBoolean("downloadOnCellular")
        } else {
            // cellularDefault is a boolean using the restriction's default value
            cellularDefault
        }

if (!appCanUseCellular) {
    // ...turn off app's cellular-download functionality
    // ...show appropriate notices to user
}

Java

boolean appCanUseCellular;

if (appRestrictions.containsKey("downloadOnCellular")) {
    appCanUseCellular = appRestrictions.getBoolean("downloadOnCellular");
} else {
    // cellularDefault is a boolean using the restriction's default value
    appCanUseCellular = cellularDefault;
}

if (!appCanUseCellular) {
    // ...turn off app's cellular-download functionality
    // ...show appropriate notices to user
}

หากต้องการใช้ข้อจำกัดที่ซ้อนกันหลายรายการ โปรดอ่าน bundle_array รายการการจำกัดเป็นคอลเล็กชันของออบเจ็กต์ Parcelable รายการ และแคสต์เป็น Bundle ในตัวอย่างนี้ การกำหนดค่าของ VPN แต่ละรายการ ข้อมูลจะถูกแยกวิเคราะห์และใช้เพื่อสร้างรายการตัวเลือกการเชื่อมต่อเซิร์ฟเวอร์ ดังนี้

Kotlin

// VpnConfig is a sample class used store config data, not defined
val vpnConfigs = mutableListOf<VpnConfig>()

val parcelables: Array<out Parcelable>? =
        appRestrictions.getParcelableArray("vpn_configuration_list")

if (parcelables?.isNotEmpty() == true) {
    // iterate parcelables and cast as bundle
    parcelables.map { it as Bundle }.forEach { vpnConfigBundle ->
        // parse bundle data and store in VpnConfig array
        vpnConfigs.add(VpnConfig()
                .setServer(vpnConfigBundle.getString("vpn_server"))
                .setUsername(vpnConfigBundle.getString("vpn_username"))
                .setPassword(vpnConfigBundle.getString("vpn_password")))
    }
}

if (vpnConfigs.isNotEmpty()) {
    // ...choose a VPN configuration or prompt user to select from list
}

Java

// VpnConfig is a sample class used store config data, not defined
List<VpnConfig> vpnConfigs = new ArrayList<>();

Parcelable[] parcelables =
    appRestrictions.getParcelableArray("vpn_configuration_list");

if (parcelables != null && parcelables.length > 0) {
    // iterate parcelables and cast as bundle
    for (int i = 0; i < parcelables.length; i++) {
        Bundle vpnConfigBundle = (Bundle) parcelables[i];
        // parse bundle data and store in VpnConfig array
        vpnConfigs.add(new VpnConfig()
            .setServer(vpnConfigBundle.getString("vpn_server"))
            .setUsername(vpnConfigBundle.getString("vpn_username"))
            .setPassword(vpnConfigBundle.getString("vpn_password")));
    }
}

if (!vpnConfigs.isEmpty()) {
    // ...choose a VPN configuration or prompt user to select from list
}

ฟังการเปลี่ยนแปลงการกำหนดค่าที่มีการจัดการ

เมื่อใดก็ตามที่มีการเปลี่ยนแปลงการกำหนดค่าที่มีการจัดการของแอป ระบบจะเริ่มทำงาน Intent ACTION_APPLICATION_RESTRICTIONS_CHANGED แอปของคุณต้องคอยฟัง Intent นี้เพื่อให้คุณสามารถเปลี่ยนลักษณะการทำงานของแอปเมื่อตั้งค่าการกำหนดค่า เปลี่ยน

หมายเหตุ: ระบบจะส่ง Intent ACTION_APPLICATION_RESTRICTIONS_CHANGED ไปยังผู้ฟังเท่านั้น ที่ลงทะเบียนแบบไดนามิก ไม่ได้กับผู้ฟังที่ประกาศไว้ ในไฟล์ Manifest ของแอป

โค้ดต่อไปนี้แสดงวิธีลงทะเบียน Broadcast Receiver แบบไดนามิกสำหรับ ความตั้งใจนี้:

Kotlin

val restrictionsFilter = IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED)

val restrictionsReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {

        // Get the current configuration bundle
        val appRestrictions = myRestrictionsMgr.applicationRestrictions

        // Check current configuration settings, change your app's UI and
        // functionality as necessary.
    }
}

registerReceiver(restrictionsReceiver, restrictionsFilter)

Java

IntentFilter restrictionsFilter =
    new IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED);

BroadcastReceiver restrictionsReceiver = new BroadcastReceiver() {
  @Override public void onReceive(Context context, Intent intent) {

    // Get the current configuration bundle
    Bundle appRestrictions = myRestrictionsMgr.getApplicationRestrictions();

    // Check current configuration settings, change your app's UI and
    // functionality as necessary.
  }
};

registerReceiver(restrictionsReceiver, restrictionsFilter);

หมายเหตุ: โดยปกติแล้ว แอปของคุณไม่จำเป็นต้องได้รับแจ้ง เกี่ยวกับการเปลี่ยนแปลงการกําหนดค่าเมื่อหยุดชั่วคราว คุณควรยกเลิกการลงทะเบียนแทน Broadcast Receiver เมื่อแอปหยุดชั่วคราว เมื่อแอปกลับมาทำงานอีกครั้ง คุณจะ ตรวจสอบการกำหนดค่าที่มีการจัดการในปัจจุบันก่อน (ตามที่ได้อธิบายไว้ ตรวจสอบการกำหนดค่าที่มีการจัดการ) จากนั้นจึงลงทะเบียน Broadcast Receiver เพื่อให้แน่ใจว่าคุณจะได้รับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงการกำหนดค่า ที่เกิดขึ้นขณะที่แอปทำงานอยู่

ส่งความคิดเห็นเกี่ยวกับการกำหนดค่าที่มีการจัดการไปยัง EMM

หลังจากใช้การเปลี่ยนแปลงการกำหนดค่าที่มีการจัดการกับแอปแล้ว คุณควรแจ้งให้ EMM ทราบ สถานะของการเปลี่ยนแปลง Android รองรับฟีเจอร์ที่เรียกว่าสถานะแอปที่ผูกกับ ซึ่งคุณดำเนินการต่อไปนี้ได้ ใช้เพื่อส่งความคิดเห็นทุกครั้งที่แอปพยายามใช้การเปลี่ยนแปลงการกำหนดค่าที่มีการจัดการ ช่วงเวลานี้ ความคิดเห็นสามารถทำหน้าที่เป็นการยืนยันว่าแอปของคุณกำหนดค่าที่มีการจัดการสำเร็จ หรือ ใส่ข้อความแสดงข้อผิดพลาดหากแอปของคุณนำการเปลี่ยนแปลงที่ระบุไปใช้ไม่สำเร็จ

ผู้ให้บริการ EMM สามารถดึงความคิดเห็นนี้และแสดงในคอนโซลสำหรับฝ่ายไอทีของตน ผู้ดูแลระบบสำหรับดู โปรดดูข้อมูลเพิ่มเติมที่ส่งความคิดเห็นเกี่ยวกับแอปไปยัง EMM ข้อมูลเกี่ยวกับหัวข้อนั้น รวมถึงคำแนะนำโดยละเอียดเกี่ยวกับวิธีเพิ่มการสนับสนุนการแสดงความคิดเห็นลงในแอปของคุณ

ตัวอย่างโค้ดเพิ่มเติม

ManagedConfigurations ตัวอย่างเพิ่มเติมสาธิตการใช้ API ที่กล่าวถึงในหน้านี้