การเลิกใช้งานผู้ดูแลระบบอุปกรณ์ ตั้งแต่ Android 9 (API ระดับ 28) เป็นต้นไป ระบบจะทำเครื่องหมายนโยบายผู้ดูแลระบบบางรายการว่าเลิกใช้งานแล้วเมื่อผู้ดูแลระบบอุปกรณ์เรียกใช้ เราขอแนะนำให้คุณเริ่มเตรียมตัวตั้งแต่ตอนนี้สำหรับการเปลี่ยนแปลงนี้ หากต้องการดูข้อมูลเพิ่มเติมและดูตัวเลือกการย้ายข้อมูล โปรดอ่านการเลิกใช้งานผู้ดูแลระบบอุปกรณ์
Android รองรับแอปสำหรับองค์กรโดยมอบ API การดูแลระบบของอุปกรณ์ Android Device Administration API ให้อุปกรณ์ ฟีเจอร์การดูแลระบบในระดับระบบ API เหล่านี้ช่วยให้คุณสร้างแอปที่คำนึงถึงความปลอดภัยซึ่งมีประโยชน์ในองค์กร ซึ่งผู้เชี่ยวชาญด้านไอทีจำเป็นต้องมีการควบคุมอุปกรณ์ของพนักงานอย่างละเอียด ตัวอย่างเช่น แอปอีเมล Android ในตัวได้ใช้ประโยชน์จาก API เหล่านี้เพื่อปรับปรุงการรองรับ Exchange ผู้ดูแลระบบ Exchange สามารถบังคับใช้นโยบายรหัสผ่าน ซึ่งรวมถึงรหัสผ่านที่เป็นตัวอักษรและตัวเลขคละกันหรือ PIN ที่เป็นตัวเลข ได้จากแอปอีเมลในอุปกรณ์ต่างๆ นอกจากนี้ ผู้ดูแลระบบยังล้างข้อมูลในโทรศัพท์มือถือที่สูญหายหรือถูกขโมยจากระยะไกลได้ด้วย (นั่นคือ กู้คืนค่าเริ่มต้น) ผู้ใช้ Exchange จะซิงค์ข้อมูลอีเมลและปฏิทินได้
เอกสารนี้มีไว้สําหรับนักพัฒนาแอปที่ต้องการพัฒนาโซลูชันสําหรับองค์กรสําหรับอุปกรณ์ที่ทำงานด้วยระบบ Android ซึ่งจะอธิบายฟีเจอร์ต่างๆ ที่ Device Administration API มีให้เพื่อรักษาความปลอดภัยให้อุปกรณ์ของพนักงานที่ใช้ Android ได้ดีขึ้น
หมายเหตุสำหรับข้อมูลเกี่ยวกับการสร้างนโยบายงาน การทำให้ Controller สำหรับการทำให้ Android for Work ใช้งานได้ โปรดดู สร้างเครื่องมือควบคุมนโยบายด้านอุปกรณ์
โหมดเจ้าของอุปกรณ์แบบไม่มีส่วนหัว
Android 14 (API ระดับ 34) เปิดตัวโหมดผู้ใช้ระบบแบบไม่มีส่วนหัว (อุปกรณ์ที่UserManager.isHeadlessSystemUserMode
แสดงผล true
) ในโหมดผู้ใช้ระบบแบบไม่มีส่วนหัว ผู้ใช้ระบบจะเป็นผู้ใช้เบื้องหลังและอาศัยผู้ใช้เบื้องหน้าเพิ่มเติมสำหรับการโต้ตอบกับผู้ใช้ปลายทาง Android 14 ยังเปิดตัว
โหมดที่เชื่อมโยงของเจ้าของอุปกรณ์ส่วนหัว
ซึ่งจะเพิ่มเจ้าของโปรไฟล์ให้กับ
ผู้ใช้แอฟฟิลิเอต
นอกเหนือจากผู้ใช้ระบบที่มีการตั้งค่าเจ้าของอุปกรณ์ไว้
ในอุปกรณ์ที่กำหนดค่าสำหรับผู้ใช้ระบบแบบไม่มีส่วนหัว (ซึ่งผู้ใช้ระบบ
ทำงานในเบื้องหลัง) เฉพาะนโยบายด้านอุปกรณ์ที่ครอบคลุมทั้งหมด
(นโยบายที่บังคับใช้กับผู้ใช้ทุกคน) จะมีผลกับผู้ใช้เบื้องหน้า
หรือผู้ใช้ ดูรายละเอียดได้ที่ addUserRestriction
ผู้ผลิตอุปกรณ์ Android อาจอ้างอิง คำแนะนำ เผยแพร่ใน source.android.com
ภาพรวมของ Device Administration API
ต่อไปนี้คือตัวอย่างประเภทแอปที่อาจใช้ Device Administration API
- โปรแกรมรับส่งอีเมล
- แอปความปลอดภัยที่ล้างข้อมูลจากระยะไกล
- บริการและแอปการจัดการอุปกรณ์
หลักการทำงาน
คุณใช้ Device Administration API เพื่อเขียนแอปผู้ดูแลระบบอุปกรณ์ที่ผู้ใช้จะติดตั้งในอุปกรณ์ แอปผู้ดูแลระบบอุปกรณ์จะบังคับใช้นโยบายที่ต้องการ วิธีการมีดังนี้
- ผู้ดูแลระบบเขียนแอปผู้ดูแลระบบอุปกรณ์ที่จะบังคับใช้ นโยบายความปลอดภัยของอุปกรณ์จากระยะไกล/ท้องถิ่น นโยบายเหล่านี้อาจถูกฮาร์ดโค้ดเป็น หรือแอปสามารถดึงข้อมูลนโยบายจากบุคคลที่สามแบบไดนามิก เซิร์ฟเวอร์
- แอปได้รับการติดตั้งในอุปกรณ์ของผู้ใช้ ปัจจุบัน Android ยังไม่มีโซลูชันการจัดสรรอัตโนมัติ ตัวอย่างสิ่งที่ผู้ดูแลระบบอาจทำได้
เผยแพร่แอปแก่ผู้ใช้ได้ดังนี้
- Google Play
- กำลังเปิดใช้การติดตั้งจาก Store อื่น
- การเผยแพร่แอปผ่านช่องทางอื่นๆ เช่น อีเมลหรือเว็บไซต์
- ระบบจะแจ้งให้ผู้ใช้เปิดใช้แอปผู้ดูแลระบบอุปกรณ์ อย่างไร ซึ่งขึ้นอยู่กับวิธีการนำแอปไปใช้
- เมื่อผู้ใช้เปิดใช้แอปผู้ดูแลระบบอุปกรณ์แล้ว ผู้ใช้จะต้องใช้งาน นโยบายของตน การปฏิบัติตามนโยบายเหล่านั้นมักจะให้ผลประโยชน์ต่างๆ เช่น สิทธิ์เข้าถึงระบบและข้อมูลที่ละเอียดอ่อน
หากผู้ใช้ไม่ได้เปิดใช้แอปผู้ดูแลระบบของอุปกรณ์ แอปจะยังคงอยู่ในอุปกรณ์แต่อยู่ในสถานะไม่ทำงาน ผู้ใช้จะไม่อยู่ภายใต้นโยบายของแอปและจะไม่ได้รับผลประโยชน์ใดๆ ของแอป เช่น ผู้ใช้อาจซิงค์ข้อมูลไม่ได้
หากผู้ใช้ไม่ปฏิบัติตามนโยบาย (เช่น ผู้ใช้ตั้งรหัสผ่านที่ละเมิดหลักเกณฑ์) ทางแอปจะเป็นผู้ตัดสินใจว่าจะจัดการเรื่องนี้อย่างไร อย่างไรก็ตาม โดยทั่วไปแล้ว การดำเนินการนี้จะส่งผลให้ผู้ใช้ซิงค์ข้อมูลไม่ได้
หากอุปกรณ์พยายามเชื่อมต่อกับเซิร์ฟเวอร์ที่ต้องใช้นโยบายที่ Device Administration API ไม่รองรับ ระบบจะไม่อนุญาตให้เชื่อมต่อ ขณะนี้ API การดูแลระบบของอุปกรณ์ไม่อนุญาต การจัดสรร กล่าวคือ หากอุปกรณ์ (เช่น อุปกรณ์เดิม) มี ไม่สนับสนุนนโยบายที่ระบุไว้ทั้งหมด จะไม่มีทางอนุญาตให้ อุปกรณ์เพื่อเชื่อมต่อ
หากอุปกรณ์มีแอปผู้ดูแลระบบที่เปิดใช้หลายแอป ระบบจะใช้นโยบายที่เข้มงวดที่สุด คุณไม่สามารถกําหนดเป้าหมายแอปผู้ดูแลระบบที่เฉพาะเจาะจงได้
หากต้องการถอนการติดตั้งแอปผู้ดูแลระบบอุปกรณ์ที่มีอยู่ ผู้ใช้ต้อง ก่อนอื่นให้ยกเลิกการลงทะเบียนแอปนี้ในฐานะผู้ดูแลระบบ
นโยบาย
ในองค์กร อุปกรณ์ของพนักงานมักจะต้องปฏิบัติตามชุดนโยบายที่เข้มงวดซึ่งควบคุมการใช้อุปกรณ์ Device Administration API รองรับนโยบายที่ระบุไว้ในตารางที่ 1 โปรดทราบว่าขณะนี้ Device Administration API รองรับเฉพาะรหัสผ่านสำหรับหน้าจอเท่านั้น ล็อก:
ตาราง 1 นโยบายที่ Device Administration API รองรับ
นโยบาย | คำอธิบาย |
---|---|
เปิดใช้รหัสผ่านแล้ว | อุปกรณ์ต้องขอ PIN หรือรหัสผ่าน |
ความยาวขั้นต่ำของรหัสผ่าน | กำหนดจำนวนอักขระที่ต้องใช้สำหรับรหัสผ่าน ตัวอย่างเช่น คุณสามารถ อาจกำหนดให้ PIN หรือรหัสผ่านมีอย่างน้อย 6 อักขระ |
ต้องระบุรหัสผ่านตัวอักษรและตัวเลขคละกัน | กําหนดให้รหัสผ่านมีทั้งตัวอักษรและตัวเลข โดยอาจมีอักขระที่เป็นสัญลักษณ์ |
ต้องใช้รหัสผ่านที่ซับซ้อน | กําหนดให้รหัสผ่านต้องมีตัวอักษร ตัวเลข และสัญลักษณ์พิเศษอย่างน้อย 1 ตัว เปิดตัวใน Android 3.0 |
จำนวนตัวอักษรขั้นต่ำในรหัสผ่าน | จำนวนตัวอักษรขั้นต่ำในรหัสผ่านสำหรับผู้ดูแลระบบทุกคนหรือผู้ดูแลระบบที่เฉพาะเจาะจง เปิดตัวใน Android 3.0 |
ต้องมีอักษรตัวพิมพ์เล็กขั้นต่ำในรหัสผ่าน | จำนวนอักษรตัวพิมพ์เล็กขั้นต่ำในรหัสผ่านสำหรับผู้ดูแลระบบทุกคนหรือผู้ดูแลระบบที่เฉพาะเจาะจง เปิดตัวใน Android 3.0 |
จำนวนอักขระที่ไม่ใช่ตัวอักษรขั้นต่ำในรหัสผ่าน | จำนวนขั้นต่ำของ อักขระที่ไม่ใช่ตัวอักษรที่ต้องมีในรหัสผ่านสำหรับผู้ดูแลระบบทั้งหมดหรือเฉพาะบางรายการ เปิดตัวใน Android 3.0 |
จำนวนตัวเลขขั้นต่ำในรหัสผ่าน | จำนวนตัวเลขขั้นต่ำในรหัสผ่านสำหรับผู้ดูแลระบบทุกคนหรือผู้ดูแลระบบบางราย เปิดตัวใน Android 3.0 |
จำนวนสัญลักษณ์ขั้นต่ำที่ต้องมีในรหัสผ่าน | จำนวนสัญลักษณ์ขั้นต่ำที่ต้องมีในรหัสผ่านของผู้ดูแลระบบทุกคนหรือสัญลักษณ์ที่ระบุ เปิดตัวใน Android 3.0 |
จำนวนตัวพิมพ์ใหญ่ขั้นต่ำในรหัสผ่าน | จำนวนตัวอักษรตัวพิมพ์ใหญ่ขั้นต่ำในรหัสผ่านสำหรับผู้ดูแลระบบทุกคนหรือผู้ดูแลระบบบางราย เปิดตัวใน Android 3.0 |
ระยะหมดเวลาของรหัสผ่านหมดอายุ | เวลาที่รหัสผ่านจะหมดอายุ ซึ่งแสดงเป็นเดลต้าในหน่วยมิลลิวินาทีจากกรณีที่ผู้ดูแลระบบอุปกรณ์ตั้งค่าระยะหมดเวลาการหมดอายุ เปิดตัวใน Android 3.0 |
การจำกัดประวัติรหัสผ่าน | นโยบายนี้จะป้องกันไม่ให้ผู้ใช้ใช้รหัสผ่านที่ไม่ซ้ำกัน n รายการล่าสุดซ้ำ
โดยทั่วไปนโยบายนี้จะใช้ร่วมกับ
setPasswordExpirationTimeout() ซึ่งบังคับให้
ผู้ใช้ต้องอัปเดตรหัสผ่านหลังจากพ้นระยะเวลาที่ระบุไว้
เปิดตัวใน Android 3.0 |
จํานวนครั้งที่ป้อนรหัสผ่านไม่ถูกต้องสูงสุด | ระบุจํานวนครั้งที่ผู้ใช้สามารถป้อนรหัสผ่านผิดก่อน อุปกรณ์จะล้างข้อมูลออก Device Administration API ยังช่วยให้ผู้ดูแลระบบรีเซ็ตอุปกรณ์เป็นค่าเริ่มต้นจากระยะไกลได้ด้วย ซึ่งจะช่วยรักษาความปลอดภัยให้กับข้อมูลในกรณีที่ อุปกรณ์สูญหายหรือถูกขโมย |
การล็อกเวลาที่ไม่ได้ใช้งานสูงสุด | ตั้งระยะเวลานับตั้งแต่ที่ผู้ใช้แตะหน้าจอครั้งล่าสุดหรือ กดปุ่มก่อนที่อุปกรณ์จะล็อกหน้าจอ ในกรณีนี้ ผู้ใช้ ต้องป้อน PIN หรือรหัสผ่านอีกครั้งก่อนจึงจะใช้อุปกรณ์ได้และ เข้าถึงข้อมูลของคุณ ค่าเป็นได้ระหว่าง 1 ถึง 60 นาที |
กำหนดให้ใช้การเข้ารหัสพื้นที่เก็บข้อมูล | ระบุว่าควรเข้ารหัสพื้นที่เก็บข้อมูล หากอุปกรณ์รองรับ เปิดตัวใน Android 3.0 |
ปิดใช้กล้อง | ระบุว่าควรปิดใช้กล้อง โปรดทราบว่าการปิดใช้นี้ไม่จำเป็นต้องเป็นการปิดใช้ถาวร กล้องสามารถเปิด/ปิดได้แบบไดนามิกโดยอิงตามบริบท เวลา และอื่นๆ เปิดตัวใน Android 4.0 |
ฟีเจอร์อื่นๆ
นอกเหนือจากการสนับสนุนนโยบายที่ระบุในตารางข้างต้นแล้ว อุปกรณ์ API การดูแลระบบช่วยให้คุณสามารถทำสิ่งต่อไปนี้
- แจ้งให้ผู้ใช้ตั้งรหัสผ่านใหม่
- ล็อกอุปกรณ์ทันที
- ล้างข้อมูลของอุปกรณ์ (เช่น คืนค่าอุปกรณ์เป็นค่าเริ่มต้น)
แอปตัวอย่าง
ตัวอย่างที่ใช้ในหน้านี้อิงตามตัวอย่าง Device Administration API ซึ่งรวมอยู่ในตัวอย่าง SDK (มีให้ใช้งานผ่าน Android SDK Manager) และอยู่ในระบบของคุณเป็น <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java
ตัวอย่างแอปมีการสาธิตฟีเจอร์สำหรับผู้ดูแลระบบอุปกรณ์ โดยแสดงอินเทอร์เฟซผู้ใช้ที่ช่วยให้ผู้ใช้เปิดใช้แอปผู้ดูแลระบบของอุปกรณ์ได้ เมื่อเปิดใช้แอปแล้ว ผู้ใช้จะใช้ปุ่มในอินเทอร์เฟซผู้ใช้เพื่อดำเนินการต่อไปนี้ได้
- ตั้งค่าคุณภาพของรหัสผ่าน
- ระบุข้อกำหนดสำหรับรหัสผ่านของผู้ใช้ เช่น ความยาวขั้นต่ำ จำนวนขั้นต่ำ ตัวเลขที่ต้องมี และอื่นๆ
- ตั้งรหัสผ่าน ถ้ารหัสผ่านไม่เป็นไปตามที่ระบุ ระบบจะแสดงข้อผิดพลาด
- กำหนดจำนวนครั้งที่สามารถป้อนรหัสผ่านผิดได้ก่อนที่จะล้างข้อมูลอุปกรณ์ (ซึ่งก็คือการคืนค่าเป็นการตั้งค่าเริ่มต้น)
- กำหนดระยะเวลาที่รหัสผ่านจะหมดอายุ
- กำหนดความยาวของประวัติรหัสผ่าน (length หมายถึงจำนวนรหัสผ่านเก่าที่จัดเก็บไว้ในประวัติ) วิธีนี้จะช่วยป้องกันไม่ให้ผู้ใช้นำกลับมาใช้ รหัสผ่าน n รายการล่าสุดที่ผู้ใช้ใช้ก่อนหน้านี้
- ระบุว่าพื้นที่เก็บข้อมูลควรเข้ารหัสไว้ หากอุปกรณ์รองรับ
- กำหนดระยะเวลาสูงสุดของการไม่ใช้งานที่อาจผ่านไปก่อนอุปกรณ์ ล็อก
- ทำให้อุปกรณ์ล็อกทันที
- ล้างข้อมูลของอุปกรณ์ (นั่นคือคืนค่าการตั้งค่าเริ่มต้น)
- ปิดใช้กล้อง

รูปที่ 1 ภาพหน้าจอของตัวอย่างแอป
การพัฒนาแอปการดูแลระบบอุปกรณ์
ผู้ดูแลระบบสามารถใช้ Device Administration API เพื่อเขียนแอปที่บังคับใช้นโยบายความปลอดภัยของอุปกรณ์ระยะไกล/ในเครื่อง ส่วนนี้ สรุปขั้นตอนที่เกี่ยวข้องในการสร้างการดูแลระบบอุปกรณ์ แอป
การสร้างไฟล์ Manifest
หากต้องการใช้ Device Administration API ไฟล์ Manifest ของแอปต้องมีข้อมูลต่อไปนี้
- คลาสย่อยของ
DeviceAdminReceiver
ที่มีข้อมูลต่อไปนี้- สิทธิ์
BIND_DEVICE_ADMIN
- ความสามารถในการตอบสนองต่อ Intent
ACTION_DEVICE_ADMIN_ENABLED
ที่แสดงในไฟล์ Manifest เป็นตัวกรอง Intent
- สิทธิ์
- การประกาศนโยบายความปลอดภัยที่ใช้ในข้อมูลเมตา
นี่คือข้อความที่ตัดตอนมาจากไฟล์ Manifest ตัวอย่างการดูแลระบบอุปกรณ์
<activity android:name=".app.DeviceAdminSample" android:label="@string/activity_sample_device_admin"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.SAMPLE_CODE" /> </intent-filter> </activity> <receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver" android:label="@string/sample_device_admin" android:description="@string/sample_device_admin_description" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_sample" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver>
โปรดทราบว่า
- แอตทริบิวต์ต่อไปนี้หมายถึงทรัพยากรสตริงที่สำหรับแอปตัวอย่างอยู่ใน
ApiDemos/res/values/strings.xml
ดูข้อมูลเพิ่มเติมเกี่ยวกับแหล่งข้อมูลได้ที่แหล่งข้อมูลแอปพลิเคชันandroid:label="@string/activity_sample_device_admin"
หมายถึงป้ายกำกับที่ผู้ใช้อ่านได้สําหรับกิจกรรมandroid:label="@string/sample_device_admin"
หมายถึง ป้ายกำกับที่ผู้ใช้อ่านได้สำหรับสิทธิ์android:description="@string/sample_device_admin_description"
อ้างถึง คำอธิบายสิทธิ์ที่ผู้ใช้อ่านได้ คำอธิบายมักจะยาวและยาวขึ้น ให้ข้อมูลมากกว่า ป้ายกำกับ
android:permission="android.permission.BIND_DEVICE_ADMIN"
เป็นสิทธิ์ที่คลาสย่อยDeviceAdminReceiver
ต้อง เพื่อให้แน่ใจว่ามีเพียงระบบเท่านั้นที่โต้ตอบกับผู้รับได้ (ไม่มีแอปใดได้รับสิทธิ์นี้) ซึ่งจะช่วยป้องกันไม่ให้แอปอื่นๆ ละเมิดแอปผู้ดูแลระบบอุปกรณ์android.app.action.DEVICE_ADMIN_ENABLED
คือการดำเนินการหลักที่คลาสย่อยDeviceAdminReceiver
ต้องจัดการเพื่อให้ได้รับอนุญาตให้จัดการอุปกรณ์ การตั้งค่านี้จะกำหนดเป็นอุปกรณ์รับเมื่อผู้ใช้เปิดใช้แอปผู้ดูแลระบบอุปกรณ์ โดยปกติแล้วโค้ดของคุณจะจัดการเรื่องนี้ในonEnabled()
เพื่อให้ได้การรองรับ ผู้รับต้อง ต้องมีสิทธิ์BIND_DEVICE_ADMIN
เพื่อให้แอปอื่นๆ ไม่ละเมิด- เมื่อผู้ใช้เปิดใช้แอปผู้ดูแลระบบของอุปกรณ์ จะเป็นการให้สิทธิ์ผู้รับดำเนินการเพื่อตอบสนองต่อการออกอากาศเหตุการณ์บางอย่างของระบบ แอปอาจกำหนดนโยบายได้ เมื่อมีเหตุการณ์ที่เหมาะสม ตัวอย่างเช่น หากผู้ใช้พยายามตั้งรหัสผ่านใหม่ที่ไม่เป็นไปตามข้อกำหนดของนโยบาย แอปสามารถแจ้งให้ผู้ใช้เลือกรหัสผ่านอื่นที่เป็นไปตามข้อกำหนด
- หลีกเลี่ยงการเปลี่ยนชื่อผู้รับหลังจากเผยแพร่แอป หากชื่อในไฟล์ Manifest เปลี่ยนแปลง ผู้ดูแลระบบอุปกรณ์จะปิดใช้เมื่อผู้ใช้อัปเดตแอป ดูข้อมูลเพิ่มเติมได้ที่
<receiver>
android:resource="@xml/device_admin_sample"
ประกาศนโยบายความปลอดภัยที่ใช้ในข้อมูลเมตา ข้อมูลเมตาจะให้ข้อมูลเพิ่มเติม ข้อมูลเฉพาะสำหรับผู้ดูแลระบบอุปกรณ์ ตามที่แยกวิเคราะห์โดยคลาสDeviceAdminInfo
เนื้อหาของdevice_admin_sample.xml
:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <limit-password /> <watch-login /> <reset-password /> <force-lock /> <wipe-data /> <expire-password /> <encrypted-storage /> <disable-camera /> </uses-policies> </device-admin>
เมื่อออกแบบแอปการดูแลระบบอุปกรณ์ คุณไม่จำเป็นต้อง ระบุนโยบายทั้งหมด เฉพาะนโยบายที่เกี่ยวข้องกับแอปของคุณ
ดูการพูดคุยเพิ่มเติมเกี่ยวกับไฟล์ Manifest ได้ที่คู่มือนักพัฒนาแอป Androidการใช้โค้ด
Device Administration API ประกอบด้วยคลาสต่อไปนี้
DeviceAdminReceiver
- คลาสพื้นฐานสําหรับการใช้คอมโพเนนต์การดูแลระบบอุปกรณ์ ชั้นเรียนนี้มี
ความสะดวกในการตีความการดำเนินการผ่าน Intent ที่ส่งโดย
ระบบ แอปการดูแลระบบอุปกรณ์ของคุณต้องมี
คลาสย่อย
DeviceAdminReceiver
DevicePolicyManager
- คลาสสำหรับจัดการนโยบายที่บังคับใช้ในอุปกรณ์ ไคลเอ็นต์ส่วนใหญ่ของคลาสนี้ต้องเผยแพร่
DeviceAdminReceiver
ที่ผู้ใช้เปิดใช้อยู่ในปัจจุบันDevicePolicyManager
จัดการนโยบายสำหรับ อินสแตนซ์DeviceAdminReceiver
อย่างน้อย 1 รายการ DeviceAdminInfo
- คลาสนี้ใช้เพื่อระบุข้อมูลเมตา สำหรับคอมโพเนนต์ผู้ดูแลระบบอุปกรณ์
คลาสเหล่านี้เป็นรากฐานสําหรับแอปการดูแลระบบอุปกรณ์ที่ทํางานได้อย่างเต็มรูปแบบ ส่วนที่เหลือของส่วนนี้จะอธิบายวิธีใช้ DeviceAdminReceiver
และ DevicePolicyManager
API ในการเขียนแอปการดูแลระบบอุปกรณ์
การสร้างคลาสย่อยของ DeviceAdminReceiver
หากต้องการสร้างแอปผู้ดูแลระบบอุปกรณ์ คุณต้องสร้างคลาสย่อยของ
DeviceAdminReceiver
คลาส DeviceAdminReceiver
ประกอบด้วยชุดการเรียกกลับที่ทริกเกอร์เมื่อเกิดเหตุการณ์หนึ่งๆ
ในคลาสย่อย DeviceAdminReceiver
แอปตัวอย่าง
แสดงการแจ้งเตือน Toast
เพื่อตอบสนองต่อ
กิจกรรม เช่น
class DeviceAdminSample : DeviceAdminReceiver() { private fun showToast(context: Context, msg: String) { context.getString(R.string.admin_receiver_status, msg).let { status -> Toast.makeText(context, status, Toast.LENGTH_SHORT).show() } } override fun onEnabled(context: Context, intent: Intent) = showToast(context, context.getString(R.string.admin_receiver_status_enabled)) override fun onDisableRequested(context: Context, intent: Intent): CharSequence = context.getString(R.string.admin_receiver_status_disable_warning) override fun onDisabled(context: Context, intent: Intent) = showToast(context, context.getString(R.string.admin_receiver_status_disabled)) override fun onPasswordChanged(context: Context, intent: Intent, userHandle: UserHandle) = showToast(context, context.getString(R.string.admin_receiver_status_pw_changed)) ... }
public class DeviceAdminSample extends DeviceAdminReceiver { void showToast(Context context, String msg) { String status = context.getString(R.string.admin_receiver_status, msg); Toast.makeText(context, status, Toast.LENGTH_SHORT).show(); } @Override public void onEnabled(Context context, Intent intent) { showToast(context, context.getString(R.string.admin_receiver_status_enabled)); } @Override public CharSequence onDisableRequested(Context context, Intent intent) { return context.getString(R.string.admin_receiver_status_disable_warning); } @Override public void onDisabled(Context context, Intent intent) { showToast(context, context.getString(R.string.admin_receiver_status_disabled)); } @Override public void onPasswordChanged(Context context, Intent intent, UserHandle userHandle) { showToast(context, context.getString(R.string.admin_receiver_status_pw_changed)); } ... }
การเปิดใช้แอป
เหตุการณ์สำคัญอย่างหนึ่งที่แอปผู้ดูแลระบบอุปกรณ์ต้องจัดการคือการเปิดใช้แอปโดยผู้ใช้ ผู้ใช้ต้องเปิดใช้แอปอย่างชัดเจนเพื่อให้บังคับใช้นโยบายได้ หากผู้ใช้เลือกที่จะไม่เปิดใช้แอป ข้อมูลจะยังคงอยู่ในอุปกรณ์ แต่จะไม่บังคับใช้นโยบาย และผู้ใช้จะไม่ ใช้ข้อดีของแอปก็ได้
กระบวนการเปิดใช้แอปจะเริ่มเมื่อผู้ใช้ดำเนินการ
การดำเนินการที่ทริกเกอร์ ACTION_ADD_DEVICE_ADMIN
Intent ในตัวอย่างแอป เหตุการณ์นี้จะเกิดขึ้นเมื่อผู้ใช้คลิกช่องทําเครื่องหมายเปิดใช้ผู้ดูแลระบบ
เมื่อผู้ใช้คลิกช่องทำเครื่องหมายเปิดใช้ผู้ดูแลระบบ การแสดงผลจะเปลี่ยนไปเพื่อแจ้งให้ผู้ใช้เปิดใช้งานแอปผู้ดูแลระบบของอุปกรณ์ ดังที่แสดงในรูปภาพ 2

รูปที่ 2 แอปตัวอย่าง: การเปิดใช้งานแอป
ด้านล่างนี้เป็นโค้ดที่จะเริ่มทำงานเมื่อผู้ใช้คลิกช่องทำเครื่องหมายเปิดใช้ผู้ดูแลระบบ สิ่งนี้มีผลต่อการทริกเกอร์
onPreferenceChange()
Callback จะมีการเรียกใช้ Callback นี้เมื่อผู้ใช้เปลี่ยนแปลงค่าของ Preference
นี้ และกำลังจะมีการตั้งค่าและ/หรือคงอยู่ หากผู้ใช้เปิดใช้แอป การแสดงผลจะเปลี่ยนไปเพื่อแจ้งให้ผู้ใช้เปิดใช้งานแอปผู้ดูแลระบบในอุปกรณ์ ดังที่แสดงในรูปภาพ 2 มิเช่นนั้น ระบบจะปิดใช้แอปผู้ดูแลระบบอุปกรณ์
override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { if (super.onPreferenceChange(preference, newValue)) return true val value = newValue as Boolean if (preference == enableCheckbox) { if (value != adminActive) { if (value) { // Launch the activity to have the user enable our admin. val intent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).apply { putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample) putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, activity.getString(R.string.add_admin_extra_app_text)) } startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN) // return false - don't update checkbox until we're really active return false } else { dpm.removeActiveAdmin(deviceAdminSample) enableDeviceCapabilitiesArea(false) adminActive = false } } } else if (preference == disableCameraCheckbox) { dpm.setCameraDisabled(deviceAdminSample, value) } return true }
@Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (super.onPreferenceChange(preference, newValue)) { return true; } boolean value = (Boolean) newValue; if (preference == enableCheckbox) { if (value != adminActive) { if (value) { // Launch the activity to have the user enable our admin. Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, activity.getString(R.string.add_admin_extra_app_text)); startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN); // return false - don't update checkbox until we're really active return false; } else { dpm.removeActiveAdmin(deviceAdminSample); enableDeviceCapabilitiesArea(false); adminActive = false; } } } else if (preference == disableCameraCheckbox) { dpm.setCameraDisabled(deviceAdminSample, value); } return true; }
บรรทัด intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
mDeviceAdminSample)
ระบุว่า mDeviceAdminSample
(ซึ่งเป็นคอมโพเนนต์ DeviceAdminReceiver
) เป็นนโยบายเป้าหมาย
บรรทัดนี้จะเรียกใช้อินเทอร์เฟซผู้ใช้ที่แสดงในรูปที่ 2 ซึ่งแนะนำผู้ใช้
กำลังเพิ่มผู้ดูแลระบบอุปกรณ์ลงในระบบ (หรืออนุญาตให้ปฏิเสธ)
เมื่อแอปต้องดำเนินการที่ขึ้นอยู่กับการเปิดใช้แอปผู้ดูแลระบบอุปกรณ์ แอปจะยืนยันว่าแอปทำงานอยู่ ซึ่งทำได้โดยใช้เมธอด DevicePolicyManager
isAdminActive()
โปรดสังเกตว่าDevicePolicyManager
เมธอด isAdminActive()
จะใช้ DeviceAdminReceiver
เป็นอาร์กิวเมนต์
private lateinit var dpm: DevicePolicyManager ... private fun isActiveAdmin(): Boolean = dpm.isAdminActive(deviceAdminSample)
DevicePolicyManager dpm; ... private boolean isActiveAdmin() { return dpm.isAdminActive(deviceAdminSample); }
การจัดการนโยบาย
DevicePolicyManager
เป็นชั้นเรียนสาธารณะสำหรับจัดการนโยบาย
มีการบังคับใช้ในอุปกรณ์ DevicePolicyManager
จัดการนโยบายสําหรับอินสแตนซ์ DeviceAdminReceiver
อย่างน้อย 1 รายการ
คุณจะได้รับแฮนเดิลของ DevicePolicyManager
ดังนี้
dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
DevicePolicyManager dpm = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
ส่วนนี้จะอธิบายวิธีใช้ DevicePolicyManager
เพื่อดำเนินการ
งานด้านการดูแลระบบ
ตั้งค่านโยบายรหัสผ่าน
DevicePolicyManager
มี API สำหรับการตั้งค่าและบังคับใช้
นโยบายรหัสผ่านของอุปกรณ์ ใน Device Administration API รหัสผ่านจะใช้กับ
ล็อกหน้าจอ ส่วนนี้จะอธิบายงานทั่วไปที่เกี่ยวข้องกับรหัสผ่าน
ตั้งรหัสผ่านสำหรับอุปกรณ์
โค้ดนี้จะแสดงอินเทอร์เฟซผู้ใช้ที่แจ้งให้ผู้ใช้ตั้งรหัสผ่าน
Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent -> startActivity(intent) }
Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); startActivity(intent);
ตั้งค่าคุณภาพของรหัสผ่าน
คุณภาพของรหัสผ่านเป็นค่าคงที่ DevicePolicyManager
ค่าใดค่าหนึ่งต่อไปนี้ได้:
PASSWORD_QUALITY_ALPHABETIC
- ผู้ใช้ต้องป้อน รหัสผ่านที่มีตัวอักษรอย่างน้อยที่สุด ตัวอักษร (หรือสัญลักษณ์อื่น)
PASSWORD_QUALITY_ALPHANUMERIC
- ผู้ใช้ต้องป้อนรหัสผ่านที่มีอักขระทั้งตัวเลขและตัวอักษร (หรือสัญลักษณ์อื่นๆ) อย่างน้อย 8 ตัว
PASSWORD_QUALITY_NUMERIC
- ผู้ใช้ต้องป้อนรหัสผ่านที่มีอักขระที่เป็นตัวเลขอย่างน้อย 1 ตัว
PASSWORD_QUALITY_COMPLEX
- ผู้ใช้ ต้องป้อนรหัสผ่านที่มีตัวอักษร ตัวเลข และตัวเลขอย่างน้อย 1 ตัว สัญลักษณ์พิเศษ
PASSWORD_QUALITY_SOMETHING
- นโยบายกำหนดให้ต้องมีรหัสผ่าน แต่ไม่ได้กำหนดว่าต้องเป็นรหัสผ่านประเภทใด
PASSWORD_QUALITY_UNSPECIFIED
- นโยบายไม่มีข้อกำหนดสำหรับรหัสผ่าน
ตัวอย่างวิธีตั้งค่านโยบายรหัสผ่านให้กำหนดให้ใช้รหัสผ่านที่เป็นตัวอักษรและตัวเลขคละกันมีดังนี้
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
ตั้งค่าข้อกำหนดด้านเนื้อหาของรหัสผ่าน
เริ่มต้นด้วย Android 3.0 คลาส DevicePolicyManager
มีวิธีที่ช่วยให้คุณปรับแต่งเนื้อหาของรหัสผ่านอย่างละเอียดได้ สำหรับ
เช่น คุณอาจตั้งค่านโยบายที่ระบุว่ารหัสผ่านต้องมีอย่างน้อย
n ตัวพิมพ์ใหญ่ วิธีปรับแต่งเนื้อหาของรหัสผ่านมีดังนี้
setPasswordMinimumLetters()
setPasswordMinimumLowerCase()
setPasswordMinimumUpperCase()
setPasswordMinimumNonLetter()
setPasswordMinimumNumeric()
setPasswordMinimumSymbols()
ตัวอย่างเช่น ข้อมูลโค้ดนี้ระบุว่ารหัสผ่านต้องมีตัวอักษรพิมพ์ใหญ่อย่างน้อย 2 ตัว
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwMinUppercase = 2 ... dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase)
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwMinUppercase = 2; ... dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase);
ตั้งค่าความยาวขั้นต่ำของรหัสผ่าน
คุณระบุได้ว่ารหัสผ่านจะต้องมีค่าขั้นต่ำตามที่ระบุเป็นอย่างน้อย เช่น
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwLength: Int = ... ... dpm.setPasswordMinimumLength(deviceAdminSample, pwLength)
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwLength; ... dpm.setPasswordMinimumLength(deviceAdminSample, pwLength);
กำหนดจำนวนครั้งสูงสุดในการป้อนรหัสผ่านผิด
คุณสามารถกำหนดจำนวนครั้งที่ป้อนรหัสผ่านผิดพลาดได้สูงสุดก่อนที่จะล้างข้อมูลอุปกรณ์ (นั่นคือรีเซ็ตเป็นการตั้งค่าเริ่มต้น) เช่น
val dPM:DevicePolicyManager private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val maxFailedPw: Int = ... ... dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw)
DevicePolicyManager dpm; ComponentName deviceAdminSample; int maxFailedPw; ... dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw);
ตั้งค่าระยะหมดเวลาของรหัสผ่าน
เริ่มตั้งแต่ Android 3.0 เป็นต้นไป คุณสามารถใช้
setPasswordExpirationTimeout()
วิธีการตั้งค่าเมื่อรหัสผ่านจะหมดอายุ ซึ่งแสดงเป็นเดลต้าเป็นมิลลิวินาทีเมื่อผู้ดูแลระบบอุปกรณ์ตั้งค่าระยะหมดเวลาหมดอายุ เช่น
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwExpiration: Long = ... ... dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration)
DevicePolicyManager dpm; ComponentName deviceAdminSample; long pwExpiration; ... dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration);
จำกัดรหัสผ่านตามประวัติ
ตั้งแต่ Android 3.0 เป็นต้นไป คุณจะใช้วิธีนี้เพื่อจำกัดไม่ให้ผู้ใช้ใช้รหัสผ่านเดิมซ้ำได้ เมธอดนี้ใช้พารามิเตอร์ความยาว ซึ่งระบุจำนวนรหัสผ่านเก่าที่จัดเก็บไว้ เมื่อนโยบายนี้มีผลใช้งาน ผู้ใช้จะป้อนรหัสผ่านใหม่ซึ่งตรงกับรหัสผ่าน n รายการล่าสุดไม่ได้ วิธีนี้จะช่วย
ไม่ให้ใช้รหัสผ่านเดียวกันซ้ำแล้วซ้ำเล่า โดยทั่วไปจะใช้นโยบายนี้
ทำร่วมกับ
setPasswordExpirationTimeout()
ซึ่งบังคับให้ผู้ใช้
เพื่ออัปเดตรหัสผ่านหลังจากผ่านไประยะหนึ่งแล้ว
ตัวอย่างเช่น ข้อมูลโค้ดนี้ห้ามไม่ให้ผู้ใช้นำรหัสผ่าน 5 รายการล่าสุดมาใช้ซ้ำ
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwHistoryLength = 5 ... dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength)
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwHistoryLength = 5; ... dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength);
ตั้งค่าการล็อกอุปกรณ์
คุณสามารถตั้งค่าระยะเวลาสูงสุดที่ผู้ใช้ไม่ใช้งานก่อนที่จะล็อกอุปกรณ์ได้ เช่น
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val timeMs: Long = 1000L * timeout.text.toString().toLong() ... dpm.setMaximumTimeToLock(deviceAdminSample, timeMs)
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... long timeMs = 1000L*Long.parseLong(timeout.getText().toString()); dpm.setMaximumTimeToLock(deviceAdminSample, timeMs);
นอกจากนี้ คุณยังบอกให้อุปกรณ์ล็อกทันทีแบบเป็นโปรแกรมได้ด้วย โดยทำดังนี้
private lateinit var dpm: DevicePolicyManager dpm.lockNow()
DevicePolicyManager dpm; dpm.lockNow();
ล้างข้อมูล
คุณใช้เมธอด DevicePolicyManager
ได้
wipeData()
เพื่อรีเซ็ตอุปกรณ์เป็นการตั้งค่าเริ่มต้น ซึ่งจะมีประโยชน์ในกรณีที่อุปกรณ์สูญหายหรือถูกขโมย บ่อยครั้งที่การล้างข้อมูลอุปกรณ์เป็นผลมาจากการที่เงื่อนไขบางอย่างตรงตาม ตัวอย่างเช่น คุณสามารถใช้ setMaximumFailedPasswordsForWipe()
เพื่อระบุว่าควรล้างข้อมูลในอุปกรณ์หลังจากป้อนรหัสผ่านไม่สำเร็จตามจำนวนครั้งที่กำหนด
คุณล้างข้อมูลได้โดยทำดังนี้
private lateinit var dpm: DevicePolicyManager dpm.wipeData(0)
DevicePolicyManager dpm; dpm.wipeData(0);
เมธอด wipeData()
จะใช้เป็น
มาสก์ตัวเลือกเพิ่มเติมเล็กน้อย ค่าปัจจุบันต้องเป็น 0
ปิดใช้กล้อง
คุณปิดใช้กล้องได้ตั้งแต่ Android 4.0 เป็นต้นไป โปรดทราบว่าการปิดใช้นี้ไม่จำเป็นต้องเป็นการปิดใช้ถาวร กล้องสามารถเปิด/ปิดได้แบบไดนามิกตามบริบท เวลา และอื่นๆ
คุณควบคุมว่าจะปิดใช้กล้องหรือไม่โดยใช้วิธี
setCameraDisabled()
ตัวอย่างเช่น ข้อมูลโค้ดนี้จะตั้งค่าให้กล้องเปิดหรือปิดใช้ตามการตั้งค่าช่องทําเครื่องหมาย
private lateinit var disableCameraCheckbox: CheckBoxPreference private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)
private CheckBoxPreference disableCameraCheckbox; DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked());
การเข้ารหัสพื้นที่เก็บข้อมูล
เริ่มตั้งแต่ Android 3.0 เป็นต้นไป คุณสามารถใช้
setStorageEncryption()
เพื่อกำหนดนโยบายที่ต้องมีการเข้ารหัสของพื้นที่เก็บข้อมูล (ที่รองรับ)
เช่น
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setStorageEncryption(deviceAdminSample, true)
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setStorageEncryption(deviceAdminSample, true);
ดูตัวอย่าง Device Administration API เพื่อดูตัวอย่างวิธีเปิดใช้การเข้ารหัสพื้นที่เก็บข้อมูลอย่างละเอียด
ตัวอย่างโค้ดเพิ่มเติม
ตัวอย่าง Android AppRestrictionEnforcer และ DeviceOwner แสดงการใช้ API ที่ครอบคลุมในหน้านี้เพิ่มเติม