การเลิกใช้งานผู้ดูแลระบบอุปกรณ์ นโยบายผู้ดูแลระบบบางรายการถูกทำเครื่องหมายเป็นเลิกใช้งานเมื่อเรียกใช้ โดยผู้ดูแลระบบอุปกรณ์ หากต้องการเรียนรู้เพิ่มเติมและดูตัวเลือกการย้ายข้อมูล โปรดดูที่ การเลิกใช้งานผู้ดูแลระบบอุปกรณ์
แพลตฟอร์ม Android มีการจัดการอุปกรณ์ระดับระบบมาตั้งแต่ Android 2.2 (API ระดับ 8) ผ่านทาง Device Administration API
ในบทเรียนนี้ คุณจะได้ดูวิธีสร้างแอปพลิเคชันที่คำนึงถึงความปลอดภัยซึ่งจัดการการเข้าถึง เนื้อหาของแอปด้วยการบังคับใช้นโยบายการจัดการอุปกรณ์ กล่าวคือ สามารถกำหนดค่าแอปพลิเคชัน เพื่อให้แน่ใจได้ว่ารหัสผ่านการล็อกหน้าจอมีความรัดกุมเพียงพอก่อนที่จะแสดง เนื้อหาที่จำกัดไว้สำหรับผู้ใช้
กําหนดและประกาศนโยบาย
ก่อนอื่นคุณต้องกำหนดประเภทของนโยบายที่จะสนับสนุนในระดับการทำงาน นโยบายอาจ ครอบคลุมระดับความปลอดภัยของรหัสผ่านล็อกหน้าจอ การหมดเวลาหมดอายุ การเข้ารหัส ฯลฯ
คุณต้องประกาศชุดนโยบายที่เลือก ซึ่งจะมีการบังคับใช้โดยแอปพลิเคชันใน
res/xml/device_admin.xml
ไฟล์ ไฟล์ Manifest ของ Android ควรอ้างอิง
ที่ประกาศแล้ว
นโยบายที่ประกาศแต่ละรายการจะสอดคล้องกับเมธอดนโยบายด้านอุปกรณ์ที่เกี่ยวข้องจำนวนหนึ่งใน DevicePolicyManager
(กำหนดความยาวขั้นต่ำของรหัสผ่านและจำนวนขั้นต่ำของรหัสผ่าน
อักขระตัวพิมพ์ใหญ่เป็น 2 ตัวอย่าง) หากแอปพลิเคชันพยายามจะเรียกใช้เมธอด
ไม่ได้ประกาศนโยบายที่เกี่ยวข้องใน XML ซึ่งจะส่งผลให้มี SecurityException
ขณะรันไทม์ สิทธิ์อื่นๆ
เช่น force-lock
สามารถใช้ได้หากแอปพลิเคชันต้องการจัดการ
นโยบายประเภทอื่นๆ คุณจะเห็นขั้นตอนในภายหลัง ซึ่งเป็นขั้นตอนหนึ่งของการเปิดใช้งานผู้ดูแลระบบอุปกรณ์
รายการนโยบายที่ประกาศไว้จะแสดงให้ผู้ใช้เห็นในหน้าจอของระบบ
ข้อมูลโค้ดต่อไปนี้ประกาศนโยบายขีดจำกัดรหัสผ่านใน res/xml/device_admin.xml
<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <limit-password /> </uses-policies> </device-admin>
XML ของการประกาศนโยบายที่อ้างอิงในไฟล์ Manifest ของ Android:
<receiver android:name=".Policy$PolicyAdmin" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver>
สร้างตัวรับการดูแลระบบอุปกรณ์
สร้าง Broadcast Receiver ของการดูแลระบบอุปกรณ์ซึ่งจะได้รับการแจ้งเตือนเหตุการณ์ที่เกี่ยวข้องกับนโยบายที่คุณประกาศไว้ว่าสนับสนุน แอปพลิเคชันอาจเลือกลบล้างเมธอด Callback ได้
ในแอปพลิเคชันตัวอย่าง ผู้ดูแลระบบอุปกรณ์ เมื่อผู้ดูแลระบบอุปกรณ์ถูกปิดใช้งานโดย ผู้ใช้ นโยบายที่กำหนดค่าไว้จะถูกลบออกจากค่ากำหนดที่ใช้ร่วมกัน คุณควรพิจารณาใช้ ตรรกะทางธุรกิจที่เกี่ยวข้องกับกรณีการใช้งานของคุณ ตัวอย่างเช่น แอปพลิเคชันอาจใช้เวลา การดำเนินการเพื่อลดความเสี่ยงด้านความปลอดภัยด้วยการดำเนินการต่างๆ ร่วมกับการลบข้อมูลที่ละเอียดอ่อนใน อุปกรณ์, การปิดใช้การซิงค์ระยะไกล, การแจ้งเตือนผู้ดูแลระบบ ฯลฯ
เพื่อให้ Broadcast Receiver ทำงานได้ โปรดลงทะเบียนในไฟล์ Manifest ของ Android ตามที่แสดงในตัวอย่างข้างต้น
Kotlin
class PolicyAdmin : DeviceAdminReceiver() { override fun onDisabled(context: Context, intent: Intent) { // Called when the app is about to be deactivated as a device administrator. // Deletes previously stored password policy. super.onDisabled(context, intent) context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE).edit().apply { clear() apply() } } }
Java
public static class PolicyAdmin extends DeviceAdminReceiver { @Override public void onDisabled(Context context, Intent intent) { // Called when the app is about to be deactivated as a device administrator. // Deletes previously stored password policy. super.onDisabled(context, intent); SharedPreferences prefs = context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE); prefs.edit().clear().commit(); } }
เปิดใช้งานโปรแกรมควบคุมอุปกรณ์
ก่อนบังคับใช้นโยบาย ผู้ใช้ต้องเปิดใช้งานแอปพลิเคชันเป็นอุปกรณ์ด้วยตนเอง
ผู้ดูแลระบบ ข้อมูลโค้ดด้านล่างแสดงวิธีเรียกกิจกรรมการตั้งค่าที่การเรียก
ผู้ใช้ สามารถเปิดใช้งานแอปพลิเคชันของคุณ แนวทางปฏิบัติที่ดีคือการใส่ข้อความอธิบายเพื่อไฮไลต์
แก่ผู้ใช้ว่าเหตุใดแอปพลิเคชันจึงขอให้เป็นผู้ดูแลระบบอุปกรณ์ โดยระบุ
ความตั้งใจเพิ่มขึ้น EXTRA_ADD_EXPLANATION
รูปที่ 1 หน้าจอการเปิดใช้งานของผู้ใช้ ซึ่งคุณสามารถ ให้คำอธิบายนโยบายด้านอุปกรณ์ของคุณ
Kotlin
if (!policy.isAdminActive()) { val activateDeviceAdminIntent = Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN) activateDeviceAdminIntent.putExtra( DevicePolicyManager.EXTRA_DEVICE_ADMIN, policy.getPolicyAdmin() ) // It is good practice to include the optional explanation text to // explain to user why the application is requesting to be a device // administrator. The system will display this message on the activation // screen. activateDeviceAdminIntent.putExtra( DevicePolicyManager.EXTRA_ADD_EXPLANATION, resources.getString(R.string.device_admin_activation_message) ) startActivityForResult(activateDeviceAdminIntent, REQ_ACTIVATE_DEVICE_ADMIN) }
Java
if (!policy.isAdminActive()) { Intent activateDeviceAdminIntent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); activateDeviceAdminIntent.putExtra( DevicePolicyManager.EXTRA_DEVICE_ADMIN, policy.getPolicyAdmin()); // It is good practice to include the optional explanation text to // explain to user why the application is requesting to be a device // administrator. The system will display this message on the activation // screen. activateDeviceAdminIntent.putExtra( DevicePolicyManager.EXTRA_ADD_EXPLANATION, getResources().getString(R.string.device_admin_activation_message)); startActivityForResult(activateDeviceAdminIntent, REQ_ACTIVATE_DEVICE_ADMIN); }
หากผู้ใช้เลือก "เปิดใช้งาน" แอปพลิเคชันจะกลายเป็นโปรแกรมควบคุมอุปกรณ์ และ กำหนดค่าและบังคับใช้นโยบาย
และจะต้องเตรียมแอปพลิเคชันให้พร้อมรับมือกับสถานการณ์ต่างๆ ที่ผู้ใช้ยกเลิกการใช้งาน
ขั้นตอนการเปิดใช้งานโดยกดปุ่ม "ยกเลิก" แป้นย้อนกลับ หรือแป้นหน้าแรก ดังนั้น
onResume()
ในกิจกรรมการตั้งค่านโยบายต้องมีตรรกะ
เพื่อประเมินเงื่อนไขอีกครั้งและแสดงตัวเลือกการเปิดใช้งานผู้ดูแลระบบอุปกรณ์ให้กับผู้ใช้หาก
ที่จำเป็น
ใช้เครื่องมือควบคุมนโยบายด้านอุปกรณ์
หลังจากเปิดใช้งานผู้ดูแลระบบอุปกรณ์สำเร็จแล้ว แอปพลิเคชันจะกำหนดค่าอุปกรณ์ ตัวจัดการนโยบายที่มีนโยบายที่ขอ โปรดทราบว่าเราจะเพิ่มนโยบายใหม่ลงใน Android ในแต่ละรุ่น คุณควรดำเนินการตรวจสอบเวอร์ชันในแอปพลิเคชันของคุณหากใช้ นโยบายใหม่ไปพร้อมกับรองรับแพลตฟอร์มเวอร์ชันเก่าด้วย เช่น การกำหนดรหัสผ่านขั้นต่ำ นโยบายอักษรตัวพิมพ์ใหญ่ใช้ได้เฉพาะกับ API ระดับ 11 (Honeycomb) ขึ้นไป รหัสต่อไปนี้ จะสาธิตวิธีการตรวจสอบเวอร์ชันขณะรันไทม์
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var policyAdmin: ComponentName dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager policyAdmin = ComponentName(context, PolicyAdmin::class.java) dpm.apply { setPasswordQuality(policyAdmin, PASSWORD_QUALITY_VALUES[passwordQuality]) setPasswordMinimumLength(policyAdmin, passwordLength) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { setPasswordMinimumUpperCase(policyAdmin, passwordMinUpperCase) } }
Java
DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName policyAdmin = new ComponentName(context, PolicyAdmin.class); dpm.setPasswordQuality(policyAdmin, PASSWORD_QUALITY_VALUES[passwordQuality]); dpm.setPasswordMinimumLength(policyAdmin, passwordLength); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { dpm.setPasswordMinimumUpperCase(policyAdmin, passwordMinUpperCase); }
ในจุดนี้ แอปพลิเคชันจะบังคับใช้นโยบายได้ แม้ว่าแอปพลิเคชันจะไม่มีสิทธิ์เข้าถึง รหัสผ่านล็อกหน้าจอจริงที่ใช้ โดยผ่าน Device Policy Manager API รหัสผ่านที่มีอยู่เป็นไปตามนโยบายที่กำหนด หากปรากฏว่าคำสั่งซื้อที่มีอยู่ รหัสผ่านล็อกหน้าจอไม่เพียงพอ API การดูแลระบบอุปกรณ์จะไม่นำไปใช้โดยอัตโนมัติ การดำเนินการแก้ไข แอปพลิเคชันมีหน้าที่รับผิดชอบในการเปิดใช้ระบบอย่างชัดเจน หน้าจอเปลี่ยนรหัสผ่านในแอปการตั้งค่า ดังตัวอย่างต่อไปนี้
Kotlin
if (!dpm.isActivePasswordSufficient) { // Triggers password change screen in Settings. Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent -> startActivity(intent) } }
Java
if (!dpm.isActivePasswordSufficient()) { ... // Triggers password change screen in Settings. Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); startActivity(intent); }
ตามปกติแล้ว ผู้ใช้สามารถเลือกจากกลไกการล็อกที่ใช้ได้ เช่น ไม่มี รูปแบบ PIN (ตัวเลข) หรือรหัสผ่าน (ตัวอักษรและตัวเลข) เมื่อมีการกำหนดค่านโยบายรหัสผ่านแล้ว รหัสผ่านเหล่านั้น ประเภทที่มีประสิทธิภาพต่ำกว่าที่ระบุไว้ในนโยบายจะถูกปิดใช้ ตัวอย่างเช่น หาก มีการกำหนดคุณภาพรหัสผ่านแบบ "ตัวเลข" ผู้ใช้จะเลือก PIN (ตัวเลข) หรือรหัสผ่านก็ได้ (ตัวอักษรและตัวเลขคละกัน) เท่านั้น
เมื่ออุปกรณ์ได้รับการรักษาความปลอดภัยอย่างเหมาะสมแล้ว โดยการตั้งรหัสผ่านสำหรับล็อกหน้าจอที่เหมาะสม แอปพลิเคชัน อนุญาตให้เข้าถึงเนื้อหาที่ปลอดภัย
Kotlin
when { !dpm.isAdminActive(policyAdmin) -> { // Activates device administrator. ... } !dpm.isActivePasswordSufficient -> { // Launches password set-up screen in Settings. ... } else -> { // Grants access to secure content. ... startActivity(Intent(context, SecureActivity::class.java)) } }
Java
if (!dpm.isAdminActive(..)) { // Activates device administrator. ... } else if (!dpm.isActivePasswordSufficient()) { // Launches password set-up screen in Settings. ... } else { // Grants access to secure content. ... startActivity(new Intent(context, SecureActivity.class)); }