نظرة عامة على إدارة الجهاز

إيقاف ميزة "مشرف الجهاز" نهائيًا بدءًا من الإصدار 9 من نظام التشغيل Android (المستوى 28 من واجهة برمجة التطبيقات)، سيتم وضع علامة "متوقّفة نهائيًا" على بعض سياسات المشرفين عند استدعائها من قِبل مشرف الجهاز. ننصحك بالبدء في الاستعداد لهذا التغيير الآن. لمعرفة المزيد والاطّلاع على خيارات نقل البيانات، يُرجى قراءة مقالة إيقاف ميزة "مشرف الجهاز" نهائيًا.

يتيح نظام التشغيل Android استخدام تطبيقات المؤسسات من خلال توفير واجهة برمجة التطبيقات Android Device Administration API. توفّر واجهة برمجة التطبيقات Device Administration API ميزات إدارة الأجهزة على مستوى النظام. تتيح لك واجهات برمجة التطبيقات هذه إنشاء تطبيقات تراعي الأمان وتكون مفيدة في إعدادات المؤسسة، حيث يحتاج متخصصو تكنولوجيا المعلومات إلى إمكانية تحكّم شاملة في أجهزة الموظفين. على سبيل المثال، استفاد تطبيق البريد الإلكتروني المضمّن في Android من واجهات برمجة التطبيقات هذه لتحسين إمكانية استخدام Exchange. من خلال تطبيق "البريد الإلكتروني"، يمكن لمشرفي Exchange فرض سياسات كلمات المرور، بما في ذلك كلمات المرور المكوّنة من أحرف أبجدية رقمية أو أرقام التعريف الشخصي، على جميع الأجهزة. يمكن للمشرفين أيضًا محو بيانات الهواتف المفقودة أو المسروقة عن بُعد (أي إعادة ضبطها على الإعدادات الأصلية). يمكن لمستخدمي Exchange مزامنة بيانات البريد الإلكتروني والتقويم.

هذا المستند مخصّص للمطوّرين الذين يريدون تطوير حلول للمؤسسات على الأجهزة التي تعمل بنظام التشغيل Android. ويناقش هذا المستند الميزات المختلفة التي توفّرها واجهة برمجة التطبيقات Device Administration API لتوفير أمان أقوى لأجهزة الموظفين التي تعمل بنظام التشغيل Android.

ملاحظة للحصول على معلومات حول إنشاء "وحدة تحكّم بسياسة العمل" لعمليات نشر Android for Work، يُرجى الاطّلاع على مقالة إنشاء "وحدة تحكّم بسياسة الجهاز".

وضع التحكّم الكامل بالجهاز بدون شاشة

يقدّم نظام التشغيل Android 14 (المستوى 34 لواجهة برمجة التطبيقات) وضع "النظام بلا واجهة مستخدم رسومية" (Headless System User Mode) (الأجهزة التي تعرض true عند تنفيذ UserManager.isHeadlessSystemUserMode). في وضع "النظام بلا واجهة مستخدم رسومية"، يكون مستخدم النظام مستخدمًا في الخلفية ويعتمد على مستخدمين إضافيين في المقدّمة لتفاعل المستخدم النهائي. يقدّم نظام التشغيل Android 14 أيضًا وضعًا مرتبطًا بمالك الجهاز بلا واجهة مستخدم رسومية، والذي يضيف مالك ملف شخصي إلى جميع المستخدمين المرتبطين غير مستخدم النظام الذي تم ضبط مالك الجهاز عليه.

في الأجهزة التي تم ضبطها باستخدام حساب مستخدم لنظام التشغيل بدون واجهة مستخدم (حيث يعمل حساب مستخدم النظام في الخلفية)، لا يتم تطبيق سوى سياسات الجهاز التي تكون نطاقها عامًا (السياسات التي تنطبق على جميع المستخدمين) على المستخدم أو المستخدمين الحاليين. لمزيد من التفاصيل، يمكنك الاطّلاع على addUserRestriction.

يمكن لمصنّعي أجهزة Android الرجوع إلى الإرشادات المنشورة على source.android.com.

نظرة عامة على واجهة برمجة التطبيقات لإدارة الأجهزة

في ما يلي أمثلة على أنواع التطبيقات التي قد تستخدم واجهة برمجة التطبيقات Device Administration API:

  • برامج البريد الإلكتروني
  • تطبيقات الأمان التي تتيح مسح البيانات عن بُعد
  • خدمات وتطبيقات إدارة الأجهزة

كيف تعمل هذه الميزة؟

يمكنك استخدام Device Administration API لكتابة تطبيقات مشرف الجهاز التي يثبّتها المستخدمون على أجهزتهم. يفرض تطبيق مشرف الجهاز السياسات المطلوبة. إليك طريقة عملها:

  • يكتب مشرف النظام تطبيقًا لمشرف الجهاز يفرض سياسات أمان الجهاز عن بُعد أو محليًا. ويمكن أن تكون هذه السياسات مبرمَجة بشكل ثابت في التطبيق، أو يمكن أن يسترد التطبيق السياسات ديناميكيًا من خادم تابع لجهة خارجية.
  • يتم تثبيت تطبيق "مساعد Google" على أجهزة المستخدمين. لا يتوفّر في Android حاليًا حلّ آلي لتوفير الخدمات. في ما يلي بعض الطرق التي يمكن أن يوزّع بها مشرف النظام التطبيق على المستخدمين:
    • Google Play.
    • تفعيل التثبيت من متجر آخر
    • توزيع التطبيق من خلال وسائل أخرى، مثل البريد الإلكتروني أو المواقع الإلكترونية
  • يطلب النظام من المستخدم تفعيل تطبيق مشرف الجهاز، ويعتمد وقت حدوث ذلك وكيفيته على طريقة تنفيذ التطبيق.
  • بعد أن يفعّل المستخدمون تطبيق مشرف الجهاز، ستسري عليهم سياساته. ويؤدي الالتزام بهذه السياسات عادةً إلى تحقيق مزايا، مثل الوصول إلى الأنظمة والبيانات الحساسة.

إذا لم يفعِّل المستخدمون تطبيق مشرف الجهاز، سيظل التطبيق على الجهاز، ولكن في حالة غير نشطة. لن يخضع المستخدمون لسياسات التطبيق، ولن يحصلوا على أي من مزاياه، مثل عدم إمكانية مزامنة البيانات.

إذا لم يلتزم المستخدم بالسياسات (على سبيل المثال، إذا ضبط كلمة مرور تنتهك الإرشادات)، يعود إلى التطبيق تحديد كيفية التعامل مع ذلك. ومع ذلك، سيؤدي ذلك عادةً إلى عدم تمكّن المستخدم من مزامنة البيانات.

إذا حاول جهاز الاتصال بخادم يتطلّب سياسات غير متوافقة مع واجهة برمجة التطبيقات الخاصة بإدارة الأجهزة، لن يُسمح بالاتصال. لا تسمح واجهة برمجة التطبيقات Device Administration API حاليًا بتوفير إعدادات جزئية. بعبارة أخرى، إذا كان أحد الأجهزة (مثل جهاز قديم) لا يتوافق مع جميع السياسات المذكورة، لن يكون هناك أي طريقة للسماح للجهاز بالاتصال.

إذا كان الجهاز يحتوي على عدة تطبيقات مشرفين مفعَّلة، سيتم فرض السياسة الأكثر صرامة. لا يمكن استهداف تطبيق مشرف معيّن.

لإزالة تثبيت تطبيق حالي من تطبيقات مشرفي الأجهزة، على المستخدمين أولاً إلغاء تسجيل التطبيق كمشرف.

السياسات

في بيئة المؤسسات، غالبًا ما يكون على أجهزة الموظفين الالتزام بمجموعة صارمة من السياسات التي تحكم استخدام الجهاز. تتيح واجهة برمجة التطبيقات Device Administration API استخدام السياسات المدرَجة في الجدول 1. يُرجى العِلم أنّ واجهة برمجة التطبيقات Device Administration API لا تتيح حاليًا سوى كلمات المرور لقفل الشاشة:

الجدول 1. السياسات المتوافقة مع واجهة برمجة التطبيقات Device Administration API

السياسة الوصف
تم تفعيل كلمة المرور يجب أن تطلب الأجهزة إدخال رقم التعريف الشخصي أو كلمات المرور.
الحد الأدنى لطول كلمة المرور اضبط عدد الأحرف المطلوب لكلمة المرور. على سبيل المثال، يمكنك اشتراط أن يتكوّن رقم التعريف الشخصي أو كلمات المرور من ستة أحرف على الأقل.
يجب استخدام كلمة مرور أبجدية رقمية يتطلّب ذلك أن تحتوي كلمات المرور على مجموعة من الأحرف والأرقام. وقد تتضمّن أحرفًا رمزية.
يجب إدخال كلمة مرور معقّدة يجب أن تحتوي كلمات المرور على حرف واحد على الأقل ورقم عددي ورمز خاص. تم طرحها في 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 أيضًا للمشرفين إعادة ضبط الجهاز على الإعدادات الأصلية عن بُعد. يؤدي ذلك إلى تأمين البيانات في حال فقدان الجهاز أو سرقته.
قفل الحد الأقصى المسموح به لوقت عدم النشاط تحدِّد هذه السياسة المدة الزمنية التي تنقضي منذ أن لمس المستخدم الشاشة أو ضغط على زر آخر مرة قبل أن يقفل الجهاز الشاشة. وفي هذه الحالة، على المستخدمين إدخال رقم التعريف الشخصي أو كلمات المرور مرة أخرى قبل أن يتمكّنوا من استخدام أجهزتهم والوصول إلى البيانات. يمكن أن تتراوح القيمة بين دقيقة واحدة و60 دقيقة.
طلب ترميز مساحة التخزين تحدِّد هذه السمة أنّه يجب تشفير مساحة التخزين، إذا كان الجهاز يتيح ذلك. تم طرحها في Android 3.0.
إيقاف الكاميرا تحدّد هذه السمة أنّه يجب إيقاف الكاميرا. يُرجى العِلم أنّه ليس عليك إيقاف الميزة بشكل دائم. يمكن تفعيل الكاميرا أو إيقافها ديناميكيًا استنادًا إلى السياق والوقت وما إلى ذلك. تم إدخال هذه الميزة في الإصدار 4.0 من نظام التشغيل Android.

ميزات أخرى

بالإضافة إلى إتاحة السياسات المدرَجة في الجدول أعلاه، يتيح لك Device Administration API إجراء ما يلي:

  • يُطلب من المستخدم ضبط كلمة مرور جديدة.
  • قفل الجهاز على الفور
  • محو بيانات الجهاز (أي إعادة ضبط الجهاز على الإعدادات الأصلية)

تطبيق نموذجي

تستند الأمثلة المستخدَمة في هذه الصفحة إلى نموذج Device Administration API، وهو مضمّن في نماذج حزمة تطوير البرامج (SDK) (المتاحة من خلال Android SDK Manager) وموجود على نظامك باسم <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java.

يقدّم التطبيق النموذجي عرضًا توضيحيًا لميزات مشرف الجهاز. تعرض هذه الميزة للمستخدمين واجهة مستخدم تتيح لهم تفعيل تطبيق مشرف الجهاز. وبعد تفعيل التطبيق، يمكنهم استخدام الأزرار في واجهة المستخدم لتنفيذ ما يلي:

  • تحديد جودة كلمة المرور
  • حدِّد متطلبات كلمة مرور المستخدم، مثل الحد الأدنى للطول والحد الأدنى لعدد الأحرف الرقمية التي يجب أن تحتوي عليها، وما إلى ذلك.
  • اضبط كلمة المرور. إذا لم تتوافق كلمة المرور مع السياسات المحدّدة، سيعرض النظام رسالة خطأ.
  • اضبط عدد المحاولات الفاشلة لإدخال كلمة المرور التي يمكن أن تحدث قبل حجب بيانات الجهاز (أي إعادة ضبطه على الإعدادات الأصلية).
  • تحديد مدة صلاحية كلمة المرور من الآن
  • اضبط طول سجلّ كلمات المرور (يشير الطول إلى عدد كلمات المرور القديمة المخزّنة في السجلّ). يمنع هذا الإعداد المستخدمين من إعادة استخدام إحدى كلمات المرور n الأخيرة التي استخدموها سابقًا.
  • حدِّد أنّه يجب تشفير مساحة التخزين، إذا كان الجهاز يتيح ذلك.
  • اضبط الحد الأقصى لمدة عدم النشاط التي يمكن أن تنقضي قبل قفل الجهاز.
  • قفل الجهاز على الفور
  • محو بيانات الجهاز (أي إعادة ضبطه على الإعدادات الأصلية)
  • إيقاف الكاميرا

الشكل 1. لقطة شاشة للتطبيق النموذجي

تطوير تطبيق لإدارة الأجهزة

يمكن لمشرفي النظام استخدام Device Administration API لكتابة تطبيق يفرض سياسة أمان الجهاز عن بُعد أو محليًا. يلخّص هذا القسم الخطوات المتّبعة لإنشاء تطبيق لإدارة الأجهزة.

إنشاء ملف البيان

لاستخدام Device Administration API، يجب أن يتضمّن ملف البيان الخاص بالتطبيق ما يلي:

  • فئة فرعية من DeviceAdminReceiver تتضمّن ما يلي:
  • بيان بسياسات الأمان المستخدَمة في البيانات الوصفية

في ما يلي مقتطف من نموذج بيان إدارة الأجهزة:

<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
  • عندما يفعّل المستخدم تطبيق مشرف الجهاز، يمنح ذلك التطبيق إذنًا بتنفيذ إجراءات استجابةً لبث أحداث نظام معيّنة. عند حدوث حدث مناسب، يمكن للتطبيق فرض سياسة. على سبيل المثال، إذا حاول المستخدم ضبط كلمة مرور جديدة لا تستوفي متطلبات السياسة، يمكن للتطبيق أن يطلب من المستخدم اختيار كلمة مرور مختلفة تستوفي المتطلبات.
  • تجنَّب تغيير اسم أداة الاستقبال بعد نشر تطبيقك. وإذا تم تغيير الاسم في ملف البيان، سيتم إيقاف ميزة &quot;مشرف الجهاز&quot; عندما يحدّث المستخدمون التطبيق. لمزيد من المعلومات، اطّلِع على <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>

عند تصميم تطبيق إدارة الأجهزة، ليس عليك تضمين جميع السياسات، بل فقط السياسات ذات الصلة بتطبيقك.

لمزيد من المناقشة حول ملف البيان، يُرجى الاطّلاع على دليل مطوّري تطبيقات Android.

تنفيذ الرمز

تتضمّن واجهة برمجة التطبيقات Device Administration API الفئات التالية:

DeviceAdminReceiver
فئة أساسية لتنفيذ أحد مكوّنات إدارة الأجهزة توفّر هذه الفئة طريقة سهلة لتفسير إجراءات الأهداف الأولية التي يرسلها النظام. يجب أن يتضمّن تطبيق "إدارة الجهاز" فئة فرعية من DeviceAdminReceiver.
DevicePolicyManager
فئة لإدارة السياسات المفروضة على جهاز. يجب أن يكون لدى معظم عملاء هذه الفئة DeviceAdminReceiver نشّطه حاليًا لدى المستخدم. يدير DevicePolicyManager السياسات الخاصة بواحدة أو أكثر من مثيلات DeviceAdminReceiver
DeviceAdminInfo
يتم استخدام هذه الفئة لتحديد البيانات الوصفية لمكوّن مشرف الجهاز.

توفّر هذه الفئات الأساس لتطبيق إدارة الأجهزة الذي يعمل بكامل وظائفه. ويوضّح بقية هذا القسم كيفية استخدام واجهات برمجة التطبيقات DeviceAdminReceiver وDevicePolicyManager لكتابة تطبيق إدارة الأجهزة.

تصنيف 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));
    }
...
}

تفعيل التطبيق

من الأحداث الرئيسية التي يجب أن يتعامل معها تطبيق مشرف الجهاز أن يفعّل المستخدم التطبيق، ويجب أن يفعّله بشكل صريح حتى يتم فرض السياسات. إذا اختار المستخدم عدم تفعيل التطبيق، سيظل التطبيق متوفّرًا على الجهاز، ولكن لن يتم فرض سياساته، ولن يستفيد المستخدم من أي مزايا يقدّمها التطبيق.

تبدأ عملية تفعيل التطبيق عندما ينفّذ المستخدم إجراءً يؤدي إلى تشغيل الغرض ACTION_ADD_DEVICE_ADMIN. في التطبيق النموذجي، يحدث ذلك عندما ينقر المستخدم على مربّع الاختيار تفعيل وضع المشرف.

عندما ينقر المستخدم على مربّع الاختيار تفعيل المشرف، يتغيّر العرض ليطلب من المستخدم تفعيل تطبيق مشرف الجهاز، كما هو موضّح في الشكل 2.

الشكل 2. تطبيق نموذجي: تفعيل التطبيق

في ما يلي الرمز الذي يتم تنفيذه عندما ينقر المستخدم على مربّع الاختيار تفعيل المشرف. سيؤدي ذلك إلى تشغيل دالة رد الاتصال 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 تتضمّن مكوّن DeviceAdminReceiver كوسيطة:isAdminActive()

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.

يمكنك الحصول على معرّف DevicePolicyManager على النحو التالي:

Kotlin

dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

Java

DevicePolicyManager dpm =
    (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);

يوضّح هذا القسم كيفية استخدام DevicePolicyManager لتنفيذ المهام الإدارية التالية:

ضبط سياسات كلمة المرور

يتضمّن DevicePolicyManager واجهات برمجة تطبيقات لإعداد سياسة كلمة مرور الجهاز وفرضها. في واجهة برمجة تطبيقات إدارة الأجهزة، لا تنطبق كلمة المرور إلا على قفل الشاشة. يوضّح هذا القسم المهام الشائعة المتعلّقة بكلمات المرور.

ضبط كلمة مرور للجهاز

يعرض هذا الرمز واجهة مستخدم تطلب من المستخدم ضبط كلمة مرور:

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
يجب أن يدخل المستخدم كلمة مرور تحتوي على أحرف رقمية على الأقل.
PASSWORD_QUALITY_COMPLEX
يجب أن يكون المستخدم قد أدخل كلمة مرور تحتوي على حرف واحد على الأقل ورقم عددي ورمز خاص.
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);
وضع متطلبات محتوى كلمة المرور

بدءًا من الإصدار 3.0 من نظام التشغيل Android، يتضمّن الصف DevicePolicyManager طرقًا تتيح لك ضبط محتوى كلمة المرور بدقة. على سبيل المثال، يمكنك وضع سياسة تنص على أنّ كلمات المرور يجب أن تحتوي على n حرف كبير على الأقل. في ما يلي طرق لضبط محتوى كلمة المرور بدقة:

على سبيل المثال، توضّح هذه المقتطفة أنّ كلمة المرور يجب أن تحتوي على حرفَين كبيرَين على الأقل:

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);
ضبط مهلة انتهاء صلاحية كلمة المرور

بدءًا من الإصدار 3.0 من نظام التشغيل Android، يمكنك استخدام طريقة 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);
تقييد كلمة المرور استنادًا إلى السجلّ

بدءًا من الإصدار 3.0 من نظام التشغيل Android، يمكنك استخدام طريقة 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.

إيقاف الكاميرا

بدءًا من الإصدار 4.0 من نظام التشغيل Android، يمكنك إيقاف الكاميرا. يُرجى العِلم أنّه ليس عليك إيقاف الميزة نهائيًا. يمكن تفعيل الكاميرا أو إيقافها بشكل ديناميكي استنادًا إلى السياق والوقت وما إلى ذلك.

يمكنك التحكّم في إيقاف الكاميرا باستخدام الطريقة 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());

ترميز مساحة التخزين

بدءًا من الإصدار 3.0 من نظام التشغيل Android، يمكنك استخدام طريقة 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 المزيد من المعلومات حول كيفية استخدام واجهات برمجة التطبيقات الموضّحة في هذه الصفحة.