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

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

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

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

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

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

يقدّم الإصدار 14 من Android (المستوى 34 لواجهة برمجة التطبيقات) وضع "النظام بلا واجهة مستخدم رسومية" (Headless System User Mode) (الأجهزة التي تعرض 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 حاليًا بإعداد الأجهزة جزئيًا. بعبارة أخرى، إذا كان أحد الأجهزة (مثل جهاز قديم) لا يتيح جميع السياسات المذكورة، لن يكون هناك أي طريقة للسماح للجهاز بالاتصال.

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

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

السياسات

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

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

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

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

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

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