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