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

การเลิกใช้งานผู้ดูแลระบบอุปกรณ์ เริ่มต้นด้วย 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 รองรับเฉพาะรหัสผ่านสำหรับหน้าจอเท่านั้น ล็อก:

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

รูปที่ 1 ภาพหน้าจอของตัวอย่างแอป

การพัฒนาแอปการดูแลระบบอุปกรณ์

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

การสร้างไฟล์ Manifest

ในการใช้ Device Administration API แอปพลิเคชัน ไฟล์ Manifest ต้องมีข้อมูลต่อไปนี้

  • คลาสย่อยของ DeviceAdminReceiver ที่มีข้อมูลต่อไปนี้
  • การประกาศนโยบายความปลอดภัยที่ใช้ในข้อมูลเมตา

นี่คือข้อความที่ตัดตอนมาจากไฟล์ 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.

รูปที่ 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 ตัวพิมพ์ใหญ่ ต่อไปนี้เป็นวิธีปรับแต่งรหัสผ่าน เนื้อหา:

ตัวอย่างเช่น ข้อมูลโค้ดนี้ระบุว่ารหัสผ่านต้องมีอักษรตัวพิมพ์ใหญ่อย่างน้อย 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 ที่กล่าวถึงในหน้านี้