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

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

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

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

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

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

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

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

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

نظرة عامة على واجهة برمجة التطبيقات Device administration API

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

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

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

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

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

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

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

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

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

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

السياسات

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

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

السياسة الوصف
تم تفعيل كلمة المرور تتطلّب هذه الميزة أن تطلب الأجهزة إدخال رقم تعريف شخصي أو كلمات مرور.
الحد الأدنى لطول كلمة المرور اضبط العدد المطلوب من الأحرف لكلمة المرور. على سبيل المثال، يمكنك أن تطلب أن يحتوي رقم التعريف الشخصي أو كلمات المرور على ستة أحرف على الأقل.
يجب استخدام كلمة مرور أبجدية رقمية تتطلب أن تحتوي كلمات المرور على مجموعة من الأحرف والأرقام. ويمكن أن تتضمّن أحرفًا رمزية.
يجب إدخال كلمة مرور معقّدة. تتطلّب هذه الميزة أن تحتوي كلمات المرور على حرف ورمز رقمي ورمز خاص على الأقل. تم طرحها في الإصدار 3.0 من Android.
الحد الأدنى لعدد الأحرف المطلوبة في كلمة المرور الحد الأدنى لعدد الأحرف المطلوبة في كلمة المرور لجميع المشرفين أو مشرف معيّن تم طرحها في الإصدار 3.0 من Android.
الحد الأدنى لعدد الأحرف الصغيرة المطلوبة في كلمة المرور الحد الأدنى لعدد الأحرف العميقة المطلوبة في كلمة المرور لجميع المشرفين أو لأحدهم على وجه التحديد تم طرحها في الإصدار 3.0 من Android.
الحد الأدنى المطلوب لعدد الأحرف غير الأحرف في كلمة المرور الحد الأدنى لعدد الأحرف غير الأبجدية المطلوبة في كلمة المرور لجميع المشرفين أو لأحدهم على وجه التحديد تم طرحها في الإصدار 3.0 من Android.
الحد الأدنى للأرقام المطلوبة في كلمة المرور الحد الأدنى لعدد الأرقام المطلوبة في كلمة المرور لجميع المشرفين أو لأحدهم على وجه التحديد تم طرحها في الإصدار 3.0 من Android.
الحد الأدنى من الرموز المطلوبة في كلمة المرور الحد الأدنى لعدد الرموز المطلوبة في كلمة المرور لجميع المشرفين أو مشرف معيّن تم طرحها في الإصدار 3.0 من Android.
الحد الأدنى لعدد الأحرف الكبيرة المطلوبة في كلمة المرور الحد الأدنى لعدد الأحرف الكبيرة المطلوبة في كلمة المرور لجميع المشرفين أو لأحدهم على وجه التحديد تم طرحها في الإصدار 3.0 من Android.
مهلة انتهاء صلاحية كلمة المرور وقت انتهاء صلاحية كلمة المرور، ويتم التعبير عنه كفرق بالملي ثانية من وقت ضبط مشرف الجهاز لمهلة انتهاء الصلاحية. تم طرحها في الإصدار 3.0 من Android.
حظر سجلّ كلمات المرور تمنع هذه السياسة المستخدمين من إعادة استخدام آخر ن من كلمات المرور الفريدة. يتم استخدام هذه السياسة عادةً مع setPasswordExpirationTimeout()، التي تفرض على المستخدمين تعديل كلمات المرور بعد مرور فترة زمنية محدّدة. تم طرحها في الإصدار 3.0 من Android.
الحد الأقصى لعدد محاولات إدخال كلمة المرور تُستخدَم لتحديد عدد المرات التي يمكن للمستخدم فيها إدخال كلمة المرور غير الصحيحة قبل أن تتم امحاة بياناته على الجهاز. تسمح واجهة برمجة التطبيقات لإدارة الجهاز للمشرفين أيضًا بإعادة ضبط الجهاز على الإعدادات الافتراضية للمصنع عن بُعد. ويؤدي ذلك إلى تأمين البيانات في حال فقدان الجهاز أو سرقته.
قفل الحد الأقصى المسموح به لوقت عدم النشاط يضبط هذا الإعداد المدة التي يتم بعدها قفل الشاشة على الجهاز منذ آخر مرة لمس فيها المستخدم الشاشة أو ضغط على زر. وعندما يحدث ذلك، يحتاج المستخدمون إلى إدخال رقم التعريف الشخصي أو كلمات المرور مرة أخرى قبل أن يتمكّنوا من استخدام أجهزتهم والوصول إلى البيانات. ويمكن أن تتراوح القيمة بين دقيقة واحدة و60 دقيقة.
طلب تشفير مساحة التخزين يحدِّد هذا الخيار أنّه يجب تشفير مساحة التخزين، إذا كان الجهاز يتيح ذلك. تم طرحها في الإصدار 3.0 من Android.
إيقاف الكاميرا تحدِّد هذه السياسة أنّه يجب إيقاف الكاميرا. يُرجى العلم أنّه ليس بالضرورة أن يكون هذا الإجراء دائمًا. يمكن تفعيل الكاميرا أو إيقافها ديناميكيًا استنادًا إلى السياق والوقت وما إلى ذلك. تم طرح هذه الميزة في Android 4.0.

ميزات أخرى

بالإضافة إلى دعم السياسات المدرجة في الجدول أعلاه، تتيح لك واجهة برمجة التطبيقات إدارة الأجهزة إجراء ما يلي:

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

نموذج تطبيق

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

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

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

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

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

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

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

لاستخدام واجهة برمجة التطبيقات لإدارة الجهاز، يجب أن يتضمن بيان التطبيق ما يلي:

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

في ما يلي الرمز الذي يتم تنفيذه عندما ينقر المستخدم على مربّع الاختيار تفعيل المشرف. يؤدي ذلك إلى بدء دالّة 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 واحد أو أكثر.

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

Kotlin

dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

Java

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

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

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

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

بدءًا من Android 3.0، تتضمّن فئة 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);
ضبط مهلة انتهاء صلاحية كلمة المرور

بدءًا من نظام التشغيل 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()، التي تفرض على المستخدمين تعديل كلمات المرور بعد مرور فترة زمنية محدّدة.

على سبيل المثال، يمنع هذا المقتطف المستخدمين من إعادة استخدام أي من كلمات المرور الخمسة الأخيرة:

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 استخدام واجهات برمجة التطبيقات التي تتناولها هذه الصفحة.