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

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

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

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

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

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

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

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

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

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

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

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

How does it work?

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

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

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

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

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

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

نموذج تطبيق

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

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

  • ضبط جودة كلمة المرور
  • حدِّد متطلبات كلمة مرور المستخدم، مثل الحدّ الأدنى للطول والحدّ الأدنى لعدد الأحرف الرقمية التي يجب أن تحتوي عليها، وما إلى ذلك.
  • اضبط كلمة المرور. إذا لم تتوافق كلمة المرور مع السياسات المحددة، يعرض النظام رسالة خطأ.
  • اضبط عدد المحاولات الفاشلة لإدخال كلمة المرور قبل أن يتم حجب بيانات الجهاز (أي تتم إعادته إلى إعدادات المصنع).
  • يمكنك ضبط مدة انتهاء صلاحية كلمة المرور من الآن.
  • ضبط طول سجلّ كلمات المرور (يشير length إلى عدد كلمات المرور القديمة المخزّنة في السجلّ). يؤدي هذا الإجراء إلى منع المستخدمين من إعادة استخدام واحدة من آخر 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 لكتابة تطبيق مشرف الجهاز.

التصنيف الفرعي DeviceAdminAdmin

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