การเลิกใช้งานผู้ดูแลระบบอุปกรณ์ เริ่มต้นด้วย 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
ภาพรวมของ API การดูแลระบบอุปกรณ์
ต่อไปนี้คือตัวอย่างประเภทแอปที่อาจใช้ Device Administration API
- โปรแกรมรับส่งอีเมล
- แอปความปลอดภัยที่ล้างข้อมูลจากระยะไกล
- บริการและแอปการจัดการอุปกรณ์
หลักการทำงาน
คุณใช้ Device Administration API เพื่อเขียนแอปผู้ดูแลระบบอุปกรณ์ที่ผู้ใช้ ติดตั้งลงบนอุปกรณ์ของตน แอปผู้ดูแลระบบอุปกรณ์บังคับใช้ วิธีการมีดังนี้
- ผู้ดูแลระบบเขียนแอปผู้ดูแลระบบอุปกรณ์ที่จะบังคับใช้ นโยบายความปลอดภัยของอุปกรณ์จากระยะไกล/ท้องถิ่น นโยบายเหล่านี้อาจถูกฮาร์ดโค้ด หรือแอปสามารถดึงข้อมูลนโยบายจากบุคคลที่สามแบบไดนามิก เซิร์ฟเวอร์
- แอปได้รับการติดตั้งอยู่ในของผู้ใช้ อุปกรณ์ Android ไม่
ยังไม่มีโซลูชันการจัดสรรอัตโนมัติ ตัวอย่างสิ่งที่ผู้ดูแลระบบอาจทำได้
เผยแพร่แอปแก่ผู้ใช้ได้ดังนี้
- Google Play
- กำลังเปิดใช้การติดตั้งจาก Store อื่น
- การจัดจำหน่ายแอปผ่านช่องทางอื่นๆ เช่น อีเมลหรือเว็บไซต์
- ระบบจะแจ้งให้ผู้ใช้เปิดใช้แอปผู้ดูแลระบบอุปกรณ์ อย่างไร ซึ่งขึ้นอยู่กับวิธีการนำแอปไปใช้
- เมื่อผู้ใช้เปิดใช้แอปผู้ดูแลระบบอุปกรณ์แล้ว ผู้ใช้จะต้องใช้งาน นโยบายของตน การปฏิบัติตามนโยบายเหล่านั้นมักจะให้ผลประโยชน์ต่างๆ เช่น สิทธิ์เข้าถึงระบบและข้อมูลที่ละเอียดอ่อน
หากผู้ใช้ไม่เปิดใช้แอปผู้ดูแลระบบ แอปจะยังคงอยู่ในอุปกรณ์แต่จะอยู่ในสถานะไม่ใช้งาน ผู้ใช้ไม่จำเป็นต้องปฏิบัติตามนโยบายของแอปและจะไม่ได้รับผลประโยชน์ใดๆ ของแอป เช่น ผู้ใช้อาจซิงค์ข้อมูลไม่ได้
หากผู้ใช้ไม่ปฏิบัติตามนโยบาย (เช่น หากผู้ใช้ตั้งค่า ที่ละเมิดหลักเกณฑ์) ก็ขึ้นอยู่กับแอปที่จะตัดสินใจว่า วิธีจัดการกับเรื่องนี้ อย่างไรก็ตาม โดยทั่วไปการดำเนินการนี้จะทำให้ ซิงค์ข้อมูลได้
หากอุปกรณ์พยายามเชื่อมต่อกับเซิร์ฟเวอร์ที่ไม่ต้องการนโยบาย ใน Device Administration API การเชื่อมต่อจะไม่ ได้รับอนุญาต ขณะนี้ API การดูแลระบบอุปกรณ์ไม่อนุญาต การจัดสรร กล่าวคือ หากอุปกรณ์ (เช่น อุปกรณ์เดิม) มี ไม่สนับสนุนนโยบายที่ระบุไว้ทั้งหมด จะไม่มีทางอนุญาตให้ อุปกรณ์เพื่อเชื่อมต่อ
หากอุปกรณ์มีแอปผู้ดูแลระบบที่เปิดใช้หลายแอป นโยบายที่เข้มงวดที่สุดคือ มีการบังคับใช้แล้ว ไม่มีวิธีกำหนดเป้าหมายผู้ดูแลระบบคนใดคนหนึ่งโดยเฉพาะ แอป
หากต้องการถอนการติดตั้งแอปผู้ดูแลระบบอุปกรณ์ที่มีอยู่ ผู้ใช้ต้อง ก่อนอื่นให้ยกเลิกการลงทะเบียนแอปนี้ในฐานะผู้ดูแลระบบ
นโยบาย
ในการตั้งค่าขององค์กร อุปกรณ์ของพนักงานมักจะต้อง ปฏิบัติตามชุดนโยบายที่ควบคุมการใช้งานอุปกรณ์อย่างเคร่งครัด Device Administration API รองรับนโยบายที่ระบุไว้ในตาราง 1 โปรดทราบว่าขณะนี้ Device Administration API รองรับเฉพาะรหัสผ่านสำหรับหน้าจอเท่านั้น ล็อก:
นโยบาย | คำอธิบาย |
---|---|
เปิดใช้รหัสผ่านแล้ว | อุปกรณ์ต้องขอ PIN หรือรหัสผ่าน |
ความยาวขั้นต่ำของรหัสผ่าน | กำหนดจำนวนอักขระที่ต้องใช้สำหรับรหัสผ่าน ตัวอย่างเช่น คุณสามารถ อาจกำหนดให้ PIN หรือรหัสผ่านมีอย่างน้อย 6 อักขระ |
ต้องมีรหัสผ่านตัวอักษรและตัวเลขคละกัน | รหัสผ่านต้องมี ตัวอักษรและตัวเลขผสมกัน โดยอาจมีอักขระที่เป็นสัญลักษณ์ |
ต้องมีรหัสผ่านที่ซับซ้อน | รหัสผ่านต้องมีอย่างน้อยตัวอักษร ตัวเลข และสัญลักษณ์พิเศษ เปิดตัวใน 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 การดูแลระบบช่วยให้คุณสามารถทำสิ่งต่อไปนี้
- แจ้งให้ผู้ใช้ตั้งรหัสผ่านใหม่
- ล็อกอุปกรณ์ทันที
- ล้างข้อมูลของอุปกรณ์ (เช่น คืนค่าอุปกรณ์เป็นค่าเริ่มต้น)
แอปตัวอย่าง
ตัวอย่างที่ใช้ในหน้านี้อิงตาม API การดูแลระบบอุปกรณ์
ตัวอย่าง ซึ่งรวมอยู่ในตัวอย่าง SDK (มีให้บริการผ่าน
Android SDK Manager) และอยู่ในระบบเป็น
<sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java
ตัวอย่างแอปมีการสาธิตฟีเจอร์สำหรับผู้ดูแลระบบอุปกรณ์ นำเสนอให้ผู้ใช้เห็น ด้วยอินเทอร์เฟซผู้ใช้ที่ช่วยให้สามารถเปิดใช้แอปผู้ดูแลระบบอุปกรณ์ได้ ครั้งเดียว ที่เปิดใช้แอป ผู้ใช้จะสามารถใช้ปุ่มต่างๆ ในอินเทอร์เฟซผู้ใช้ ทำสิ่งต่อไปนี้ได้
- ตั้งค่าคุณภาพของรหัสผ่าน
- ระบุข้อกำหนดสำหรับรหัสผ่านของผู้ใช้ เช่น ความยาวขั้นต่ำ จำนวนขั้นต่ำ ตัวเลขที่ต้องมี และอื่นๆ
- ตั้งรหัสผ่าน ถ้ารหัสผ่านไม่เป็นไปตามที่ระบุ ระบบจะแสดงข้อผิดพลาด
- กำหนดจำนวนครั้งที่สามารถป้อนรหัสผ่านผิดได้ก่อนที่จะล้างข้อมูลอุปกรณ์ (ซึ่งก็คือการคืนค่าเป็นการตั้งค่าเริ่มต้น)
- กำหนดระยะเวลาที่รหัสผ่านจะหมดอายุ
- กำหนดความยาวของประวัติรหัสผ่าน (length หมายถึงจำนวนรหัสผ่านเก่าที่จัดเก็บไว้ในประวัติ) วิธีนี้จะช่วยป้องกันไม่ให้ผู้ใช้นำกลับมาใช้ รหัสผ่าน n รายการล่าสุดที่ผู้ใช้ใช้ก่อนหน้านี้
- ระบุว่าพื้นที่เก็บข้อมูลควรเข้ารหัสไว้ หากอุปกรณ์รองรับ
- กำหนดระยะเวลาสูงสุดของการไม่ใช้งานที่อาจผ่านไปก่อนอุปกรณ์ ล็อก
- ทำให้อุปกรณ์ล็อกทันที
- ล้างข้อมูลของอุปกรณ์ (ซึ่งก็คือการคืนค่าการตั้งค่าเริ่มต้น)
- ปิดใช้กล้อง
การพัฒนาแอปการดูแลระบบอุปกรณ์
ผู้ดูแลระบบสามารถใช้ Device Administration API เพื่อเขียนแอปได้ ที่บังคับใช้การบังคับใช้นโยบายความปลอดภัยของอุปกรณ์จากระยะไกล/ในเครื่อง ส่วนนี้ สรุปขั้นตอนที่เกี่ยวข้องในการสร้างการดูแลระบบอุปกรณ์ แอป
การสร้างไฟล์ Manifest
ในการใช้ Device Administration API แอปพลิเคชัน ไฟล์ Manifest ต้องมีข้อมูลต่อไปนี้
- คลาสย่อยของ
DeviceAdminReceiver
ที่มีข้อมูลต่อไปนี้- สิทธิ์
BIND_DEVICE_ADMIN
- สามารถตอบสนองต่อ
ACTION_DEVICE_ADMIN_ENABLED
Intent ที่แสดงในไฟล์ 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
ประกอบด้วยชุด Callback ที่ทริกเกอร์เมื่อเหตุการณ์หนึ่งๆ
เกิดขึ้น
ในคลาสย่อย DeviceAdminReceiver
แอปตัวอย่าง
แสดงการแจ้งเตือน Toast
เพื่อตอบสนองต่อ
กิจกรรม เช่น
Kotlin
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)) ... }
Java
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.
ด้านล่างนี้เป็นโค้ดที่จะเริ่มทำงานเมื่อผู้ใช้คลิกช่องทำเครื่องหมายเปิดใช้ผู้ดูแลระบบ สิ่งนี้มีผลต่อการทริกเกอร์
onPreferenceChange()
Callback จะมีการเรียกใช้ Callback นี้เมื่อผู้ใช้เปลี่ยนแปลงค่าของ Preference
นี้ และกำลังจะมีการตั้งค่าและ/หรือคงอยู่ หากผู้ใช้เปิดใช้แอป หน้าจอ
การเปลี่ยนแปลงเพื่อแจ้งให้ผู้ใช้เปิดใช้งานแอปผู้ดูแลระบบอุปกรณ์ ดังที่แสดงในรูป
2. มิฉะนั้น แอปผู้ดูแลระบบอุปกรณ์จะถูกปิดใช้งาน
Kotlin
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 }
Java
@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
เป็นอาร์กิวเมนต์
Kotlin
private lateinit var dpm: DevicePolicyManager ... private fun isActiveAdmin(): Boolean = dpm.isAdminActive(deviceAdminSample)
Java
DevicePolicyManager dpm; ... private boolean isActiveAdmin() { return dpm.isAdminActive(deviceAdminSample); }
การจัดการนโยบาย
DevicePolicyManager
เป็นชั้นเรียนสาธารณะสำหรับจัดการนโยบาย
มีการบังคับใช้ในอุปกรณ์ DevicePolicyManager
จัดการนโยบายสำหรับ 1 ราย
อินสแตนซ์ DeviceAdminReceiver
หรือมากกว่า
คุณมีแฮนเดิลของ DevicePolicyManager
ดังนี้
Kotlin
dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
Java
DevicePolicyManager dpm = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
ส่วนนี้จะอธิบายวิธีใช้ DevicePolicyManager
เพื่อดำเนินการ
งานด้านการดูแลระบบ
ตั้งค่านโยบายรหัสผ่าน
DevicePolicyManager
มี API สำหรับการตั้งค่าและบังคับใช้
นโยบายรหัสผ่านของอุปกรณ์ ใน Device Administration API รหัสผ่านจะใช้กับ
ล็อกหน้าจอ ส่วนนี้จะอธิบายงานทั่วไปที่เกี่ยวข้องกับรหัสผ่าน
ตั้งรหัสผ่านสำหรับอุปกรณ์
โค้ดนี้จะแสดงอินเทอร์เฟซผู้ใช้ที่แจ้งให้ผู้ใช้ตั้งรหัสผ่าน
Kotlin
Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent -> startActivity(intent) }
Java
Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); startActivity(intent);
ตั้งค่าคุณภาพของรหัสผ่าน
คุณภาพของรหัสผ่านเป็นค่าคงที่ DevicePolicyManager
ค่าใดค่าหนึ่งต่อไปนี้ได้:
PASSWORD_QUALITY_ALPHABETIC
- ผู้ใช้ต้องป้อน รหัสผ่านที่มีตัวอักษรอย่างน้อยที่สุด ตัวอักษร (หรือสัญลักษณ์อื่น)
PASSWORD_QUALITY_ALPHANUMERIC
- ผู้ใช้ต้องป้อน ที่มีตัวอักษรอย่างน้อยทั้งตัวเลขและตัวอักษร (หรือ อื่นๆ)
PASSWORD_QUALITY_NUMERIC
- ผู้ใช้ต้องป้อนรหัสผ่าน ที่มีอักขระอย่างน้อย 1 ตัว
PASSWORD_QUALITY_COMPLEX
- ผู้ใช้ ต้องป้อนรหัสผ่านที่มีตัวอักษร ตัวเลข และตัวเลขอย่างน้อย 1 ตัว สัญลักษณ์พิเศษ
PASSWORD_QUALITY_SOMETHING
- นโยบายต้องการบางอย่าง แต่ไม่สนใจว่ามันคืออะไร
PASSWORD_QUALITY_UNSPECIFIED
- นโยบายนี้ไม่มีข้อกำหนดสำหรับรหัสผ่าน
ตัวอย่างวิธีตั้งค่านโยบายรหัสผ่านให้กำหนดให้ใช้รหัสผ่านที่เป็นตัวอักษรและตัวเลขคละกันมีดังนี้
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
ตั้งค่าข้อกำหนดด้านเนื้อหาของรหัสผ่าน
เริ่มต้นด้วย Android 3.0 คลาส DevicePolicyManager
มีวิธีที่ช่วยให้คุณปรับแต่งเนื้อหาของรหัสผ่านอย่างละเอียดได้ สำหรับ
เช่น คุณอาจกำหนดนโยบายว่ารหัสผ่านต้องมีอย่างน้อย
n ตัวพิมพ์ใหญ่ ต่อไปนี้เป็นวิธีปรับแต่งรหัสผ่าน
เนื้อหา:
setPasswordMinimumLetters()
setPasswordMinimumLowerCase()
setPasswordMinimumUpperCase()
setPasswordMinimumNonLetter()
setPasswordMinimumNumeric()
setPasswordMinimumSymbols()
ตัวอย่างเช่น ข้อมูลโค้ดนี้ระบุว่ารหัสผ่านต้องมีอักษรตัวพิมพ์ใหญ่อย่างน้อย 2 ตัว
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwMinUppercase = 2 ... dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwMinUppercase = 2; ... dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase);
กำหนดความยาวขั้นต่ำของรหัสผ่าน
คุณระบุได้ว่ารหัสผ่านจะต้องมีค่าขั้นต่ำตามที่ระบุเป็นอย่างน้อย เช่น
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwLength: Int = ... ... dpm.setPasswordMinimumLength(deviceAdminSample, pwLength)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwLength; ... dpm.setPasswordMinimumLength(deviceAdminSample, pwLength);
กำหนดจำนวนครั้งสูงสุดในการป้อนรหัสผ่านผิด
คุณสามารถกำหนดจำนวนครั้งสูงสุดที่อนุญาตของการป้อนรหัสผ่านผิดได้ก่อน อุปกรณ์จะถูกล้างข้อมูล (ซึ่งก็คือ รีเซ็ตเป็นการตั้งค่าเริ่มต้น) เช่น
Kotlin
val dPM:DevicePolicyManager private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val maxFailedPw: Int = ... ... dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; int maxFailedPw; ... dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw);
ตั้งค่าระยะหมดเวลาหมดอายุของรหัสผ่าน
สำหรับ Android 3.0 เป็นต้นไป คุณสามารถใช้
setPasswordExpirationTimeout()
วิธีการตั้งค่าเมื่อรหัสผ่านจะหมดอายุ ซึ่งแสดงเป็นเดลต้าเป็นมิลลิวินาทีเมื่อผู้ดูแลระบบอุปกรณ์ตั้งค่าระยะหมดเวลาหมดอายุ เช่น
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwExpiration: Long = ... ... dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; long pwExpiration; ... dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration);
จำกัดรหัสผ่านตามประวัติ
สำหรับ Android 3.0 เป็นต้นไป คุณสามารถใช้
setPasswordHistoryLength()
เพื่อจำกัดผู้ใช้
สามารถนำรหัสผ่านเดิมกลับมาใช้ใหม่ได้ เมธอดนี้ใช้ length
ซึ่งระบุจำนวนไซต์
รหัสผ่านจะถูกบันทึกไว้ เมื่อนโยบายนี้มีผลบังคับใช้ ผู้ใช้จะป้อน
รหัสผ่านที่ตรงกับรหัสผ่าน n สุดท้าย วิธีนี้จะช่วย
ไม่ให้ใช้รหัสผ่านเดียวกันซ้ำแล้วซ้ำอีก โดยทั่วไปจะใช้นโยบายนี้
ทำร่วมกับ
setPasswordExpirationTimeout()
,
ซึ่งบังคับให้ผู้ใช้
เพื่ออัปเดตรหัสผ่านหลังจากผ่านไประยะหนึ่งแล้ว
ตัวอย่างเช่น ข้อมูลโค้ดนี้ห้ามไม่ให้ผู้ใช้นำรหัสผ่าน 5 รายการล่าสุดมาใช้ซ้ำ
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwHistoryLength = 5 ... dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwHistoryLength = 5; ... dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength);
ตั้งค่าการล็อกอุปกรณ์
คุณสามารถตั้งค่าระยะเวลาสูงสุดที่ผู้ใช้ไม่มีการใช้งาน ซึ่งอาจเกิดขึ้นก่อน การล็อกอุปกรณ์ เช่น
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val timeMs: Long = 1000L * timeout.text.toString().toLong() ... dpm.setMaximumTimeToLock(deviceAdminSample, timeMs)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... long timeMs = 1000L*Long.parseLong(timeout.getText().toString()); dpm.setMaximumTimeToLock(deviceAdminSample, timeMs);
นอกจากนี้ คุณยังบอกให้อุปกรณ์ล็อกทันทีโดยใช้โปรแกรมได้โดยทำดังนี้
Kotlin
private lateinit var dpm: DevicePolicyManager dpm.lockNow()
Java
DevicePolicyManager dpm; dpm.lockNow();
ล้างข้อมูล
คุณใช้เมธอด DevicePolicyManager
ได้
wipeData()
เพื่อรีเซ็ตอุปกรณ์เป็นการตั้งค่าเริ่มต้น มีประโยชน์
หากอุปกรณ์สูญหายหรือถูกขโมย บ่อยครั้งที่การตัดสินใจว่าจะล้างข้อมูลอุปกรณ์คือ
ของการทำตามเงื่อนไขบางอย่าง ตัวอย่างเช่น คุณสามารถใช้
setMaximumFailedPasswordsForWipe()
เพื่อระบุว่าอุปกรณ์ควร
ล้างข้อมูลหลังจากที่ป้อนรหัสผ่านไม่ถูกต้องตามจำนวนครั้งที่กำหนด
คุณล้างข้อมูลดังนี้
Kotlin
private lateinit var dpm: DevicePolicyManager dpm.wipeData(0)
Java
DevicePolicyManager dpm; dpm.wipeData(0);
เมธอด wipeData()
จะใช้เป็น
มาสก์ตัวเลือกเพิ่มเติมเล็กน้อย ค่าปัจจุบันต้องเป็น 0
ปิดใช้กล้อง
เริ่มตั้งแต่ Android 4.0 เป็นต้นไป คุณสามารถปิดกล้องถ่ายรูปได้ โปรดทราบว่าการดำเนินการนี้ไม่จำเป็นต้องเป็นการปิดใช้งานถาวร คุณสามารถเปิด/ปิดใช้กล้องแบบไดนามิกได้ตามบริบท เวลา และอื่นๆ
คุณควบคุมได้ว่าจะปิดใช้กล้องหรือไม่โดยใช้
setCameraDisabled()
วิธี ตัวอย่างเช่น ข้อมูลโค้ดนี้จะตั้งค่ากล้องให้เปิดหรือปิดใช้ตามการตั้งค่าของช่องทำเครื่องหมาย ดังนี้
Kotlin
private lateinit var disableCameraCheckbox: CheckBoxPreference private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)
Java
private CheckBoxPreference disableCameraCheckbox; DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked());
การเข้ารหัสพื้นที่เก็บข้อมูล
สำหรับ Android 3.0 เป็นต้นไป คุณสามารถใช้
setStorageEncryption()
เพื่อกำหนดนโยบายที่ต้องมีการเข้ารหัสพื้นที่เก็บข้อมูล ในกรณีที่รองรับ
เช่น
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setStorageEncryption(deviceAdminSample, true)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setStorageEncryption(deviceAdminSample, true);
ดูตัวอย่างที่สมบูรณ์ของวิธีเปิดใช้การเข้ารหัสพื้นที่เก็บข้อมูลได้ในตัวอย่าง API การดูแลระบบอุปกรณ์
ตัวอย่างโค้ดเพิ่มเติม
Android AppRestrictionEnforcementr และ DeviceOwner ตัวอย่างเพิ่มเติมสาธิตการใช้ API ที่กล่าวถึงในหน้านี้