Sổ tay thiết kế riêng cho thiết bị

Sổ tay nấu ăn này giúp các nhà phát triển và các đối tác tích hợp hệ thống nâng cao khả năng chuyên môn của họ thiết bị của bạn. Hãy làm theo công thức hướng dẫn của chúng tôi để tìm giải pháp cho thiết bị chuyên dụng của Google. Sổ tay nấu ăn này phù hợp nhất với các nhà phát triển đã có sẵn thiết bị di động—nếu bạn chỉ mới bắt đầu, hãy đọc Thiết bị chuyên dụng tổng quan.

Ứng dụng tuỳ chỉnh trên màn hình chính

Các công thức này sẽ hữu ích nếu bạn đang phát triển một ứng dụng để thay thế Android Home màn hình và Trình chạy.

Trở thành ứng dụng trên màn hình chính

Bạn có thể đặt ứng dụng của mình làm ứng dụng trên màn hình chính của thiết bị để ứng dụng đó được khởi chạy tự động khi thiết bị khởi động. Bạn cũng có thể bật Trang chủ nút đưa ứng dụng trong danh sách cho phép của bạn lên nền trước ở chế độ khoá chế độ tác vụ.

Tất cả các ứng dụng trong nhà đều xử lý danh mục ý định CATEGORY_HOME – đây là là cách hệ thống nhận dạng một ứng dụng trên màn hình chính. Để trở thành ứng dụng mặc định trên màn hình chính, hãy đặt một ứng dụng của các hoạt động trong ứng dụng với vai trò là trình xử lý ý định ưu tiên trên Trang chủ, bằng cách gọi DevicePolicyManager.addPersistentPreferredActivity() như trong ví dụ sau:

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

Bạn vẫn cần khai báo bộ lọc ý định trong tệp kê khai ứng dụng như minh hoạ trong đoạn mã XML sau:

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

Thông thường, bạn không muốn ứng dụng trình chạy của mình xuất hiện trên màn hình Tổng quan. Tuy nhiên, bạn không cần thêm excludeFromRecents vào phần khai báo hoạt động vì Trình chạy của Android ẩn phần khởi chạy ban đầu hoạt động khi hệ thống đang chạy ở chế độ khoá tác vụ.

Hiện các việc cần làm riêng biệt

FLAG_ACTIVITY_NEW_TASK có thể là một cờ hữu ích cho ứng dụng loại trình chạy vì mỗi nhiệm vụ mới sẽ xuất hiện dưới dạng một mục riêng trong Màn hình tổng quan. Để tìm hiểu thêm về các việc cần làm trên màn hình Tổng quan, hãy đọc Gần đây Màn hình.

Ki-ốt công khai

Những công thức này rất phù hợp với các thiết bị không giám sát ở nơi công cộng, nhưng cũng giúp nhiều người dùng thiết bị chuyên dụng tập trung vào công việc của họ.

Khoá thiết bị

Để đảm bảo thiết bị được sử dụng đúng mục đích, bạn có thể thêm các hạn chế đối với người dùng được liệt kê trong bảng 1.

Bảng 1. Các hạn chế đối với người dùng đối với thiết bị kiosk
Giới hạn đối với người dùng Mô tả
DISALLOW_FACTORY_RESET Ngăn người dùng thiết bị đặt lại thiết bị về mặc định ban đầu. Quản trị viên của các thiết bị được quản lý hoàn toàn và người dùng chính có thể đặt tuỳ chọn này .
DISALLOW_SAFE_BOOT Ngăn người dùng thiết bị khởi động thiết bị trong chế độ an toàn hệ thống sẽ không tự động chạy ứng dụng của bạn. Quản trị viên của toàn bộ thiết bị được quản lý và người dùng chính có thể đặt hạn chế này.
DISALLOW_MOUNT_PHYSICAL_MEDIA Ngăn người dùng thiết bị kết nối bất kỳ phương tiện bộ nhớ nào mà họ có thể gắn vào thiết bị. Quản trị viên của các thiết bị được quản lý hoàn toàn và người dùng chính có thể đặt hạn chế này.
DISALLOW_ADJUST_VOLUME Tắt tiếng thiết bị và không cho người dùng thiết bị thay đổi âm thanh cài đặt âm lượng và rung. Kiểm tra để đảm bảo rằng kiosk của bạn không cần âm thanh để phát nội dung nghe nhìn hoặc dùng bộ tính năng hỗ trợ tiếp cận. Quản trị viên của các miền được quản lý hoàn toàn thiết bị, người dùng chính, người dùng phụ và hồ sơ công việc đều có thể đặt tuỳ chọn này .
DISALLOW_ADD_USER Ngăn người dùng thiết bị thêm người dùng mới, chẳng hạn như người dùng phụ hoặc người dùng bị hạn chế. Hệ thống tự động thêm giới hạn người dùng này vào thiết bị được quản lý hoàn toàn nhưng có thể đã bị xoá. Quản trị viên của toàn bộ thiết bị được quản lý và người dùng chính có thể đặt hạn chế này.

Đoạn mã sau đây cho biết cách bạn có thể đặt các quy định hạn chế:

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

Bạn nên loại bỏ các hạn chế này khi ứng dụng ở chế độ quản trị viên để rằng quản trị viên CNTT vẫn có thể sử dụng các tính năng này để bảo trì thiết bị. Để xoá giới hạn, gọi DevicePolicyManager.clearUserRestriction().

Loại bỏ hộp thoại lỗi

Trong một số môi trường, chẳng hạn như các khu trưng bày bán lẻ hoặc thông tin công khai bạn không nên cho người dùng thấy hộp thoại lỗi. Trong Android 9.0 (API cấp 28) trở lên, bạn có thể chặn hộp thoại lỗi hệ thống đối với những sự cố hoặc không phản hồi bằng cách thêm DISALLOW_SYSTEM_ERROR_DIALOGS người dùng . Hệ thống khởi động lại các ứng dụng không phản hồi như thể người dùng thiết bị đóng ứng dụng khỏi hộp thoại. Ví dụ sau đây cho thấy cách thực hiện việc này:

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

Nếu quản trị viên của người dùng chính hoặc phụ đặt hạn chế này, hệ thống chặn hộp thoại báo lỗi cho riêng người dùng đó. Nếu quản trị viên của một miền được quản lý toàn bộ thiết bị đặt hạn chế này, hệ thống sẽ chặn hộp thoại đối với tất cả người dùng.

Luôn bật màn hình

Nếu đang xây dựng kiosk, bạn có thể ngăn thiết bị truy cập ngủ khi đang chạy hoạt động của ứng dụng. Thêm cờ bố cục FLAG_KEEP_SCREEN_ON cho ứng dụng của bạn như trong ví dụ sau:

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

Bạn nên kiểm tra để đảm bảo rằng thiết bị đã cắm vào nguồn AC, USB hay không dây bộ sạc. Đăng ký nhận thông báo thay đổi pin và sử dụng BatteryManager để khám phá trạng thái sạc. Bạn thậm chí có thể gửi cảnh báo từ xa cho nhân viên CNTT quản trị viên nếu thiết bị không được cắm sạc. Để biết hướng dẫn từng bước, hãy đọc Theo dõi mức pin và quá trình sạc Trạng thái.

Bạn cũng có thể đặt STAY_ON_WHILE_PLUGGED_IN để duy trì trạng thái bật của thiết bị trong khi kết nối với nguồn điện. Quản trị viên của các thiết bị được quản lý hoàn toàn trong Android 6.0 (API cấp 23) trở lên có thể gọi DevicePolicyManager.setGlobalSetting() như minh hoạ trong ví dụ sau:

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

Gói ứng dụng

Phần này trình bày các công thức giúp cài đặt hiệu quả ứng dụng trên các thiết bị chuyên dụng.

Lưu gói ứng dụng vào bộ nhớ đệm

Nếu người dùng một thiết bị dùng chung đều dùng chung một nhóm ứng dụng, tránh tải ứng dụng xuống bất cứ khi nào có thể. Để đơn giản hoá quy trình xem xét người dùng cấp phép trên các thiết bị dùng chung với một nhóm người dùng cố định, chẳng hạn như thiết bị cho shift worker, trong Android 9.0 (API cấp 28) trở lên, bạn có thể lưu ứng dụng vào bộ nhớ đệm (APK) cần thiết cho phiên nhiều người dùng.

Quá trình cài đặt APK đã lưu vào bộ nhớ đệm (đã cài đặt trên thiết bị) diễn ra sau hai giai đoạn:

  1. Thành phần quản trị của một thiết bị được quản lý hoàn toàn (hoặc người được uỷ quyền – hãy xem theo dõi) đặt danh sách tệp APK cần lưu lại trên thiết bị.
  2. Thành phần quản trị của người dùng phụ được liên kết (hoặc người được uỷ quyền) có thể cài đặt APK được lưu vào bộ nhớ đệm thay mặt cho người dùng. Quản trị viên của các miền được quản lý toàn bộ thiết bị, người dùng chính hoặc hồ sơ công việc được liên kết (hoặc uỷ quyền) cũng có thể cài đặt ứng dụng được lưu vào bộ nhớ đệm nếu cần.

Để thiết lập danh sách tệp APK cần lưu giữ trên thiết bị, quản trị viên sẽ gọi DevicePolicyManager.setKeepUninstalledPackages(). Phương thức này không kiểm tra để đảm bảo rằng tệp APK đã được cài đặt trên thiết bị – sẽ hữu ích nếu bạn muốn cài đặt một ứng dụng ngay trước khi bạn cần ứng dụng đó cho người dùng. Để tải danh sách các gói được đặt trước đó, bạn có thể gọi DevicePolicyManager.getKeepUninstalledPackages(). Sau khi bạn gọi setKeepUninstalledPackages() kèm theo các thay đổi hoặc khi một tệp phụ người dùng bị xóa, hệ thống sẽ xóa mọi APK đã lưu vào bộ nhớ đệm không còn cần thiết.

Để cài đặt APK được lưu vào bộ nhớ đệm, hãy gọi DevicePolicyManager.installExistingPackage(). Phương pháp này chỉ có thể cài đặt một ứng dụng mà hệ thống đã lưu vào bộ nhớ đệm— giải pháp dành riêng cho thiết bị (hoặc người dùng thiết bị) trước tiên phải cài đặt ứng dụng trên thiết bị trước khi bạn có thể gọi phương thức này.

Mẫu sau đây cho thấy cách bạn có thể sử dụng các lệnh gọi API này trong trang quản trị của một thiết bị được quản lý hoàn toàn và người dùng phụ:

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

Uỷ quyền ứng dụng

Bạn có thể uỷ quyền cho một ứng dụng khác quản lý việc lưu vào bộ nhớ đệm của ứng dụng. Bạn có thể thực hiện việc này để tách biệt các tính năng của giải pháp hoặc cung cấp khả năng cho quản trị viên CNTT sử dụng ứng dụng của riêng họ. Ứng dụng được uỷ quyền sẽ nhận được các quyền giống như quản trị viên thành phần. Ví dụ: ứng dụng được uỷ quyền cho quản trị viên của người dùng phụ có thể gọi installExistingPackage() nhưng không thể gọi setKeepUninstalledPackages().

Để thực hiện cuộc gọi được uỷ quyền DevicePolicyManager.setDelegatedScopes() và bao gồm DELEGATION_KEEP_UNINSTALLED_PACKAGES trong đối số phạm vi. Ví dụ sau đây trình bày cách tạo một ứng dụng khác người được uỷ quyền:

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

Nếu mọi thứ diễn ra suôn sẻ, ứng dụng uỷ quyền sẽ nhận được ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED truyền tin và trở thành đại biểu. Ứng dụng có thể gọi các phương thức trong hướng dẫn này như thể đó là chủ sở hữu thiết bị hoặc chủ sở hữu hồ sơ. Khi gọi Phương thức DevicePolicyManager, phương thức uỷ quyền sẽ truyền null cho quản trị viên đối số thành phần.

Cài đặt gói ứng dụng

Đôi khi, bạn nên cài đặt một ứng dụng tuỳ chỉnh được lưu vào bộ nhớ đệm cục bộ trên một thiết bị. Ví dụ: các thiết bị chuyên dụng thường được triển khai để các môi trường bị giới hạn băng thông hoặc các khu vực không có kết nối Internet. Thông tin giải pháp thiết bị chuyên dụng cần lưu ý đến băng thông của khách hàng. Thông tin ứng dụng có thể bắt đầu cài đặt một gói ứng dụng (APK) khác bằng cách sử dụng Lớp PackageInstaller.

Mặc dù bất kỳ ứng dụng nào cũng có thể cài đặt APK nhưng quản trị viên trên các thiết bị được quản lý hoàn toàn cũng có thể cài đặt (hoặc gỡ cài đặt) gói mà không cần sự can thiệp của người dùng. Quản trị viên có thể quản lý thiết bị, người dùng phụ được liên kết hoặc hồ sơ công việc được liên kết. Sau khi hoàn tất quá trình cài đặt, hệ thống sẽ đăng thông báo rằng tất cả người dùng thiết bị xem. Thông báo này cho người dùng thiết bị biết rằng ứng dụng đã được cài đặt (hoặc do quản trị viên cập nhật).

Bảng 2. Các phiên bản Android hỗ trợ cài đặt gói mà không có sự tương tác của người dùng
Phiên bản Android Thành phần quản trị để cài đặt và gỡ cài đặt
Android 9.0 (API cấp 28) trở lên Người dùng phụ được liên kết và hồ sơ công việc – cả hai đều trên được quản lý hoàn toàn thiết bị
Android 6.0 (API cấp 23) trở lên Thiết bị được quản lý hoàn toàn

Cách bạn phân phối một hoặc nhiều bản sao của APK cho các thiết bị chuyên dụng sẽ phụ thuộc vào khoảng cách của các thiết bị và có thể là mức độ cách xa các thiết bị là của nhau. Giải pháp của bạn cần tuân thủ các phương pháp hay nhất về bảo mật trước khi cài đặt tệp APK trên thiết bị chuyên dụng.

Bạn có thể sử dụng PackageInstaller.Session để tạo một phiên trong hàng đợi hoặc nhiều APK khác để cài đặt. Trong ví dụ sau, chúng ta nhận trạng thái phản hồi trong chế độ hoạt động (singleTop) của chúng tôi, nhưng bạn có thể sử dụng dịch vụ hoặc broadcast receiver:

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

Phiên này gửi ý định về trạng thái cài đặt. Séc trường EXTRA_STATUS của mỗi ý định để lấy thông tin trạng thái. Xin lưu ý rằng quản trị viên sẽ không nhận được Cập nhật trạng thái trong STATUS_PENDING_USER_ACTION vì người dùng thiết bị không cần phê duyệt việc cài đặt.

Để gỡ cài đặt ứng dụng, bạn có thể gọi PackageInstaller.uninstall. Quản trị viên của các thiết bị, người dùng và hồ sơ công việc được quản lý hoàn toàn có thể gỡ cài đặt các gói mà không cần người dùng tương tác khi chạy các phiên bản Android được hỗ trợ (xem bảng 2).

Cố định bản cập nhật hệ thống

Thiết bị Android nhận bản cập nhật hệ thống và ứng dụng qua mạng không dây (OTA) phần mềm. Để cố định phiên bản hệ điều hành trong các khoảng thời gian quan trọng, chẳng hạn như ngày lễ hoặc vào những thời điểm khác, các thiết bị chuyên dụng có thể tạm ngưng các bản cập nhật hệ thống OTA trong tối đa 90 ngày. Để tìm hiểu thêm, hãy đọc bài viết Quản lý bản cập nhật hệ thống.

Cấu hình từ xa

Cấu hình được quản lý của Android cho phép quản trị viên CNTT định cấu hình ứng dụng từ xa. Bạn có thể muốn hiển thị các cài đặt như danh sách cho phép, máy chủ lưu trữ mạng hoặc URL nội dung để giúp ứng dụng của bạn trở nên hữu ích hơn đối với bộ phận CNTT quản trị viên.

Nếu ứng dụng tiết lộ cấu hình, hãy nhớ đưa các chế độ cài đặt này vào tài liệu. Để tìm hiểu thêm về việc hiển thị cấu hình của ứng dụng và phản ứng với các thay đổi trong chế độ cài đặt, hãy đọc bài viết Thiết lập cấu hình được quản lý.

Thiết lập quá trình phát triển

Trong khi bạn phát triển giải pháp cho các thiết bị chuyên dụng, đôi khi hữu ích khi đặt ứng dụng của bạn làm quản trị viên của một thiết bị được quản lý toàn diện mà không cần chuyển đến trạng thái ban đầu đã đặt lại. Để đặt quyền quản trị viên của một thiết bị được quản lý toàn diện, hãy làm theo các bước sau:

  1. Tạo và cài đặt ứng dụng trình kiểm soát chính sách thiết bị (DPC) trên thiết bị.
  2. Kiểm tra để đảm bảo rằng không có tài khoản nào trên thiết bị.
  3. Chạy lệnh sau trong shell Cầu gỡ lỗi Android (adb). Bạn cần thay thế com.example.dpc/.MyDeviceAdminReceiver trong ví dụ bằng tên thành phần quản trị của ứng dụng:

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

Để giúp khách hàng triển khai giải pháp của bạn, bạn cần xem các quy trình đăng ký khác . Bạn nên đăng ký mã QR cho các thiết bị chuyên dụng.

Tài nguyên khác

Để tìm hiểu thêm về các thiết bị chuyên dụng, hãy đọc các tài liệu sau: