Ngừng sử dụng quản trị viên thiết bị. Kể từ Android 9 (API cấp 28), một số chính sách quản trị sẽ được đánh dấu là không dùng nữa khi được một quản trị viên thiết bị gọi. Bạn nên bắt đầu chuẩn bị cho sự thay đổi này ngay từ bây giờ. Để tìm hiểu thêm và xem các lựa chọn di chuyển, hãy đọc bài viết Ngừng sử dụng quản trị viên thiết bị.
Android hỗ trợ các ứng dụng doanh nghiệp bằng cách cung cấp Android Device Administration API. Device Administration API cung cấp các tính năng quản trị thiết bị ở cấp hệ thống. Các API này cho phép bạn tạo các ứng dụng có tính bảo mật cao, hữu ích trong môi trường doanh nghiệp, trong đó các chuyên gia CNTT cần có quyền kiểm soát toàn diện đối với thiết bị của nhân viên. Ví dụ: ứng dụng Email tích hợp trên Android đã tận dụng các API này để cải thiện khả năng hỗ trợ Exchange. Thông qua ứng dụng Email, quản trị viên Exchange có thể thực thi các chính sách về mật khẩu (bao gồm cả mật khẩu gồm chữ và số hoặc mã PIN bằng số) trên các thiết bị. Quản trị viên cũng có thể xoá sạch dữ liệu từ xa (tức là khôi phục chế độ cài đặt mặc định ban đầu) trên điện thoại bị mất hoặc bị đánh cắp. Người dùng Exchange có thể đồng bộ hoá dữ liệu email và lịch của họ.
Tài liệu này dành cho những nhà phát triển muốn phát triển các giải pháp doanh nghiệp cho thiết bị chạy Android. Nội dung này thảo luận về nhiều tính năng do Device Administration API cung cấp để tăng cường bảo mật cho các thiết bị của nhân viên chạy trên Android.
Lưu ý: Để biết thông tin về cách tạo Trình kiểm soát chính sách công việc cho các hoạt động triển khai Android for Work, hãy xem bài viết Tạo Trình kiểm soát chính sách thiết bị.
Chế độ chủ sở hữu thiết bị không có giao diện người dùng
Android 14 (API cấp 34) giới thiệu chế độ Người dùng hệ thống không có giao diện người dùng (các thiết bị mà UserManager.isHeadlessSystemUserMode
trả về true
). Ở chế độ Người dùng hệ thống không có giao diện người dùng, người dùng hệ thống là người dùng ở chế độ nền và dựa vào những người dùng ở chế độ nền khác để tương tác với người dùng cuối. Android 14 cũng giới thiệu chế độ liên kết chủ sở hữu thiết bị không có giao diện người dùng, chế độ này sẽ thêm một Chủ sở hữu hồ sơ vào tất cả người dùng được liên kết, ngoại trừ người dùng hệ thống mà Chủ sở hữu thiết bị được thiết lập.
Trong các thiết bị được định cấu hình bằng người dùng hệ thống không có giao diện người dùng (trong đó người dùng hệ thống chạy ở chế độ nền), chỉ những chính sách thiết bị có phạm vi toàn cầu (những chính sách áp dụng cho tất cả người dùng) mới được áp dụng cho người dùng hoặc những người dùng ở nền trước. Hãy xem addUserRestriction
để biết thông tin chi tiết.
Các nhà sản xuất thiết bị Android có thể tham khảo hướng dẫn được xuất bản trên source.android.com.
Tổng quan về Device Administration API
Sau đây là ví dụ về các loại ứng dụng có thể sử dụng Device Administration API:
- Ứng dụng email.
- Ứng dụng bảo mật có chức năng xoá dữ liệu từ xa.
- Các ứng dụng và dịch vụ quản lý thiết bị.
Cách thức hoạt động
Bạn sử dụng Device Administration API để viết các ứng dụng quản trị thiết bị mà người dùng cài đặt trên thiết bị của họ. Ứng dụng quản trị thiết bị thực thi các chính sách mong muốn. Cách sử dụng như sau:
- Quản trị viên hệ thống viết một ứng dụng quản trị thiết bị để thực thi các chính sách bảo mật thiết bị từ xa/cục bộ. Các chính sách này có thể được mã hoá cứng vào ứng dụng hoặc ứng dụng có thể tự động tìm nạp các chính sách từ một máy chủ bên thứ ba.
- Ứng dụng này được cài đặt trên thiết bị của người dùng. Android hiện không có giải pháp cung cấp tự động. Sau đây là một số cách mà quản trị viên hệ thống có thể phân phối ứng dụng cho người dùng:
- Google Play.
- Cho phép cài đặt từ một cửa hàng khác.
- Phân phối ứng dụng thông qua các phương tiện khác, chẳng hạn như email hoặc trang web.
- Hệ thống sẽ nhắc người dùng bật ứng dụng quản trị thiết bị. Cách thức và thời điểm điều này xảy ra phụ thuộc vào cách triển khai ứng dụng.
- Sau khi người dùng bật ứng dụng quản trị viên thiết bị, họ sẽ phải tuân theo các chính sách của ứng dụng đó. Việc tuân thủ các chính sách đó thường mang lại nhiều lợi ích, chẳng hạn như quyền truy cập vào các hệ thống và dữ liệu nhạy cảm.
Nếu người dùng không bật ứng dụng quản trị thiết bị, thì ứng dụng đó vẫn sẽ ở trên thiết bị nhưng ở trạng thái không hoạt động. Người dùng sẽ không phải tuân thủ các chính sách của ứng dụng và ngược lại, họ sẽ không nhận được bất kỳ lợi ích nào của ứng dụng, chẳng hạn như họ có thể không đồng bộ hoá được dữ liệu.
Nếu người dùng không tuân thủ các chính sách (ví dụ: nếu người dùng đặt mật khẩu vi phạm nguyên tắc), thì ứng dụng sẽ quyết định cách xử lý trường hợp này. Tuy nhiên, thường thì việc này sẽ khiến người dùng không thể đồng bộ hoá dữ liệu.
Nếu một thiết bị cố gắng kết nối với một máy chủ yêu cầu các chính sách không được hỗ trợ trong Device Administration API, thì thiết bị sẽ không được phép kết nối. Device Administration API hiện không cho phép cung cấp một phần. Nói cách khác, nếu một thiết bị (ví dụ: thiết bị cũ) không hỗ trợ tất cả các chính sách đã nêu, thì bạn không thể cho phép thiết bị đó kết nối.
Nếu một thiết bị có nhiều ứng dụng quản trị đã bật, thì chính sách nghiêm ngặt nhất sẽ được thực thi. Không có cách nào để nhắm đến một ứng dụng quản trị cụ thể.
Để gỡ cài đặt một ứng dụng quản trị thiết bị hiện có, trước tiên, người dùng cần huỷ đăng ký ứng dụng đó với tư cách là quản trị viên.
Chính sách
Trong môi trường doanh nghiệp, thường thì các thiết bị của nhân viên phải tuân thủ một bộ chính sách nghiêm ngặt chi phối việc sử dụng thiết bị. Device Administration API hỗ trợ các chính sách được liệt kê trong Bảng 1. Xin lưu ý rằng Device Administration API hiện chỉ hỗ trợ mật khẩu cho khoá màn hình:
Bảng 1. Các chính sách được Device Administration API hỗ trợ.
Policy | Mô tả |
---|---|
Đã bật mật khẩu | Yêu cầu thiết bị hỏi mã PIN hoặc mật khẩu. |
Độ dài mật khẩu tối thiểu | Đặt số lượng ký tự bắt buộc cho mật khẩu. Ví dụ: bạn có thể yêu cầu mã PIN hoặc mật khẩu phải có ít nhất 6 ký tự. |
Bạn phải nhập mật khẩu dạng chữ và số | Yêu cầu mật khẩu phải có tổ hợp chữ cái và số. Các ký tự này có thể bao gồm cả ký tự biểu tượng. |
Cần có mật khẩu phức tạp | Yêu cầu mật khẩu phải chứa ít nhất một chữ cái, một chữ số và một ký hiệu đặc biệt. Ra mắt trong Android 3.0. |
Số chữ cái tối thiểu cần có trong mật khẩu | Số lượng chữ cái tối thiểu cần có trong mật khẩu cho tất cả hoặc một quản trị viên cụ thể. Ra mắt trong Android 3.0. |
Số chữ cái viết thường tối thiểu cần có trong mật khẩu | Số lượng chữ cái viết thường tối thiểu cần có trong mật khẩu của tất cả quản trị viên hoặc một quản trị viên cụ thể. Ra mắt trong Android 3.0. |
Số ký tự không phải chữ cái tối thiểu cần có trong mật khẩu | Số lượng ký tự không phải chữ cái tối thiểu mà mật khẩu phải có đối với tất cả quản trị viên hoặc một quản trị viên cụ thể. Ra mắt trong Android 3.0. |
Số lượng chữ số tối thiểu bắt buộc trong mật khẩu | Số lượng chữ số tối thiểu bắt buộc trong mật khẩu cho tất cả hoặc một quản trị viên cụ thể. Ra mắt trong Android 3.0. |
Số ký hiệu tối thiểu cần có trong mật khẩu | Số lượng ký hiệu tối thiểu cần có trong mật khẩu của tất cả quản trị viên hoặc một quản trị viên cụ thể. Ra mắt trong Android 3.0. |
Số chữ cái viết hoa tối thiểu cần có trong mật khẩu | Số lượng chữ cái viết hoa tối thiểu cần có trong mật khẩu của tất cả quản trị viên hoặc một quản trị viên cụ thể. Ra mắt trong Android 3.0. |
Thời gian chờ hết hạn mật khẩu | Thời điểm mật khẩu hết hạn, được biểu thị dưới dạng một khoảng thời gian tính bằng mili giây kể từ khi quản trị viên thiết bị đặt thời gian chờ hết hạn. Ra mắt trong Android 3.0. |
Hạn chế về nhật ký mật khẩu | Chính sách này ngăn người dùng sử dụng lại n mật khẩu riêng biệt gần đây nhất.
Chính sách này thường được dùng kết hợp với setPasswordExpirationTimeout() , buộc người dùng phải cập nhật mật khẩu sau một khoảng thời gian cụ thể.
Ra mắt trong Android 3.0. |
Số lần nhập sai mật khẩu tối đa | Chỉ định số lần người dùng có thể nhập sai mật khẩu trước khi thiết bị xoá dữ liệu. Device Administration API cũng cho phép quản trị viên đặt lại thiết bị về trạng thái mặc định ban đầu từ xa. Điều này giúp bảo mật dữ liệu trong trường hợp thiết bị bị mất hoặc bị đánh cắp. |
Khoá thời gian không hoạt động tối đa | Đặt khoảng thời gian kể từ lần cuối cùng người dùng chạm vào màn hình hoặc nhấn một nút cho đến khi thiết bị khoá màn hình. Khi điều này xảy ra, người dùng cần nhập lại mã PIN hoặc mật khẩu thì mới có thể sử dụng thiết bị và truy cập vào dữ liệu. Giá trị có thể nằm trong khoảng từ 1 đến 60 phút. |
Yêu cầu mã hoá bộ nhớ | Chỉ định rằng vùng lưu trữ phải được mã hoá, nếu thiết bị hỗ trợ tính năng này. Ra mắt trong Android 3.0. |
Tắt camera | Chỉ định rằng camera sẽ bị tắt. Xin lưu ý rằng đây không phải là chế độ tắt vĩnh viễn. Bạn có thể bật/tắt camera một cách linh hoạt dựa trên bối cảnh, thời gian, v.v. Ra mắt trong Android 4.0. |
Tính năng khác
Ngoài việc hỗ trợ các chính sách được liệt kê trong bảng trên, Device Administration API còn cho phép bạn làm những việc sau:
- Nhắc người dùng đặt mật khẩu mới.
- Khoá thiết bị ngay lập tức.
- Xoá dữ liệu của thiết bị (tức là khôi phục thiết bị về trạng thái mặc định ban đầu).
Ứng dụng mẫu
Các ví dụ được dùng trên trang này dựa trên mẫu Device Administration API (API Quản trị thiết bị), có trong các mẫu SDK (có trong Trình quản lý SDK Android) và nằm trên hệ thống của bạn dưới dạng <sdk_root>/ApiDemos/app/src/main/java/com/example/android/apis/app/DeviceAdminSample.java
.
Ứng dụng mẫu này cung cấp bản minh hoạ về các tính năng quản trị thiết bị. Ứng dụng này cung cấp cho người dùng một giao diện người dùng cho phép họ bật ứng dụng quản trị thiết bị. Sau khi bật ứng dụng, họ có thể dùng các nút trong giao diện người dùng để làm những việc sau:
- Đặt chất lượng mật khẩu.
- Chỉ định các yêu cầu đối với mật khẩu của người dùng, chẳng hạn như độ dài tối thiểu, số lượng ký tự số tối thiểu mà mật khẩu phải chứa, v.v.
- Đặt mật khẩu. Nếu mật khẩu không tuân thủ các chính sách đã chỉ định, hệ thống sẽ trả về lỗi.
- Đặt số lần nhập sai mật khẩu tối đa trước khi dữ liệu trên thiết bị bị xoá (tức là thiết bị được khôi phục về chế độ cài đặt ban đầu).
- Đặt thời gian từ bây giờ cho đến khi mật khẩu hết hạn.
- Đặt độ dài của nhật ký mật khẩu (độ dài là số lượng mật khẩu cũ được lưu trữ trong nhật ký). Chế độ cài đặt này ngăn người dùng sử dụng lại một trong n mật khẩu gần đây mà họ đã dùng trước đó.
- Chỉ định rằng vùng lưu trữ phải được mã hoá, nếu thiết bị hỗ trợ.
- Đặt khoảng thời gian tối đa không hoạt động có thể trôi qua trước khi thiết bị khoá.
- Khoá thiết bị ngay lập tức.
- Xoá dữ liệu của thiết bị (tức là khôi phục trạng thái cài đặt ban đầu).
- Tắt camera.

Hình 1. Ảnh chụp màn hình ứng dụng mẫu
Phát triển ứng dụng quản trị thiết bị
Quản trị viên hệ thống có thể sử dụng Device Administration API để viết một ứng dụng thực thi việc thực thi chính sách bảo mật thiết bị từ xa/cục bộ. Phần này tóm tắt các bước liên quan đến việc tạo một ứng dụng quản trị thiết bị.
Tạo tệp kê khai
Để sử dụng Device Administration API, tệp kê khai của ứng dụng phải có những nội dung sau:
- Một lớp con của
DeviceAdminReceiver
bao gồm những phần sau:- Quyền
BIND_DEVICE_ADMIN
. - Khả năng phản hồi ý định
ACTION_DEVICE_ADMIN_ENABLED
, được thể hiện trong tệp kê khai dưới dạng một bộ lọc ý định.
- Quyền
- Nội dung khai báo về các chính sách bảo mật được dùng trong siêu dữ liệu.
Sau đây là một đoạn trích từ tệp kê khai mẫu Quản trị thiết bị:
<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>
Lưu ý:
- Các thuộc tính sau đây đề cập đến các tài nguyên chuỗi nằm trong
ApiDemos/res/values/strings.xml
của ứng dụng mẫu. Để biết thêm thông tin về tài nguyên, hãy xem phần Tài nguyên ứng dụng.android:label="@string/activity_sample_device_admin"
đề cập đến nhãn mà người dùng đọc được cho hoạt động.android:label="@string/sample_device_admin"
đề cập đến nhãn mà người dùng đọc được cho quyền.android:description="@string/sample_device_admin_description"
đề cập đến nội dung mô tả quyền mà người dùng có thể đọc được. Nội dung mô tả thường dài hơn và chứa nhiều thông tin hơn so với nhãn.
android:permission="android.permission.BIND_DEVICE_ADMIN"
là một quyền mà lớp conDeviceAdminReceiver
phải có để đảm bảo chỉ hệ thống mới có thể tương tác với receiver (không ứng dụng nào được cấp quyền này). Điều này giúp ngăn các ứng dụng khác lợi dụng ứng dụng quản trị thiết bị của bạn.android.app.action.DEVICE_ADMIN_ENABLED
là thao tác chính mà lớp conDeviceAdminReceiver
phải xử lý để được phép quản lý một thiết bị. Giá trị này được đặt thành receiver khi người dùng bật ứng dụng quản trị thiết bị. Mã của bạn thường xử lý giá trị này trongonEnabled()
. Để được hỗ trợ, bên nhận cũng phải yêu cầu quyềnBIND_DEVICE_ADMIN
để các ứng dụng khác không thể sử dụng sai quyền này.- Khi người dùng bật ứng dụng quản trị thiết bị, ứng dụng đó sẽ cấp cho receiver quyền thực hiện các hành động để phản hồi thông báo về các sự kiện cụ thể của hệ thống. Khi có sự kiện phù hợp, ứng dụng có thể áp dụng một chính sách. Ví dụ: nếu người dùng cố gắng đặt một mật khẩu mới không đáp ứng các yêu cầu của chính sách, thì ứng dụng có thể nhắc người dùng chọn một mật khẩu khác đáp ứng các yêu cầu đó.
- Tránh thay đổi tên của receiver sau khi xuất bản ứng dụng. Nếu tên trong tệp kê khai thay đổi, thì quản trị viên thiết bị sẽ bị vô hiệu hoá khi người dùng cập nhật ứng dụng. Để tìm hiểu thêm, hãy xem
<receiver>
. android:resource="@xml/device_admin_sample"
khai báo các chính sách bảo mật được dùng trong siêu dữ liệu. Siêu dữ liệu cung cấp thông tin bổ sung dành riêng cho quản trị viên thiết bị, do lớpDeviceAdminInfo
phân tích cú pháp. Sau đây là nội dung củadevice_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>
Khi thiết kế ứng dụng quản trị thiết bị, bạn không cần phải đưa tất cả các chính sách vào, mà chỉ cần những chính sách phù hợp với ứng dụng của bạn.
Để biết thêm thông tin về tệp kê khai, hãy xem Hướng dẫn dành cho nhà phát triển Android.Triển khai mã
Device Administration API bao gồm các lớp sau:
DeviceAdminReceiver
- Lớp cơ sở để triển khai một thành phần quản trị thiết bị. Lớp này mang đến sự thuận tiện cho việc diễn giải các thao tác thô về ý định do hệ thống gửi. Ứng dụng Quản trị thiết bị của bạn phải có một lớp con
DeviceAdminReceiver
. DevicePolicyManager
- Một lớp để quản lý các chính sách được thực thi trên thiết bị. Hầu hết các ứng dụng của lớp này đều phải xuất bản một
DeviceAdminReceiver
mà người dùng hiện đã bật.DevicePolicyManager
quản lý các chính sách cho một hoặc nhiều thực thểDeviceAdminReceiver
DeviceAdminInfo
- Lớp này dùng để chỉ định siêu dữ liệu cho một thành phần quản trị viên thiết bị.
Các lớp này cung cấp nền tảng cho một ứng dụng quản trị thiết bị có đầy đủ chức năng. Phần còn lại của phần này mô tả cách bạn sử dụng các API DeviceAdminReceiver
và DevicePolicyManager
để viết một ứng dụng quản trị thiết bị.
Tạo lớp con DeviceAdminReceiver
Để tạo một ứng dụng quản trị thiết bị, bạn phải tạo lớp con DeviceAdminReceiver
. Lớp DeviceAdminReceiver
bao gồm một loạt các lệnh gọi lại được kích hoạt khi xảy ra các sự kiện cụ thể.
Trong lớp con DeviceAdminReceiver
, ứng dụng mẫu chỉ hiển thị một thông báo Toast
để phản hồi các sự kiện cụ thể. Ví dụ:
Kotlin
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)) ... }
Java
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)); } ... }
Bật ứng dụng
Một trong những sự kiện chính mà ứng dụng quản trị thiết bị phải xử lý là việc người dùng bật ứng dụng. Người dùng phải bật ứng dụng một cách rõ ràng để các chính sách được thực thi. Nếu người dùng chọn không bật ứng dụng, ứng dụng đó vẫn sẽ có trên thiết bị, nhưng các chính sách của ứng dụng sẽ không được thực thi và người dùng sẽ không nhận được bất kỳ lợi ích nào từ ứng dụng.
Quá trình bật ứng dụng bắt đầu khi người dùng thực hiện một hành động kích hoạt ý định ACTION_ADD_DEVICE_ADMIN
. Trong ứng dụng mẫu, điều này xảy ra khi người dùng nhấp vào hộp đánh dấu Bật quyền quản trị.
Khi người dùng nhấp vào hộp đánh dấu Enable Admin (Bật quyền quản trị), màn hình sẽ thay đổi để nhắc người dùng kích hoạt ứng dụng quản trị thiết bị, như minh hoạ trong hình 2.

Hình 2. Ứng dụng mẫu: kích hoạt ứng dụng
Dưới đây là đoạn mã sẽ được thực thi khi người dùng nhấp vào hộp đánh dấu Bật quyền quản trị. Điều này có tác dụng kích hoạt lệnh gọi lại onPreferenceChange()
. Lệnh gọi lại này được gọi khi người dùng thay đổi giá trị của Preference
này và sắp được đặt và/hoặc duy trì. Nếu người dùng đang bật ứng dụng, màn hình sẽ thay đổi để nhắc người dùng kích hoạt ứng dụng quản trị thiết bị, như minh hoạ trong hình 2. Nếu không, ứng dụng quản trị thiết bị sẽ bị tắt.
Kotlin
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 }
Java
@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; }
Dòng intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
mDeviceAdminSample)
cho biết mDeviceAdminSample
(là một thành phần DeviceAdminReceiver
) là chính sách mục tiêu.
Dòng này gọi giao diện người dùng xuất hiện trong hình 2, hướng dẫn người dùng thêm quản trị viên thiết bị vào hệ thống (hoặc cho phép họ từ chối).
Khi ứng dụng cần thực hiện một thao tác tuỳ thuộc vào việc ứng dụng quản trị viên thiết bị có được bật hay không, ứng dụng sẽ xác nhận rằng ứng dụng đang hoạt động. Để làm việc này, phương thức này sử dụng phương thức DevicePolicyManager
isAdminActive()
. Lưu ý rằng phương thức DevicePolicyManager
isAdminActive()
lấy thành phần DeviceAdminReceiver
làm đối số:
Kotlin
private lateinit var dpm: DevicePolicyManager ... private fun isActiveAdmin(): Boolean = dpm.isAdminActive(deviceAdminSample)
Java
DevicePolicyManager dpm; ... private boolean isActiveAdmin() { return dpm.isAdminActive(deviceAdminSample); }
Quản lý chính sách
DevicePolicyManager
là một lớp công khai để quản lý các chính sách được thực thi trên thiết bị. DevicePolicyManager
quản lý các chính sách cho một hoặc nhiều phiên bản DeviceAdminReceiver
.
Bạn sẽ nhận được một đối tượng xử lý cho DevicePolicyManager
như sau:
Kotlin
dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
Java
DevicePolicyManager dpm = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
Phần này mô tả cách sử dụng DevicePolicyManager
để thực hiện các tác vụ quản trị:
Đặt chính sách mật khẩu
DevicePolicyManager
bao gồm các API để đặt và thực thi chính sách mật khẩu thiết bị. Trong Device Administration API, mật khẩu chỉ áp dụng cho phương thức khoá màn hình. Phần này mô tả các tác vụ thường gặp liên quan đến mật khẩu.
Đặt mật khẩu cho thiết bị
Mã này hiển thị một giao diện người dùng nhắc người dùng đặt mật khẩu:
Kotlin
Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD).also { intent -> startActivity(intent) }
Java
Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); startActivity(intent);
Đặt chất lượng mật khẩu
Chất lượng mật khẩu có thể là một trong các hằng số DevicePolicyManager
sau đây:
PASSWORD_QUALITY_ALPHABETIC
- Người dùng phải nhập mật khẩu chứa ít nhất các ký tự chữ cái (hoặc ký tự biểu tượng khác).
PASSWORD_QUALITY_ALPHANUMERIC
- Người dùng phải nhập mật khẩu chứa ít nhất cả ký tự số và ký tự chữ cái (hoặc ký tự biểu tượng khác).
PASSWORD_QUALITY_NUMERIC
- Người dùng phải nhập mật khẩu chứa ít nhất các ký tự số.
PASSWORD_QUALITY_COMPLEX
- Người dùng phải nhập mật khẩu chứa ít nhất một chữ cái, một chữ số và một ký hiệu đặc biệt.
PASSWORD_QUALITY_SOMETHING
- Chính sách này yêu cầu một loại mật khẩu nào đó, nhưng không quan tâm đến mật khẩu đó là gì.
PASSWORD_QUALITY_UNSPECIFIED
- Chính sách này không có yêu cầu nào đối với mật khẩu.
Ví dụ: đây là cách bạn đặt chính sách mật khẩu để yêu cầu mật khẩu có cả chữ và số:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setPasswordQuality(deviceAdminSample, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
Đặt yêu cầu về nội dung mật khẩu
Kể từ Android 3.0, lớp DevicePolicyManager
bao gồm các phương thức cho phép bạn tinh chỉnh nội dung của mật khẩu. Ví dụ: bạn có thể đặt một chính sách quy định rằng mật khẩu phải có ít nhất n chữ cái viết hoa. Sau đây là các phương thức để tinh chỉnh nội dung của mật khẩu:
setPasswordMinimumLetters()
setPasswordMinimumLowerCase()
setPasswordMinimumUpperCase()
setPasswordMinimumNonLetter()
setPasswordMinimumNumeric()
setPasswordMinimumSymbols()
Ví dụ: đoạn mã này cho biết mật khẩu phải có ít nhất 2 chữ cái viết hoa:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwMinUppercase = 2 ... dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwMinUppercase = 2; ... dpm.setPasswordMinimumUpperCase(deviceAdminSample, pwMinUppercase);
Đặt độ dài mật khẩu tối thiểu
Bạn có thể chỉ định rằng mật khẩu phải có độ dài tối thiểu đã chỉ định. Ví dụ:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwLength: Int = ... ... dpm.setPasswordMinimumLength(deviceAdminSample, pwLength)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwLength; ... dpm.setPasswordMinimumLength(deviceAdminSample, pwLength);
Đặt số lần nhập sai mật khẩu tối đa
Bạn có thể đặt số lần nhập sai mật khẩu tối đa được phép trước khi dữ liệu trên thiết bị bị xoá (tức là đặt lại về trạng thái cài đặt ban đầu). Ví dụ:
Kotlin
val dPM:DevicePolicyManager private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val maxFailedPw: Int = ... ... dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; int maxFailedPw; ... dpm.setMaximumFailedPasswordsForWipe(deviceAdminSample, maxFailedPw);
Đặt thời gian chờ hết hạn mật khẩu
Kể từ Android 3.0, bạn có thể sử dụng phương thức setPasswordExpirationTimeout()
để đặt thời điểm mật khẩu hết hạn, được biểu thị dưới dạng một khoảng thời gian chênh lệch tính bằng mili giây kể từ khi quản trị viên thiết bị đặt thời gian chờ hết hạn. Ví dụ:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwExpiration: Long = ... ... dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; long pwExpiration; ... dpm.setPasswordExpirationTimeout(deviceAdminSample, pwExpiration);
Hạn chế mật khẩu dựa trên nhật ký
Kể từ Android 3.0, bạn có thể sử dụng phương thức setPasswordHistoryLength()
để hạn chế khả năng người dùng sử dụng lại mật khẩu cũ. Phương thức này lấy một tham số length (độ dài), chỉ định số lượng mật khẩu cũ được lưu trữ. Khi chính sách này đang hoạt động, người dùng không thể nhập mật khẩu mới trùng với n mật khẩu gần đây nhất. Điều này giúp người dùng không sử dụng cùng một mật khẩu nhiều lần. Chính sách này thường được dùng cùng với setPasswordExpirationTimeout()
, buộc người dùng phải cập nhật mật khẩu sau khi hết một khoảng thời gian nhất định.
Ví dụ: đoạn mã này ngăn người dùng sử dụng lại bất kỳ mật khẩu nào trong số 5 mật khẩu gần đây nhất của họ:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val pwHistoryLength = 5 ... dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; int pwHistoryLength = 5; ... dpm.setPasswordHistoryLength(deviceAdminSample, pwHistoryLength);
Thiết lập phương thức khoá thiết bị
Bạn có thể đặt khoảng thời gian tối đa mà người dùng có thể không hoạt động trước khi thiết bị khoá. Ví dụ:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName private val timeMs: Long = 1000L * timeout.text.toString().toLong() ... dpm.setMaximumTimeToLock(deviceAdminSample, timeMs)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... long timeMs = 1000L*Long.parseLong(timeout.getText().toString()); dpm.setMaximumTimeToLock(deviceAdminSample, timeMs);
Bạn cũng có thể yêu cầu thiết bị khoá ngay lập tức theo phương thức lập trình:
Kotlin
private lateinit var dpm: DevicePolicyManager dpm.lockNow()
Java
DevicePolicyManager dpm; dpm.lockNow();
Thực hiện thao tác xoá dữ liệu
Bạn có thể sử dụng phương thức DevicePolicyManager
wipeData()
để đặt lại thiết bị về trạng thái cài đặt ban đầu. Điều này hữu ích nếu thiết bị bị mất hoặc bị đánh cắp. Thường thì quyết định xoá sạch thiết bị là kết quả của việc đáp ứng một số điều kiện nhất định. Ví dụ: bạn có thể dùng setMaximumFailedPasswordsForWipe()
để nêu rõ rằng thiết bị sẽ bị xoá dữ liệu sau một số lần nhập mật khẩu không thành công cụ thể.
Bạn xoá dữ liệu theo các bước sau:
Kotlin
private lateinit var dpm: DevicePolicyManager dpm.wipeData(0)
Java
DevicePolicyManager dpm; dpm.wipeData(0);
Phương thức wipeData()
lấy một mặt nạ bit gồm các lựa chọn bổ sung làm tham số. Hiện tại, giá trị phải là 0.
Tắt camera
Kể từ Android 4.0, bạn có thể tắt camera. Xin lưu ý rằng bạn không nhất thiết phải tắt vĩnh viễn. Bạn có thể bật/tắt camera một cách linh hoạt dựa trên bối cảnh, thời gian, v.v.
Bạn có thể kiểm soát việc tắt camera bằng phương thức setCameraDisabled()
. Ví dụ: đoạn mã này đặt camera ở trạng thái bật hoặc tắt dựa trên chế độ cài đặt hộp đánh dấu:
Kotlin
private lateinit var disableCameraCheckbox: CheckBoxPreference private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked)
Java
private CheckBoxPreference disableCameraCheckbox; DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setCameraDisabled(deviceAdminSample, mDisableCameraCheckbox.isChecked());
Mã hoá bộ nhớ
Kể từ Android 3.0, bạn có thể sử dụng phương thức setStorageEncryption()
để đặt một chính sách yêu cầu mã hoá vùng lưu trữ (nếu được hỗ trợ).
Ví dụ:
Kotlin
private lateinit var dpm: DevicePolicyManager private lateinit var deviceAdminSample: ComponentName ... dpm.setStorageEncryption(deviceAdminSample, true)
Java
DevicePolicyManager dpm; ComponentName deviceAdminSample; ... dpm.setStorageEncryption(deviceAdminSample, true);
Hãy xem mẫu Device Administration API để biết ví dụ đầy đủ về cách bật tính năng mã hoá bộ nhớ.
Mã mẫu khác
Các mẫu Android AppRestrictionEnforcer và DeviceOwner minh hoạ thêm về việc sử dụng các API được trình bày trên trang này.