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.
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:
- 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ị.
- 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).
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:
- 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ị.
- Kiểm tra để đảm bảo rằng không có tài khoản nào trên thiết bị.
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: