کتاب آشپزی دستگاه های اختصاصی

این کتاب آشپزی به توسعه دهندگان و یکپارچه سازان سیستم کمک می کند تا راه حل اختصاصی دستگاه خود را بهبود بخشند. برای یافتن راه‌حل‌هایی برای رفتارهای اختصاصی دستگاه، دستورالعمل‌های دستورالعمل‌های ما را دنبال کنید. این کتاب آشپزی برای توسعه دهندگانی که قبلاً یک برنامه دستگاه اختصاصی دارند بهترین کار را انجام می دهد - اگر تازه شروع کرده اید، مرور کلی دستگاه های اختصاصی را بخوانید.

برنامه های سفارشی Home

اگر در حال توسعه برنامه ای برای جایگزینی صفحه اصلی و لانچر اندروید هستید، این دستور العمل ها مفید هستند.

اپلیکیشن خانه باشید

می‌توانید برنامه خود را به‌عنوان برنامه اصلی دستگاه تنظیم کنید تا با راه‌اندازی دستگاه به‌طور خودکار راه‌اندازی شود. همچنین می‌توانید دکمه Home را فعال کنید که برنامه فهرست مجاز شما را در حالت کار قفل به پیش‌زمینه می‌آورد.

همه برنامه‌های خانگی دسته‌بندی هدف CATEGORY_HOME را مدیریت می‌کنند—اینگونه است که سیستم یک برنامه خانگی را تشخیص می‌دهد. برای تبدیل شدن به برنامه خانگی پیش‌فرض، با فراخوانی DevicePolicyManager.addPersistentPreferredActivity() یکی از فعالیت‌های برنامه‌تان را به‌عنوان کنترل‌کننده هدف Home ترجیحی تنظیم کنید، همانطور که در مثال زیر نشان داده شده است:

کاتلین

// 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)

جاوا

// 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 . محدودیت های کاربر برای دستگاه های کیوسک
محدودیت کاربر توضیحات
DISALLOW_FACTORY_RESET از بازنشانی دستگاه به پیش‌فرض‌های کارخانه توسط کاربر دستگاه جلوگیری می‌کند. مدیران دستگاه های کاملاً مدیریت شده و کاربر اصلی می توانند این محدودیت را تعیین کنند.
DISALLOW_SAFE_BOOT از راه‌اندازی دستگاه در حالت امن توسط کاربر دستگاه جلوگیری می‌کند، جایی که سیستم به‌طور خودکار برنامه شما را راه‌اندازی نمی‌کند. مدیران دستگاه های کاملاً مدیریت شده و کاربر اصلی می توانند این محدودیت را تعیین کنند.
DISALLOW_MOUNT_PHYSICAL_MEDIA کاربر دستگاه را از نصب حجم‌های ذخیره‌سازی که ممکن است به دستگاه متصل کند جلوگیری می‌کند. مدیران دستگاه های کاملاً مدیریت شده و کاربر اصلی می توانند این محدودیت را تعیین کنند.
DISALLOW_ADJUST_VOLUME دستگاه را بی صدا می کند و کاربر دستگاه را از تغییر تنظیمات حجم صدا و لرزش جلوگیری می کند. بررسی کنید که کیوسک شما به صدا برای پخش رسانه یا ویژگی‌های دسترس‌پذیری نیاز ندارد. مدیران دستگاه‌های کاملاً مدیریت‌شده، کاربر اصلی، کاربران ثانویه و نمایه‌های کاری می‌توانند این محدودیت را تعیین کنند.
DISALLOW_ADD_USER از افزودن کاربران جدید از جمله کاربران ثانویه یا کاربران محدود توسط کاربر دستگاه جلوگیری می کند. سیستم به طور خودکار این محدودیت کاربر را به دستگاه های کاملاً مدیریت شده اضافه می کند، اما ممکن است پاک شده باشد. مدیران دستگاه های کاملاً مدیریت شده و کاربر اصلی می توانند این محدودیت را تعیین کنند.

قطعه زیر نشان می دهد که چگونه می توانید محدودیت ها را تنظیم کنید:

کاتلین

// 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) }

جاوا

// 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 (سطح API 28) یا بالاتر، می‌توانید با افزودن محدودیت کاربر DISALLOW_SYSTEM_ERROR_DIALOGS ، دیالوگ‌های خطای سیستم را برای برنامه‌های خراب یا بی‌پاسخ سرکوب کنید. سیستم برنامه‌های بدون پاسخ را مجدداً راه‌اندازی می‌کند، گویی کاربر دستگاه برنامه را از کادر گفتگو بسته است. مثال زیر نشان می دهد که چگونه می توانید این کار را انجام دهید:

کاتلین

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

    dpm.addUserRestriction(adminName, UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS)
}

جاوا

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

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

اگر مدیر کاربر اصلی یا ثانویه این محدودیت را تعیین کند، سیستم گفتگوهای خطا را فقط برای آن کاربر سرکوب می کند. اگر سرپرست یک دستگاه کاملاً مدیریت شده این محدودیت را تعیین کند، سیستم گفتگوها را برای همه کاربران سرکوب می کند.

صفحه نمایش را روشن نگه دارید

اگر در حال ساخت کیوسک هستید، می‌توانید زمانی که دستگاهی در حال اجرای فعالیت برنامه شما است، به حالت خوابیدن متوقف شود . همانطور که در مثال زیر نشان داده شده است، پرچم طرح بندی FLAG_KEEP_SCREEN_ON را به پنجره برنامه خود اضافه کنید:

کاتلین

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)
}

جاوا

@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);
}

ممکن است بخواهید بررسی کنید که دستگاه به شارژر AC، USB یا بی سیم وصل شده باشد. برای پخش تغییر باتری ثبت نام کنید و از مقادیر BatteryManager برای کشف وضعیت شارژ استفاده کنید. حتی می‌توانید هشدارهای راه دور را برای سرپرست فناوری اطلاعات در صورت قطع شدن دستگاه از راه دور ارسال کنید. برای دستورالعمل های گام به گام، نظارت بر سطح باتری و وضعیت شارژ را بخوانید.

همچنین می‌توانید تنظیم کلی STAY_ON_WHILE_PLUGGED_IN را برای بیدار نگه داشتن دستگاه در حین اتصال به منبع برق تنظیم کنید. ادمین‌های دستگاه‌های کاملاً مدیریت‌شده، در Android نسخه ۶.۰ (سطح API ۲۳) یا بالاتر، می‌توانند با DevicePolicyManager.setGlobalSetting() همانطور که در مثال زیر نشان داده شده است تماس بگیرند:

کاتلین

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())

جاوا

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 نسخه ۹.۰ (سطح API 28) یا جدیدتر، می‌توانید بسته‌های برنامه (APK) را که برای جلسات چند کاربره لازم است ذخیره کنید.

نصب یک APK حافظه پنهان (که قبلاً روی دستگاه نصب شده است) در دو مرحله انجام می شود:

  1. مؤلفه سرپرست یک دستگاه کاملاً مدیریت شده (یا نماینده - به زیر مراجعه کنید ) فهرستی از APKها را برای نگهداری در دستگاه تنظیم می کند.
  2. اجزای سرپرست کاربران ثانویه وابسته (یا نمایندگان آنها) می توانند APK ذخیره شده را از طرف کاربر نصب کنند. سرپرست‌های دستگاه کاملاً مدیریت‌شده، کاربر اصلی یا یک نمایه کاری وابسته (یا نمایندگان آنها) نیز می‌توانند در صورت نیاز برنامه ذخیره‌شده را نصب کنند.

سرپرست برای تنظیم لیستی از فایل‌های APK برای نگهداری در دستگاه، DevicePolicyManager.setKeepUninstalledPackages() را فرا می‌خواند. این روش بررسی نمی‌کند که APK بر روی دستگاه نصب شده باشد. برای دریافت لیستی از بسته های تنظیم شده قبلی، می توانید با DevicePolicyManager.getKeepUninstalledPackages() تماس بگیرید. پس از اینکه setKeepUninstalledPackages() با تغییرات فراخوانی کردید، یا وقتی یک کاربر ثانویه حذف شد، سیستم هر APK ذخیره شده ای را که دیگر مورد نیاز نیست حذف می کند.

برای نصب یک APK حافظه پنهان، با DevicePolicyManager.installExistingPackage() تماس بگیرید. این روش فقط می‌تواند برنامه‌ای را نصب کند که سیستم قبلاً آن را در حافظه پنهان ذخیره کرده است—راه‌حل دستگاه اختصاصی شما (یا کاربر یک دستگاه) باید ابتدا برنامه را روی دستگاه نصب کند تا بتوانید با این روش تماس بگیرید.

نمونه زیر نشان می‌دهد که چگونه می‌توانید از این تماس‌های API در ادمین یک دستگاه کاملاً مدیریت شده و کاربر ثانویه استفاده کنید:

کاتلین

// 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)

جاوا

// 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 را در آرگومان scopes قرار دهید. مثال زیر نشان می‌دهد که چگونه می‌توانید یک برنامه دیگر را به نمایندگی تبدیل کنید:

کاتلین

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 ...
}

جاوا

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 برای آرگومان جزء مدیریت ارسال می کند.

بسته های برنامه را نصب کنید

گاهی اوقات نصب یک برنامه سفارشی ذخیره شده محلی روی یک دستگاه اختصاصی مفید است. به عنوان مثال، دستگاه های اختصاصی اغلب در محیط ها یا مناطق با پهنای باند محدود بدون اتصال به اینترنت مستقر می شوند. راه حل اختصاصی دستگاه شما باید مراقب پهنای باند مشتریان شما باشد. برنامه شما می‌تواند با استفاده از کلاس‌های PackageInstaller ، نصب بسته برنامه دیگری (APK) را شروع کند.

در حالی که هر برنامه‌ای می‌تواند فایل‌های APK را نصب کند، سرپرستان دستگاه‌های کاملاً مدیریت شده می‌توانند بسته‌ها را بدون تعامل کاربر نصب کنند (یا حذف نصب کنند). سرپرست ممکن است دستگاه، یک کاربر ثانویه وابسته یا یک نمایه کاری وابسته را مدیریت کند. پس از اتمام نصب، سیستم یک اعلان ارسال می کند که همه کاربران دستگاه می بینند. این اعلان به کاربران دستگاه اطلاع می دهد که برنامه توسط سرپرست آنها نصب شده (یا به روز شده است).

جدول 2 . نسخه های اندرویدی که از نصب بسته بدون تعامل کاربر پشتیبانی می کنند
نسخه اندروید کامپوننت مدیریت برای نصب و حذف
Android 9.0 (سطح API 28) یا بالاتر کاربران ثانویه وابسته و نمایه های کاری — هر دو در دستگاه های کاملاً مدیریت شده
Android 6.0 (سطح API 23) یا بالاتر دستگاه های کاملا مدیریت شده

نحوه توزیع یک یا چند نسخه از APK در دستگاه‌های اختصاصی به میزان دور بودن دستگاه‌ها و احتمالاً فاصله دستگاه‌ها از یکدیگر بستگی دارد. راه حل شما باید قبل از نصب فایل های APK در دستگاه های اختصاصی، بهترین شیوه های امنیتی را دنبال کند.

می‌توانید از PackageInstaller.Session برای ایجاد جلسه‌ای استفاده کنید که یک یا چند APK را برای نصب در صف قرار می‌دهد. در مثال زیر ما بازخورد وضعیت را در فعالیت خود دریافت می کنیم (حالت singleTop ) اما می توانید از یک گیرنده سرویس یا پخش استفاده کنید:

کاتلین

// 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)

جاوا

// 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);

جلسه با استفاده از intent بازخورد وضعیت در مورد نصب را ارسال می کند. برای دریافت وضعیت ، فیلد EXTRA_STATUS هر هدف را بررسی کنید. به یاد داشته باشید، مدیران به‌روزرسانی وضعیت STATUS_PENDING_USER_ACTION را دریافت نمی‌کنند زیرا کاربر دستگاه نیازی به تأیید نصب ندارد.

برای حذف نصب برنامه‌ها، می‌توانید با PackageInstaller.uninstall تماس بگیرید. سرپرستان دستگاه‌های کاملاً مدیریت‌شده، کاربران و نمایه‌های کاری می‌توانند بسته‌ها را بدون تعامل با کاربر در حال اجرای نسخه‌های Android پشتیبانی‌شده حذف نصب کنند ( جدول 2 را ببینید).

به روز رسانی سیستم را مسدود کنید

دستگاه‌های Android به‌روزرسانی‌های هوایی (OTA) سیستم و نرم‌افزار کاربردی را دریافت می‌کنند. برای مسدود کردن نسخه سیستم عامل در دوره‌های بحرانی، مانند تعطیلات یا دیگر زمان‌های شلوغ، دستگاه‌های اختصاصی می‌توانند به‌روزرسانی‌های سیستم OTA را تا 90 روز به حالت تعلیق درآورند. برای اطلاعات بیشتر، مدیریت به‌روزرسانی‌های سیستم را بخوانید.

پیکربندی از راه دور

پیکربندی‌های مدیریت‌شده Android به مدیران فناوری اطلاعات اجازه می‌دهد برنامه شما را از راه دور پیکربندی کنند. ممکن است بخواهید تنظیماتی مانند لیست‌های مجاز، میزبان‌های شبکه، یا نشانی‌های وب محتوا را به نمایش بگذارید تا برنامه‌تان برای مدیران فناوری اطلاعات مفیدتر باشد.

اگر برنامه شما پیکربندی خود را نشان می دهد، به یاد داشته باشید که تنظیمات را در اسناد خود قرار دهید. برای کسب اطلاعات بیشتر درباره افشای پیکربندی برنامه و واکنش به تغییرات در تنظیمات، تنظیم تنظیمات مدیریت شده را بخوانید.

راه اندازی توسعه

در حالی که در حال توسعه راه حل خود برای دستگاه های اختصاصی هستید، گاهی اوقات مفید است که برنامه خود را به عنوان سرپرست یک دستگاه کاملاً مدیریت شده بدون تنظیم مجدد کارخانه تنظیم کنید. برای تنظیم ادمین یک دستگاه کاملاً مدیریت شده، این مراحل را دنبال کنید:

  1. برنامه کنترل کننده خط مشی دستگاه (DPC) خود را روی دستگاه بسازید و نصب کنید.
  2. بررسی کنید که هیچ حسابی در دستگاه وجود نداشته باشد.
  3. دستور زیر را در پوسته Android Debug Bridge (adb) اجرا کنید. شما باید com.example.dpc/.MyDeviceAdminReceiver را در مثال با نام مؤلفه سرپرست برنامه خود جایگزین کنید:

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

برای کمک به مشتریان در به کارگیری راه حل شما، باید به روش های دیگر ثبت نام نگاه کنید. ما ثبت نام با کد QR را برای دستگاه های اختصاصی توصیه می کنیم.

منابع اضافی

برای کسب اطلاعات بیشتر در مورد دستگاه های اختصاصی، اسناد زیر را مطالعه کنید: