Ngừng sử dụng tính nă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 quản trị viên thiết bị gọi. Bạn nên bắt đầu chuẩn bị ngay bây giờ cho sự thay đổi này. Để tìm hiểu thêm và xem các tuỳ chọn di chuyển, hãy đọc bài viết Ngừng cung cấp chức năng quản trị viên thiết bị.
Android cung cấp tính năng hỗ trợ cho các ứng dụng doanh nghiệp bằng cách cung cấp API Quản trị thiết bị Android. API Quản trị thiết bị 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 ra các ứng dụng có khả năng nhận biết bảo mật hữu ích trong chế độ cài đặt doanh nghiệp, trong đó các chuyên gia CNTT cần có quyền kiểm soát chặt chẽ đối với thiết bị của nhân viên. Ví dụ: ứng dụng Email tích hợp sẵn 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 mật khẩu — bao gồm cả mật khẩu gồm chữ và số hoặc mã PIN dạng số — trên các thiết bị. Quản trị viên cũng có thể xoá từ xa (tức là bật khôi phục chế độ mặc định về trạng thái ban đầu) các thiết bị cầm tay 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 các nhà phát triển muốn phát triển các giải pháp dành cho doanh nghiệp cho các thiết bị chạy Android. Tài liệu này thảo luận về nhiều tính năng do API Quản trị thiết bị cung cấp để mang lại khả năng bảo mật mạnh mẽ hơn cho các thiết bị của nhân viên sử dụng Android.
Lưu ý Để biết thông tin về cách xây dựng Trình kiểm soát chính sách công việc (Work) cho quá trình triển khai Android for Work, hãy xem nội dung 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) ra mắt 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 người dùng khác trên nền trước để tương tác với người dùng cuối. Android 14 cũng ra mắt chế độ liên kết với chủ sở hữu thiết bị không có giao diện người dùng. Chế độ này thêm Chủ sở hữu hồ sơ cho tất cả người dùng được liên kết trừ người dùng hệ thống đã đặt Chủ sở hữu thiết bị.
Trong các thiết bị được định cấu hình cho 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 trong nền), chỉ những chính sách thiết bị trong phạm vi chung (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 người dùng trên nền trước. Hãy xem addUserRestriction
để biết thông tin chi tiết.
Nhà sản xuất thiết bị Android có thể tham khảo hướng dẫn phát hành trên source.android.com.
Tổng quan về API quản trị thiết bị
Dưới đây là ví dụ về các loại ứng dụng có thể sử dụng API Quản lý thiết bị:
- Chương trình email khách.
- Ứng dụng bảo mật thực hiện xóa từ xa.
- Ứng dụng và dịch vụ quản lý thiết bị.
Cách hoạt động của tính năng này
Bạn sử dụng API Quản trị thiết bị để ghi 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 dịch vụ này:
- Quản trị viên hệ thống sẽ 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/trên máy. Những 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áy chủ của 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 cấp phép tự động. Sau đây là một số cách 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ừ cửa hàng khác.
- Phân phối ứng dụng thông qua các phương thức khác, chẳng hạn như email hoặc trang web.
- Hệ thống 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 triển khai tuỳ thuộc vào cách triển khai ứng dụng.
- Sau khi bật ứng dụng quản trị thiết bị, người dùng 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 các 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 này vẫn ở 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 theo chính sách của ứng dụng và ngược lại, họ sẽ không được hưởng bất kỳ lợi ích nào của ứng dụng (ví dụ: có thể họ sẽ không đồng bộ hoá được dữ liệu).
Nếu người dùng không tuân thủ chính sách (ví dụ: nếu người dùng đặt một mật khẩu vi phạm nguyên tắc), thì ứng dụng sẽ có quyền quyết định cách xử lý. Tuy nhiên, điều này thường 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 API Quản trị thiết bị, thì việc kết nối sẽ không được phép. API Quản trị thiết bị hiện không cho phép cấp phép một phần. Nói cách khác, nếu một thiết bị (ví dụ: một thiết bị cũ) không hỗ trợ tất cả các chính sách đã nêu, thì không có cách nào để cho phép thiết bị đó kết nối.
Nếu một thiết bị chứa 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 quản trị viên.
Chính sách
Trong bối cảnh doanh nghiệp, thiết bị của nhân viên thường 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ị. API Quản trị thiết bị hỗ trợ các chính sách được liệt kê trong Bảng 1. Lưu ý rằng API Quản trị thiết bị hiện chỉ hỗ trợ mật khẩu cho phương thức khoá màn hình:
Policy | Nội dung mô tả |
---|---|
Đã bật mật khẩu | Yêu cầu thiết bị phải yêu cầu 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 có ít nhất 6 ký tự. |
Bắt buộc phải có mật khẩu chứa chữ và số | Yêu cầu mật khẩu có một tổ hợp chữ cái và số. Chúng có thể chứa ký tự tượng trư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. |
Phải có số chữ cái tối thiểu trong mật khẩu | Số chữ cái 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. |
Phải có chữ thường tối thiểu 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. |
Bắt buộc phải có ký tự tối thiểu không phải chữ cái trong mật khẩu | Số ký tự không phải chữ cái tối thiểu cần có trong mật khẩu đố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. |
Phải có số chữ số tối thiểu trong mật khẩu | Số chữ số tối thiểu bắt buộ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. |
Mật khẩu bắt buộc phải có ký hiệu tối thiểu | Số lượng ký hiệu tối thiểu cần có trong mật khẩu đối với tất cả quản trị viên hoặc một người cụ thể. Ra mắt trong Android 3.0. |
Phải có chữ hoa tối thiểu trong mật khẩu | Số lượng chữ hoa tối thiểu cần có trong mật khẩu cho 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. |
Hết thời gian chờ hết hạn mật khẩu | Thời điểm mật khẩu sẽ hết hạn, được biểu thị bằng một delta 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ế 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 cùng 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 chỉ định.
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á sạch dữ liệu. API Quản trị thiết bị cũng cho phép quản trị viên đặt lại từ xa thiết bị về giá trị mặc định ban đầu. Việc 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 gần đây nhất người dùng chạm vào màn hình hoặc nhấn một nút trước 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 trước khi có thể sử dụng thiết bị và truy cập vào dữ liệu. Giá trị này có thể nằm trong khoảng từ 1 đến 60 phút. |
Yêu cầu mã hoá bộ nhớ | Chỉ định khu vực lưu trữ cần được mã hoá nếu thiết bị hỗ trợ. Ra mắt trong Android 3.0. |
Vô hiệu hóa máy ảnh | Chỉ định việc tắt máy ảnh đó. Xin lưu ý rằng thao tác này không nhất thiết phải là vô hiệu hoá vĩnh viễn. Bạn có thể linh động bật/tắt máy ảnh dựa trên ngữ 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 nêu trong bảng trên, API Quản trị thiết bị 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 trên thiết bị (tức là khôi phục thiết bị về mặc định ban đầu).
Ứng dụng mẫu
Các ví dụ được sử dụng trên trang này dựa trên mẫu API Quản trị thiết bị, có trong mẫu SDK (có sẵn trong Trình quản lý SDK Android) và được đặt 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 cung cấp bản minh hoạ 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ể sử dụng các nút trong giao diện người dùng để thực hiện những tác vụ 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ố ký tự số tối thiểu phải có trong mật khẩu, 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 thử mật khẩu không thành công có thể xảy ra trước khi xoá thiết bị (tức là khôi phục về trạng thái cài đặt ban đầu).
- Đặt khoảng thời gian kể từ bây giờ cho mật khẩu sẽ hết hạn.
- Đặt độ dài của nhật ký mật khẩu (độ dài tức là số lượng mật khẩu cũ được lưu trữ trong nhật ký). Điều này ngăn người dùng sử dụng lại một trong n mật khẩu gần nhất mà họ sử dụng trước đó.
- Chỉ định rằng khu vực lưu trữ sẽ được mã hoá nếu thiết bị hỗ trợ.
- Đặt khoảng thời gian không hoạt động tối đa 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 trên thiết bị (tức là khôi phục chế độ cài đặt gốc).
- Tắt camera.
Phát triển ứng dụng quản trị thiết bị
Quản trị viên hệ thống có thể dùng API Quản trị thiết bị để viết một ứng dụng thực thi chính sách bảo mật thiết bị từ xa/trên máy. 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 API Quản trị thiết bị, tệp kê khai của ứng dụng phải bao gồm:
- Một lớp con của
DeviceAdminReceiver
bao gồm:- Quyền
BIND_DEVICE_ADMIN
. - Khả năng phản hồi ý định
ACTION_DEVICE_ADMIN_ENABLED
, được biểu thị trong tệp kê khai dưới dạng bộ lọc ý định.
- Quyền
- Nội dung khai báo về các chính sách bảo mật dùng trong siêu dữ liệu.
Dưới đây là một phần trích dẫn từ tệp kê khai mẫu của 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 tham chiếu đến tài nguyên chuỗi của ứng dụng mẫu nằm trong
ApiDemos/res/values/strings.xml
. Để 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ó thể đọc được cho quyền đó.android:description="@string/sample_device_admin_description"
là nội dung mô tả quyền mà người dùng có thể đọc được. Phần 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 trình nhận (không thể cấp quyền này cho ứng dụng nào). Điều này ngăn các ứng dụng khác lạm dụng ứng dụng quản trị thiết bị của bạn.android.app.action.DEVICE_ADMIN_ENABLED
là hành động chính mà lớp conDeviceAdminReceiver
phải xử lý để được phép quản lý thiết bị. Thuộc tính 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ý việc này trongonEnabled()
. Để được hỗ trợ, receiver cũng phải yêu cầu quyềnBIND_DEVICE_ADMIN
để các ứng dụng khác không thể lạm dụng quyền đó.- Khi người dùng bật ứng dụng quản trị thiết bị, ứng dụng này sẽ cấp cho receiver quyền thực hiện các thao tác để phản hồi thông báo về việc truyền một sự kiện hệ thống cụ thể. Khi có sự kiện thích hợp, ứng dụng có thể áp dụng 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 yêu cầu.
- Tránh thay đổi tên receiver sau khi phát hành ứng dụng. Nếu tên trong tệp kê khai thay đổi, thì hoạt động quản trị viên thiết bị sẽ bị tắt 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 dùng trong siêu dữ liệu. Siêu dữ liệu cung cấp thêm thông tin dành riêng cho quản trị viên thiết bị, như được phân tích cú pháp bằng lớpDeviceAdminInfo
. Dưới đâ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 đưa vào tất cả chính sách, chỉ cần đưa vào những chính sách liên quan đến ứng dụng của mình.
Để thảo luận thêm 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ã
API Quản trị thiết bị bao gồm các lớp sau:
DeviceAdminReceiver
- Lớp cơ sở để triển khai thành phần quản trị thiết bị. Lớp này mang lại sự thuận tiện cho việc diễn giải các thao tác theo ý định thô mà hệ thống gửi. Ứng dụng Quản trị thiết bị của bạn phải bao gồm 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 ứng dụng của lớp này phải phát hành một
DeviceAdminReceiver
mà người dùng hiện đã bật.DevicePolicyManager
quản lý 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 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ị với đầ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 API DeviceAdminReceiver
và DevicePolicyManager
để viết ứng dụng quản trị thiết bị.
Phân lớp thiết bị quản trị viên
Để 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 các sự kiện cụ thể xảy ra.
Trong lớp con DeviceAdminReceiver
, ứng dụng mẫu chỉ cần hiển thị 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à 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 để thực thi các chính sách. Nếu người dùng chọn không bật ứng dụng, thì ứng dụng đó vẫn sẽ hiện diện trên thiết bị, nhưng 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 của ứ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 Enable Admin (Bật quản trị viên).
Khi người dùng nhấp vào hộp đánh dấu Enable Admin (Bật tính năng quản trị viên), 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.
Dưới đây là mã sẽ được thực thi khi người dùng nhấp vào hộp kiểm Bật quản trị viên. Việc 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
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 rằng mDeviceAdminSample
(là 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 như trong hình 2 để hướng dẫn người dùng cách thêm quản trị viên thiết bị vào hệ thống (hoặc cho phép họ từ chối yêu cầu đó).
Khi cần thực hiện một thao tác tuỳ thuộc vào ứng dụng quản trị của thiết bị đang được bật, ứng dụng sẽ xác nhận rằng ứng dụng đó đang hoạt động. Để thực hiện việc này, hãy sử dụng phương thức DevicePolicyManager
isAdminActive()
. Xin lưu ý rằng phương thức DevicePolicyManager
isAdminActive()
sẽ 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
thực thi trên một thiết bị. DevicePolicyManager
quản lý chính sách cho một hoặc nhiều thực thể DeviceAdminReceiver
.
Bạn sẽ xử lý 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 công việc quản trị:
Đặt chính sách mật khẩu
DevicePolicyManager
bao gồm các API để thiết lập và thực thi
chính sách mật khẩu của thiết bị. Trong API Quản trị thiết bị, 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ụ phổ biến liên quan đến mật khẩu.
Đặt mật khẩu cho thiết bị
Mã này sẽ hiện một giao diện người dùng với nội dung 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:
PASSWORD_QUALITY_ALPHABETIC
- Người dùng phải nhập một mật khẩu có chứa ít nhất ký tự chữ cái (hoặc ký hiệu khác).
PASSWORD_QUALITY_ALPHANUMERIC
- Người dùng phải nhập mật khẩu có chứa ít nhất cả ký tự số và chữ cái (hoặc ký hiệu khác).
PASSWORD_QUALITY_NUMERIC
- Người dùng phải nhập mật khẩu có chứa ít nhất ký tự số.
PASSWORD_QUALITY_COMPLEX
- Người dùng phải nhập mật khẩu có chứa ít nhất một chữ cái, 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 số loại mật khẩu nhưng không quan tâm đến mật khẩu đó.
PASSWORD_QUALITY_UNSPECIFIED
- Chính sách này không có yêu cầu nào về mật khẩu.
Ví dụ: đây là cách bạn thiết lập chính sách mật khẩu yêu cầu mật khẩu bao gồm 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
sẽ bao gồm các phương thức cho phép bạn tinh chỉnh nội dung mật khẩu. Ví dụ: bạn có thể đặt một chính sách nêu rõ rằng mật khẩu phải chứa ít nhất n chữ cái viết hoa. Dưới đây là các phương thức để tinh chỉnh nội dung của một mật khẩu:
setPasswordMinimumLetters()
setPasswordMinimumLowerCase()
setPasswordMinimumUpperCase()
setPasswordMinimumNonLetter()
setPasswordMinimumNumeric()
setPasswordMinimumSymbols()
Ví dụ: đoạn mã này cho biết rằng 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 ít nhất 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 xoá thiết bị (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 mật khẩu sẽ hết hạn, được biểu thị bằng delta tính bằng mili giây kể từ thời điểm 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 sử dụng lại mật khẩu cũ của người dùng. Phương thức này sử dụng một thông số length. Thông số này chỉ định số lượng mật khẩu cũ được lưu trữ. Khi chính sách này hoạt động, người dùng không thể nhập mật khẩu mới khớp với n mật khẩu gần nhất. Điều này giúp ngăn người dù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 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 chỉ định đã chỉ định.
Ví dụ: đoạn mã này nghiêm cấm 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);
Đặt phương thức khoá thiết bị
Bạn có thể đặt khoảng thời gian tối đa người dùng không hoạt động có thể xảy ra 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ể lập trình để yêu cầu thiết bị khoá ngay lập tức:
Kotlin
private lateinit var dpm: DevicePolicyManager dpm.lockNow()
Java
DevicePolicyManager dpm; dpm.lockNow();
Thực hiện xoá sạch 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 rất hữu ích nếu thiết bị bị mất hoặc bị đánh cắp. Thông thường, quyết định xoá thiết bị là kết quả của một số điều kiện nhất định. Ví dụ: bạn có thể sử dụng setMaximumFailedPasswordsForWipe()
để cho biết cần phải xoá thiết bị sau một số lần thử mật khẩu không thành công cụ thể.
Bạn xoá dữ liệu như sau:
Kotlin
private lateinit var dpm: DevicePolicyManager dpm.wipeData(0)
Java
DevicePolicyManager dpm; dpm.wipeData(0);
Phương thức wipeData()
lấy tham số là một mặt nạ bit của các tuỳ chọn bổ sung. Hiện tại, giá trị phải là 0.
Vô hiệu hóa máy ảnh
Kể từ Android 4.0, bạn có thể tắt máy ảnh. Xin lưu ý rằng thao tác này không nhất thiết phải là vô hiệu hoá vĩnh viễn. Bạn có thể linh động bật/tắt camera dựa trên ngữ cảnh, thời gian, v.v.
Bạn kiểm soát việc máy ảnh có tắt hay không bằng phương thức setCameraDisabled()
. Ví dụ: đoạn mã này đặt máy ảnh thành 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á khu vực 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);
Xem mẫu API Quản trị thiết bị để biết ví dụ đầy đủ về cách bật tính năng mã hoá bộ nhớ.
Mã mẫu khác
Mẫu Android AppRestrictionEnforcer và DeviceOwner minh hoạ rõ hơn cách sử dụng các API được trình bày trên trang này.