ภาพรวมการดูแลระบบอุปกรณ์

การเลิกใช้งานผู้ดูแลระบบอุปกรณ์ ตั้งแต่ Android 9 (API ระดับ 28) เป็นต้นไป ระบบจะทำเครื่องหมายนโยบายสำหรับผู้ดูแลระบบบางรายการว่าเลิกใช้งานแล้วเมื่อผู้ดูแลระบบอุปกรณ์เรียกใช้ เราขอแนะนำให้คุณเริ่มเตรียมพร้อมรับการเปลี่ยนแปลงนี้ตั้งแต่ตอนนี้ หากต้องการดูข้อมูลเพิ่มเติมและดูตัวเลือกการย้ายข้อมูล โปรดอ่าน การเลิกใช้งานผู้ดูแลระบบอุปกรณ์

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

เอกสารนี้มีไว้สําหรับนักพัฒนาแอปที่ต้องการพัฒนาโซลูชันสําหรับองค์กรสําหรับอุปกรณ์ที่ทำงานด้วยระบบ Android ซึ่งจะอธิบายฟีเจอร์ต่างๆ ที่ Device Administration API มีให้เพื่อรักษาความปลอดภัยให้อุปกรณ์ของพนักงานที่ใช้ Android ได้ดีขึ้น

หมายเหตุ ดูข้อมูลเกี่ยวกับการสร้างเครื่องมือควบคุมนโยบายการทำงานสำหรับการนำ Android for Work ไปใช้ได้ที่สร้างเครื่องมือควบคุมนโยบายด้านอุปกรณ์

โหมดเจ้าของอุปกรณ์แบบไม่มีส่วนหัว

Android 14 (API ระดับ 34) เปิดตัวโหมดผู้ใช้ระบบแบบไม่มีส่วนหัว (อุปกรณ์ที่UserManager.isHeadlessSystemUserModeแสดงผล true) ในโหมดผู้ใช้ระบบแบบไม่มีส่วนหัว ผู้ใช้ระบบจะเป็นผู้ใช้เบื้องหลังและอาศัยผู้ใช้เบื้องหน้าเพิ่มเติมสำหรับการโต้ตอบกับผู้ใช้ปลายทาง Android 14 ยังเปิดตัวโหมดเจ้าของอุปกรณ์แบบไม่มีส่วนหัวที่เชื่อมโยง ซึ่งจะเพิ่มเจ้าของโปรไฟล์ให้กับผู้ใช้ที่เชื่อมโยงทุกคน ยกเว้นผู้ใช้ระบบที่ตั้งค่าเจ้าของอุปกรณ์ไว้

ในอุปกรณ์ที่กำหนดค่าด้วยผู้ใช้ระบบแบบ Headless (ที่ผู้ใช้ระบบทำงานอยู่เบื้องหลัง) เฉพาะนโยบายอุปกรณ์ที่มีขอบเขตแบบทั่วโลก (นโยบายที่ใช้กับผู้ใช้ทุกคน) เท่านั้นที่จะมีผลกับผู้ใช้หรือผู้ใช้ที่ทำงานอยู่เบื้องหน้า ดูรายละเอียดได้ที่ addUserRestriction

ผู้ผลิตอุปกรณ์ Android อาจดูคำแนะนำที่เผยแพร่ใน source.android.com

ภาพรวมของ Device Administration API

ต่อไปนี้คือตัวอย่างประเภทแอปที่อาจใช้ Device Administration API

  • โปรแกรมรับส่งอีเมล
  • แอปรักษาความปลอดภัยที่ล้างข้อมูลจากระยะไกล
  • บริการและแอปการจัดการอุปกรณ์

หลักการทำงาน

คุณใช้ Device Administration API เพื่อเขียนแอปผู้ดูแลระบบอุปกรณ์ที่ผู้ใช้จะติดตั้งในอุปกรณ์ แอปผู้ดูแลระบบอุปกรณ์จะบังคับใช้นโยบายที่ต้องการ วิธีการมีดังนี้

  • ผู้ดูแลระบบเขียนแอปผู้ดูแลอุปกรณ์ซึ่งบังคับใช้นโยบายความปลอดภัยของอุปกรณ์ระยะไกล/ในเครื่อง นโยบายเหล่านี้อาจฝังอยู่ในแอป หรือแอปอาจดึงข้อมูลนโยบายจากเซิร์ฟเวอร์ของบุคคลที่สามแบบไดนามิกก็ได้
  • แอปได้รับการติดตั้งในอุปกรณ์ของผู้ใช้ ปัจจุบัน Android ยังไม่มีโซลูชันการจัดสรรอัตโนมัติ ตัวอย่างวิธีที่ผู้ดูแลระบบอาจเผยแพร่แอปให้แก่ผู้ใช้มีดังนี้
    • Google Play
    • การเปิดใช้การติดตั้งจากร้านค้าอื่น
    • การเผยแพร่แอปผ่านช่องทางอื่นๆ เช่น อีเมลหรือเว็บไซต์
  • ระบบจะแจ้งให้ผู้ใช้เปิดใช้แอปผู้ดูแลระบบในอุปกรณ์ โดยวิธีที่ระบบจะแจ้งและเวลาที่ระบบจะแจ้งขึ้นอยู่กับวิธีติดตั้งใช้งานแอป
  • เมื่อผู้ใช้เปิดใช้แอปผู้ดูแลระบบของอุปกรณ์ ผู้ใช้จะต้องปฏิบัติตามนโยบายของแอป การปฏิบัติตามนโยบายดังกล่าวมักจะให้สิทธิประโยชน์ เช่น การเข้าถึงระบบและข้อมูลที่ละเอียดอ่อน

หากผู้ใช้ไม่ได้เปิดใช้แอปผู้ดูแลระบบของอุปกรณ์ แอปจะยังคงอยู่ในอุปกรณ์แต่อยู่ในสถานะไม่ทำงาน ผู้ใช้จะไม่อยู่ภายใต้นโยบายของแอปดังกล่าว และในทางกลับกัน ผู้ใช้ก็จะไม่ได้รับสิทธิประโยชน์ใดๆ ของแอป เช่น อาจซิงค์ข้อมูลไม่ได้

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

หากอุปกรณ์พยายามเชื่อมต่อกับเซิร์ฟเวอร์ที่ต้องใช้นโยบายที่ Device Administration API ไม่รองรับ ระบบจะไม่อนุญาตให้เชื่อมต่อ ปัจจุบัน Device Administration 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

ฟีเจอร์อื่นๆ

นอกจากรองรับนโยบายที่ระบุไว้ในตารางด้านบนแล้ว Device Administration 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 เพื่อตอบสนองต่อเหตุการณ์หนึ่งๆ เช่น

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

การเปิดใช้แอป

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

กระบวนการเปิดใช้แอปจะเริ่มขึ้นเมื่อผู้ใช้ดำเนินการที่ทริกเกอร์ Intent ACTION_ADD_DEVICE_ADMIN ในตัวอย่างแอป เหตุการณ์นี้จะเกิดขึ้นเมื่อผู้ใช้คลิกช่องทําเครื่องหมายเปิดใช้ผู้ดูแลระบบ

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

รูปที่ 2 แอปตัวอย่าง: การเปิดใช้งานแอป

ด้านล่างคือโค้ดที่จะเรียกใช้เมื่อผู้ใช้คลิกช่องทําเครื่องหมายเปิดใช้ผู้ดูแลระบบ ซึ่งจะทริกเกอร์การเรียกใช้ฟังก์ชัน callback ของ onPreferenceChange() ระบบจะเรียกใช้การเรียกกลับนี้เมื่อผู้ใช้เปลี่ยนแปลงค่าของ 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 จัดการนโยบายสําหรับอินสแตนซ์ DeviceAdminReceiver อย่างน้อย 1 รายการ

คุณจะได้รับแฮนเดิลของ 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
ผู้ใช้ต้องป้อนรหัสผ่านที่มีอักขระที่เป็นตัวอักษร (หรือสัญลักษณ์อื่นๆ) อย่างน้อย 1 ตัว
PASSWORD_QUALITY_ALPHANUMERIC
ผู้ใช้ต้องป้อนรหัสผ่านที่มีอักขระทั้งตัวเลขและตัวอักษร (หรือสัญลักษณ์อื่นๆ) อย่างน้อย 8 ตัว
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 ตัว วิธีปรับแต่งเนื้อหาของรหัสผ่านมีดังนี้

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

ดูตัวอย่าง Device Administration API เพื่อดูตัวอย่างวิธีเปิดใช้การเข้ารหัสพื้นที่เก็บข้อมูลอย่างละเอียด

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

ตัวอย่าง Android AppRestrictionEnforcer และ DeviceOwner แสดงการใช้ API ที่ครอบคลุมในหน้านี้เพิ่มเติม