كتاب الطبخ الخاص بالأجهزة المخصصة

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

تطبيقات الشاشة الرئيسية المخصصة

وهذه الوصفات مفيدة عند تطوير تطبيق ليحل محل الشاشة الرئيسية لنظام Android ومشغّل التطبيقات.

تطبيق الشاشة الرئيسية

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

تتعامل جميع تطبيقات الشاشة الرئيسية مع فئة الغرض من CATEGORY_HOME، وهذه هي الطريقة التي يتعرّف بها النظام على تطبيق الشاشة الرئيسية. لكي يصبح تطبيق الشاشة الرئيسية التلقائي، اضبط أحد أنشطة تطبيقك كمعالج النية الرئيسية المفضّل، عن طريق استدعاء DevicePolicyManager.addPersistentPreferredActivity() كما هو موضّح في المثال التالي:

Kotlin

// Create an intent filter to specify the Home category.
val filter = IntentFilter(Intent.ACTION_MAIN)
filter.addCategory(Intent.CATEGORY_HOME)
filter.addCategory(Intent.CATEGORY_DEFAULT)

// Set the activity as the preferred option for the device.
val activity = ComponentName(context, KioskModeActivity::class.java)
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager
dpm.addPersistentPreferredActivity(adminName, filter, activity)

Java

// Create an intent filter to specify the Home category.
IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
filter.addCategory(Intent.CATEGORY_HOME);
filter.addCategory(Intent.CATEGORY_DEFAULT);

// Set the activity as the preferred option for the device.
ComponentName activity = new ComponentName(context, KioskModeActivity.class);
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.addPersistentPreferredActivity(adminName, filter, activity);

لا يزال عليك تعريف فلتر النية في ملف بيان التطبيق كما هو موضّح في مقتطف XML التالي:

<activity
        android:name=".KioskModeActivity"
        android:label="@string/kiosk_mode"
        android:launchMode="singleInstance"
        android:excludeFromRecents="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.HOME"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

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

عرض مهام منفصلة

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

الأكشاك العامة

تعد هذه الوصفات رائعة للأجهزة غير الخاضعة للمراقبة في الأماكن العامة ولكنها يمكن أيضًا أن تساعد العديد من مستخدمي الأجهزة المتفانين في التركيز على مهامهم.

قفل الجهاز

للمساعدة على التأكد من استخدام الأجهزة للغرض المقصود منها، يمكنك إضافة قيود المستخدم المدرجة في الجدول 1.

الجدول 1. قيود المستخدمين لأجهزة Kiosk
تقييد المستخدم الوصف
DISALLOW_FACTORY_RESET لمنع مستخدم الجهاز من إعادة ضبط الجهاز على الإعدادات الأصلية التلقائية. يمكن لمشرفي الأجهزة المُدارة بالكامل والمستخدم الأساسي ضبط هذا التقييد.
DISALLOW_SAFE_BOOT يمنع هذا الإعداد مستخدم الجهاز من بدء تشغيل الجهاز في الوضع الآمن الذي لا يشغِّل فيه النظام تطبيقك تلقائيًا. ويمكن لمشرفي الأجهزة المُدارة بالكامل والمستخدم الأساسي ضبط هذا التقييد.
DISALLOW_MOUNT_PHYSICAL_MEDIA يمنع هذا الإعداد مستخدم الجهاز من تثبيت أي وحدات تخزين قد يتم إرفاقها بالجهاز. ويمكن لمشرفي الأجهزة المُدارة بالكامل والمستخدم الأساسي ضبط هذا التقييد.
DISALLOW_ADJUST_VOLUME يكتم صوت الجهاز ويمنع مستخدم الجهاز من تغيير إعدادات مستوى الصوت والاهتزاز. تأكَّد من أنّ تطبيق Kiosk لا يحتاج إلى الصوت لتشغيل الوسائط أو ميزات تسهيل الاستخدام. ويمكن لمشرفي الأجهزة المُدارة بالكامل والمستخدم الأساسي والمستخدمين الثانويين والملفات الشخصية للعمل ضبط هذا التقييد.
DISALLOW_ADD_USER لمنع مستخدم الجهاز من إضافة مستخدمين جدد، مثل المستخدمين الثانويين أو المستخدمين المحظورين. يضيف النظام تلقائيًا هذا الحظر المفروض على المستخدمين إلى الأجهزة المُدارة بالكامل، ولكن قد يتم محوه. ويمكن لمشرفي الأجهزة المُدارة بالكامل والمستخدم الأساسي ضبط هذا التقييد.

يوضّح المقتطف التالي كيفية ضبط القيود:

Kotlin

// If the system is running in lock task mode, set the user restrictions
// for a kiosk after launching the activity.
arrayOf(
        UserManager.DISALLOW_FACTORY_RESET,
        UserManager.DISALLOW_SAFE_BOOT,
        UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA,
        UserManager.DISALLOW_ADJUST_VOLUME,
        UserManager.DISALLOW_ADD_USER).forEach { dpm.addUserRestriction(adminName, it) }

Java

// If the system is running in lock task mode, set the user restrictions
// for a kiosk after launching the activity.
String[] restrictions = {
    UserManager.DISALLOW_FACTORY_RESET,
    UserManager.DISALLOW_SAFE_BOOT,
    UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA,
    UserManager.DISALLOW_ADJUST_VOLUME,
    UserManager.DISALLOW_ADD_USER};

for (String restriction: restrictions) dpm.addUserRestriction(adminName, restriction);

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

إيقاف مربّعات حوار الأخطاء

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

Kotlin

override fun onEnabled(context: Context, intent: Intent) {
    val dpm = getManager(context)
    val adminName = getWho(context)

    dpm.addUserRestriction(adminName, UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS)
}

Java

public void onEnabled(Context context, Intent intent) {
  DevicePolicyManager dpm = getManager(context);
  ComponentName adminName = getWho(context);

  dpm.addUserRestriction(adminName, UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS);
}

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

إبقاء الشاشة مفعَّلة

إذا كنت تنشئ Kiosk، يمكنك إيقاف تشغيل جهاز في وضع السكون عندما يشغّل نشاط تطبيقك. أضِف علامة تنسيق FLAG_KEEP_SCREEN_ON إلى نافذة التطبيق كما هو موضّح في المثال التالي:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Keep the screen on and bright while this kiosk activity is running.
    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  // Keep the screen on and bright while this kiosk activity is running.
  getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

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

يمكنك أيضًا ضبط الإعداد العام STAY_ON_WHILE_PLUGGED_IN لإبقاء الجهاز في الوضع النشط أثناء اتصاله بمصدر طاقة. يمكن لمشرفي الأجهزة المُدارة بالكامل، التي تعمل بالإصدار 6.0 من نظام التشغيل Android (المستوى 23 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، الاتصال بـ DevicePolicyManager.setGlobalSetting() كما هو موضح في المثال التالي:

Kotlin

val pluggedInto = BatteryManager.BATTERY_PLUGGED_AC or
        BatteryManager.BATTERY_PLUGGED_USB or
        BatteryManager.BATTERY_PLUGGED_WIRELESS
dpm.setGlobalSetting(adminName,
        Settings.Global.STAY_ON_WHILE_PLUGGED_IN, pluggedInto.toString())

Java

int pluggedInto = BatteryManager.BATTERY_PLUGGED_AC |
    BatteryManager.BATTERY_PLUGGED_USB |
    BatteryManager.BATTERY_PLUGGED_WIRELESS;
dpm.setGlobalSetting( adminName,
    Settings.Global.STAY_ON_WHILE_PLUGGED_IN, String.valueOf(pluggedInto));

حِزم التطبيقات

يحتوي هذا القسم على وصفات طعام لتثبيت التطبيقات بكفاءة على أجهزة مخصَّصة.

تخزين حِزم التطبيقات في ذاكرة التخزين المؤقت

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

يتم تثبيت حزمة APK المُخزَّنة مؤقّتًا (المثبَّتة مسبقًا على الجهاز) على مرحلتَين:

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

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

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

يوضِّح النموذج التالي كيف يمكنك استخدام طلبات البيانات من واجهة برمجة التطبيقات هذه من خلال مشرف جهاز مُدار بالكامل ومستخدم ثانوي:

Kotlin

// Set the package to keep. This method assumes that the package is already
// installed on the device by managed Google Play.
val cachedAppPackageName = "com.example.android.myapp"
dpm.setKeepUninstalledPackages(adminName, listOf(cachedAppPackageName))

// ...

// The admin of a secondary user installs the app.
val success = dpm.installExistingPackage(adminName, cachedAppPackageName)

Java

// Set the package to keep. This method assumes that the package is already
// installed on the device by managed Google Play.
String cachedAppPackageName = "com.example.android.myapp";
List<String> packages = new ArrayList<String>();
packages.add(cachedAppPackageName);
dpm.setKeepUninstalledPackages(adminName, packages);

// ...

// The admin of a secondary user installs the app.
boolean success = dpm.installExistingPackage(adminName, cachedAppPackageName);

تفويض التطبيقات

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

لإجراء طلب تفويض DevicePolicyManager.setDelegatedScopes() وتضمين DELEGATION_KEEP_UNINSTALLED_PACKAGES في وسيطة النطاقات. يوضح المثال التالي كيف يمكنك جعل تطبيق آخر هو المفوَّض:

Kotlin

var delegatePackageName = "com.example.tools.kept_app_assist"

// Check that the package is installed before delegating.
try {
    context.packageManager.getPackageInfo(delegatePackageName, 0)
    dpm.setDelegatedScopes(
            adminName,
            delegatePackageName,
            listOf(DevicePolicyManager.DELEGATION_KEEP_UNINSTALLED_PACKAGES))
} catch (e: PackageManager.NameNotFoundException) {
    // The delegate app isn't installed. Send a report to the IT admin ...
}

Java

String delegatePackageName = "com.example.tools.kept_app_assist";

// Check that the package is installed before delegating.
try {
  context.getPackageManager().getPackageInfo(delegatePackageName, 0);
  dpm.setDelegatedScopes(
      adminName,
      delegatePackageName,
      Arrays.asList(DevicePolicyManager.DELEGATION_KEEP_UNINSTALLED_PACKAGES));
} catch (PackageManager.NameNotFoundException e) {
  // The delegate app isn't installed. Send a report to the IT admin ...
}

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

تثبيت حِزم التطبيقات

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

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

الجدول 2. إصدارات Android التي تتيح تثبيت الحزم بدون تفاعل المستخدم
إصدار Android المكوِّن الخاص بالمشرف للتثبيت وإلغاء التثبيت
Android 9.0 (المستوى 28 من واجهة برمجة التطبيقات) أو إصدار أحدث المستخدمون الثانويون التابعون والملفات الشخصية للعمل على الأجهزة المُدارة بالكامل
Android 6.0 (المستوى 23 من واجهة برمجة التطبيقات) أو إصدار أحدث أجهزة مُدارة بالكامل

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

يمكنك استخدام PackageInstaller.Session لإنشاء جلسة تضيف حزمة APK أو أكثر إلى قائمة الانتظار للتثبيت. في المثال التالي، نتلقى ملاحظات الحالة في النشاط (وضع singleTop) ولكن يمكنك استخدام خدمة أو مستقبِل بث:

Kotlin

// First, create a package installer session.
val packageInstaller = context.packageManager.packageInstaller
val params = PackageInstaller.SessionParams(
        PackageInstaller.SessionParams.MODE_FULL_INSTALL)
val sessionId = packageInstaller.createSession(params)
val session = packageInstaller.openSession(sessionId)

// Add the APK binary to the session. The APK is included in our app binary
// and is read from res/raw but file storage is a more typical location.
// The I/O streams can't be open when installation begins.
session.openWrite("apk", 0, -1).use { output ->
    getContext().resources.openRawResource(R.raw.app).use { input ->
        input.copyTo(output, 2048)
    }
}

// Create a status receiver to report progress of the installation.
// We'll use the current activity.
// Here we're requesting status feedback to our Activity but this can be a
// service or broadcast receiver.
val intent = Intent(context, activity.javaClass)
intent.action = "com.android.example.APK_INSTALLATION_ACTION"
val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0)
val statusReceiver = pendingIntent.intentSender

// Start the installation. Because we're an admin of a fully managed device,
// there isn't any user interaction.
session.commit(statusReceiver)

Java

// First, create a package installer session.
PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
    PackageInstaller.SessionParams.MODE_FULL_INSTALL);
int sessionId = packageInstaller.createSession(params);
PackageInstaller.Session session = packageInstaller.openSession(sessionId);

// Add the APK binary to the session. The APK is included in our app binary
// and is read from res/raw but file storage is a more typical location.
try (
    // These I/O streams can't be open when installation begins.
    OutputStream output = session.openWrite("apk", 0, -1);
    InputStream input = getContext().getResources().openRawResource(R.raw.app);
) {
  byte[] buffer = new byte[2048];
  int n;
  while ((n = input.read(buffer)) >= 0) {
    output.write(buffer, 0, n);
  }
}

// Create a status receiver to report progress of the installation.
// We'll use the current activity.
// Here we're requesting status feedback to our Activity but this can be a
// service or broadcast receiver.
Intent intent = new Intent(context, getActivity().getClass());
intent.setAction("com.android.example.APK_INSTALLATION_ACTION");
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
IntentSender statusReceiver = pendingIntent.getIntentSender();

// Start the installation. Because we're an admin of a fully managed device,
// there isn't any user interaction.
session.commit(statusReceiver);

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

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

تجميد تحديثات النظام

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

الإعداد عن بُعد

تسمح عمليات الضبط المُدارة في Android لمشرفي تكنولوجيا المعلومات بضبط تطبيقك عن بُعد. قد تحتاج إلى عرض إعدادات مثل القوائم المسموح بها أو مضيفي الشبكة أو عناوين URL للمحتوى لجعل تطبيقك أكثر فائدة لمشرفي تكنولوجيا المعلومات.

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

إعداد التطوير

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

  1. أنشئ تطبيق وحدة التحكّم بسياسة الجهاز (DPC) وثبِّته على الجهاز.
  2. تأكّد من عدم وجود حسابات على الجهاز.
  3. شغِّل الأمر التالي في واجهة أوامر Android Debug Bridge (adb). تحتاج إلى استبدال com.example.dpc/.MyDeviceAdminReceiver في المثال باسم المكون لمشرف التطبيق:

    adb shell dpm set-device-owner com.example.dpc/.MyDeviceAdminReceiver

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

مراجع إضافية

لمعرفة المزيد من المعلومات عن الأجهزة المخصّصة، يمكنك قراءة المستندات التالية: