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

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

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

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

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

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

يوفِّر Android 14 (المستوى 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. يُرجى العِلم أنّ واجهة برمجة التطبيقات Device Administration API لا تتيح حاليًا استخدام كلمات المرور إلا لقفل الشاشة:

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

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

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

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

الشكل 1: لقطة شاشة لعيّنة التطبيق

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

يمكن لمشرفي النظام استخدام 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 استجابةً لأحداث معيّنة. مثلاً:

KotlinJava
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))
...
}
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. بخلاف ذلك، يتم إيقاف تطبيق مشرف الجهاز.

KotlinJava
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
}
@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 مكوّنًا كوسيطة لها:

KotlinJava
private lateinit var dpm: DevicePolicyManager
...
private fun isActiveAdmin(): Boolean = dpm.isAdminActive(deviceAdminSample)
DevicePolicyManager dpm;
...
private boolean isActiveAdmin() {
    return dpm.isAdminActive(deviceAdminSample);
}

إدارة السياسات

DevicePolicyManager هي فئة عامة لإدارة السياسات المُطبَّقة على جهاز. تدير أداة DevicePolicyManager السياسات لمثيل واحد أو أكثر من DeviceAdminReceiver.

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

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

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

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

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

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

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

KotlinJava
Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent ->
    startActivity(intent)
}
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
ولا تفرض السياسة أي متطلبات للحصول على كلمة المرور.

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

KotlinJava
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)
DevicePolicyManager dpm;
ComponentName deviceAdminSample;
...
dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
تحديد متطلبات محتوى كلمة المرور

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

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

KotlinJava
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwMinUppercase = 2
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase)
DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwMinUppercase = 2;
...
dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase);
ضبط الحد الأدنى لطول كلمة المرور

يمكنك تحديد الحد الأدنى المحدد لكلمة المرور على الأقل. المنقار. مثلاً:

KotlinJava
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwLength: Int = ...
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength)
DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int pwLength;
...
dpm.setPasswordMinimumLength(deviceAdminSample, pwLength);
ضبط الحد الأقصى لعدد محاولات إدخال كلمة المرور الفاشلة

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

KotlinJava
val dPM:DevicePolicyManager
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val maxFailedPw: Int = ...
...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw)
DevicePolicyManager dpm;
ComponentName deviceAdminSample;
int maxFailedPw;
 ...
dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw);
ضبط مهلة انتهاء صلاحية كلمة المرور

بدءًا من Android 3.0، يمكنك استخدام الطريقة setPasswordExpirationTimeout() لتحديد وقت انتهاء صلاحية كلمة المرور، ويتم التعبير عنها كفرق في المللي ثانية من وقت ضبط المشرف على الجهاز لمهلة انتهاء الصلاحية. مثلاً:

KotlinJava
private lateinit var dpm: DevicePolicyManager
private lateinit var deviceAdminSample: ComponentName
private val pwExpiration: Long = ...
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration)
DevicePolicyManager dpm;
ComponentName deviceAdminSample;
long pwExpiration;
...
dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration);
تقييد كلمة المرور استنادًا إلى السجلّ

بدءًا من Android 3.0، يمكنك استخدام setPasswordHistoryLength() لتقييد تجربة القدرة على إعادة استخدام كلمات المرور القديمة. تستخدِم هذه الطريقة مَعلمة length التي تحدِّد عدد كلمات المرور القديمة التي يتم تخزينها. عندما تكون هذه السياسة نشطة، لا يمكن للمستخدمين إدخال كلمة مرور جديدة تطابق n كلمة مرور سابقة. وهذا يمنع منع المستخدمين من استخدام كلمة المرور نفسها مرارًا وتكرارًا يتم استخدام هذه السياسة عادةً مع setPasswordExpirationTimeout()، التي تفرض على المستخدمين تعديل كلمات المرور بعد مرور فترة زمنية محدّدة.

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

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

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

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

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

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

KotlinJava
private lateinit var dpm: DevicePolicyManager
dpm.lockNow()
DevicePolicyManager dpm;
dpm.lockNow();

إجراء عملية حجب البيانات

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

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

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

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

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

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

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

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

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

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

مثلاً:

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

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

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

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