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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

السياسات

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

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

ميزات أخرى

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

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

نموذج تطبيق

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

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

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

الشكل 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: نموذج تطبيق: تفعيل التطبيق

في ما يلي الرمز الذي يتم تنفيذه عندما ينقر المستخدم على مربّع الاختيار تفعيل المشرف. يؤدي ذلك إلى تفعيل دالة ردّ الاتصال 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 واجهات برمجة تطبيقات لضبط سياسة كلمة مرور الجهاز وفرضها. في واجهة برمجة التطبيقات لإدارة الأجهزة، لا تنطبق كلمة المرور إلا على قفل الشاشة. يصف هذا القسم المهام الشائعة المتعلقة بكلمات المرور.

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

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

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

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

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwHistoryLength = 5
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength)

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwHistoryLength = 5;
...
dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength);

ضبط قفل الجهاز

يمكنك ضبط الحد الأقصى لمدة عدم نشاط المستخدم قبل قفل الجهاز. على سبيل المثال:

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val timeMs: Long = 1000L * timeout.text.toString().toLong()
...
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs)

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
long timeMs = 1000L*Long.parseLong(timeout.getText().toString());
dpm.setMaximumTimeToLock(deviceAdminSample, timeMs);

يمكنك أيضًا إرسال أمر إلى الجهاز برمجيًا لقفله على الفور:

Kotlin

private lateinit var dpm: DevicePolicyManager
dpm.lockNow()

Java

DevicePolicyManager dpm;
dpm.lockNow();

حجب البيانات

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

يمكنك حجب البيانات على النحو التالي:

Kotlin

private lateinit var dpm: DevicePolicyManager
dpm.wipeData(0)

Java

DevicePolicyManager dpm;
dpm.wipeData(0);

تستخدم الطريقة wipeData() قناع بت من الخيارات الإضافية كمَعلمة لها. يجب أن تكون القيمة حاليًا 0.

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

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

يمكنك التحكّم في إيقاف الكاميرا باستخدام طريقة setCameraDisabled(). على سبيل المثال، يضبط هذا المقتطف الكاميرا على أن تكون مفعَّلة أو غير مفعَّلة استنادًا إلى إعداد مربّع الاختيار:

Kotlin

private lateinit var disableCameraCheckbox: CheckBoxPreference
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)

Java

private CheckBoxPreference disableCameraCheckbox;
DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked());

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

بدءًا من الإصدار Android 3.0، يمكنك استخدام طريقة setStorageEncryption() لضبط سياسة تتطلّب تشفير مساحة التخزين، حيثما كان ذلك متاحًا.

على سبيل المثال:

Kotlin

private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setStorageEncryption(deviceAdminSample, true)

Java

DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setStorageEncryption(deviceAdminSample, true);

يمكنك الاطّلاع على نموذج Device Administration API للحصول على مثال كامل على كيفية تفعيل تشفير مساحة التخزين.

عيّنات تعليمات برمجية إضافية

يظهر استخدام واجهات برمجة التطبيقات المذكورة في هذه الصفحة في نموذجَي Android AppRestrictionEnforcer وDeviceOwner.