Tổng quan về quản trị thiết bị

Ngừng quản trị viên thiết bị. Kể từ Android 9 (API cấp 28), một số chính sách dành cho quản trị viên 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 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 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. API Quản lý thiết bị cung cấp các tính năng quản lý 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 nhận biết bảo mật hữu ích trong các chế độ cài đặt dành cho doanh nghiệp, trong đó các chuyên gia CNTT cần có quyền kiểm soát phong phú đối với thiết bị của nhân viên. Ví dụ: ứng dụng Email Android tích hợp sẵn đã 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 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 gồm số) trên các thiết bị. Quản trị viên cũng có thể xoá dữ liệu từ xa (tức là khôi phục chế độ mặc định của nhà sản xuất) trên điện thoại di động bị mất hoặc bị đánh cắp. Người dùng Exchange có thể đồng bộ hoá email và dữ liệu lịch.

Tài liệu này dành cho các nhà phát triển muốn phát triển giải pháp dành cho doanh nghiệp cho các thiết bị chạy Android. Bản thảo 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 thiết bị của nhân viên chạy Android.

Lưu ý Để biết thông tin về cách tạo Trình điều khiển chính sách công việc cho các bản triển khai Android cho công việc, hãy xem phần Tạo Trình điều khiển 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 trên nền trước bổ sung để 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 sẽ thêm Chủ sở hữu hồ sơ cho tất cả người dùng được liên kết ngoài 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 (nơi người dùng hệ thống chạy ở chế độ nền), chỉ các chính sách thiết bị thuộc phạm vi trên toàn cầu (các 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 ở 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 được phát hành trên source.android.com.

Tổng quan về API quản trị thiết bị

Sau đây là ví dụ về các loại ứng dụng có thể sử dụng API Quản trị thiết bị:

  • Ứng dụng email.
  • Ứng dụng bảo mật có tính năng xoá từ xa.
  • Các dịch vụ và ứng dụng quản lý thiết bị.

Cách thức hoạt động

Bạn sử dụng API Quản trị thiết bị để 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 dịch vụ này:

  • 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/tại chỗ. 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 chính sách từ máy chủ của bên thứ ba.
  • Ứng dụng đượ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 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.
    • Bật tính năng cài đặt từ một cửa hàng khác.
    • Phân phối ứng dụng qua các phương thức 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 bật ứng dụng quản trị thiết bị, người dùng sẽ phải tuân thủ 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 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ẽ xuất hiệ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 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 đó, ví dụ: họ có thể 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 khẩu vi phạm nguyên tắc), thì ứng dụng sẽ 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ì 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ị được 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 đó làm quản trị viên.

Chính sách

Trong môi trường 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 quản lý việc sử dụng thiết bị. API Quản trị thiết bị hỗ trợ các chính sách được nêu trong Bảng 1. Xin lưu ý rằng API Quản trị thiết bị hiện chỉ hỗ trợ mật khẩu để khoá màn hình:

Bảng 1. Các chính sách được API Quản trị thiết bị hỗ trợ.

Policy Mô tả
Đã bật mật khẩu Thiết bị phải yêu cầu mã PIN hoặc mật khẩu.
Độ dài tối thiểu của mật khẩu Đặt số 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 bao gồm chữ và số Yêu cầu mật khẩu phải có tổ hợp chữ cái và số. Tên này có thể bao gồm các ký tự tượng trưng.
Yêu cầu 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.
Cần có số chữ cái tối thiểu 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ả 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 thường tối thiểu cần có trong mật khẩu Số 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ố ký tự không phải 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.
Số chữ số tối thiểu bắt buộc trong mật khẩu Số chữ số 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.
Yêu cầu ký hiệu tối thiểu 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 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ế 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 duy nhấ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 cập nhật mật khẩu sau một khoảng thời gian nhất định đã trôi qua. 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. API Quản trị thiết bị cũng cho phép quản trị viên đặt lại thiết bị từ xa về trạng thái 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 cuối cùng người dùng chạm vào màn hình hoặc nhấn 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 thì mới 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 rằng khu vực lưu trữ phải được mã hoá nếu thiết bị hỗ trợ. Ra mắt trong Android 3.0.
Tắt camera Chỉ định rằng máy ảnh sẽ bị tắt. Xin lưu ý rằng việc này không phải là tắt vĩnh viễn. Bạn có thể bật/tắt máy ảnh một cách linh động 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 được liệt kê trong bảng trên, API Quản trị thiết bị 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á sạch 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 sử 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ó sẵn thông qua 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 cung cấp bản minh hoạ các tính năng quản trị thiết bị. Ứng dụng này hiển thị 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 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ề một lỗi.
  • Đặt số lần thử nhập mật khẩu không thành công trước khi xoá sạch 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ờ mật khẩu sẽ hết hạn.
  • Đặt độ dài nhật ký mật khẩu (length đề cập đến số lượng mật khẩu cũ được lưu trữ trong nhật ký). Điều này giúp người dùng không sử dụng lại một trong n mật khẩu gần đây nhất mà họ từng sử dụng.
  • Chỉ định rằng khu vực lưu trữ phải được mã hoá, nếu thiết bị hỗ trợ tính năng này.
  • Đặ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á sạch dữ liệu của thiết bị (tức là khôi phục cài đặt gốc).
  • Tắt máy ảnh.

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 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/tại chỗ. Phần này tóm tắt các bướ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 những nội dung sau:

  • Một lớp con của DeviceAdminReceiver bao gồm những thành phần sau:
  • Nội dung khai báo về các chính sách bảo mật được sử dụng trong siêu dữ liệu.

Dưới đâ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 tham chiếu đến các tài nguyên chuỗi dành cho ứ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 đượ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à quyền mà lớp con DeviceAdminReceiver phải có để đảm bảo rằng chỉ hệ thống mới có thể tương tác với trình nhận (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 con DeviceAdminReceiver phải xử lý để được phép quản lý thiết bị. Giá trị này được đặt thành trình nhận 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 trong onEnabled(). Để được hỗ trợ, trình nhận cũng phải yêu cầu quyền BIND_DEVICE_ADMIN để các ứng dụng khác không thể lợi dụng 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 trình nhận quyền thực hiện các hành động để phản hồi việc truyền tin các sự kiện hệ thống cụ thể. Khi một sự kiện phù hợp xảy ra, ứ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 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 trình nhận sau khi phát hành ứ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ị 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 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ị, do lớp DeviceAdminInfo phân tích cú pháp. Sau đây là nội dung của device_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 vào tất cả cá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 bạn.

Để 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 giúp bạn dễ dàng diễn giải các hành động theo ý định thô do 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ý 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 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 API DeviceAdminReceiverDevicePolicyManager để viết ứng dụng quản trị thiết bị.

Phân loại phụ DeviceAdminReceiver

Để tạo ứ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 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ỉ 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 để 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ẽ xuất hiện 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 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 thao tác 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 quản trị viên.

Khi người dùng nhấp vào hộp đánh dấu Bật 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à mã đượ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 sẽ 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 hiển thị 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 cần thực hiện một thao tác phụ thuộc vào việc ứng dụng quản trị thiết bị đang 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, lớp này sử dụng phương thức DevicePolicyManager isAdminActive(). Xin lưu ý rằng phương thức DevicePolicyManager isAdminActive() lấy một 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 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 tác vụ quản trị:

Đặt chính sách mật khẩu

DevicePolicyManager bao gồm các API để cài đặt và thực thi chính sách mật khẩu 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ụ 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:

PASSWORD_QUALITY_ALPHABETIC
Người dùng phải nhập mật khẩu chứa ít nhất mộ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 chứa ít nhất cả ký tự số chữ cái (hoặc ký hiệu khác).
PASSWORD_QUALITY_NUMERIC
Người dùng phải nhập một mật khẩu chứa ít nhất một ký tự số.
PASSWORD_QUALITY_COMPLEX
Người dùng phải nhập một 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, nhưng không quan tâm đến loại mật khẩu đó.
PASSWORD_QUALITY_UNSPECIFIED
Chính sách này không yêu cầu về mật khẩu.

Ví dụ: sau đâ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ữ cái và chữ 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 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. Sau đây là các phương thức để tinh chỉnh nội dung của mật khẩu:

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 tối thiểu của mật khẩ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 thiết bị bị xoá sạch (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 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 người dùng sử dụng lại mật khẩu cũ. Phương thức này lấy tham số length (chiều 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 mật khẩu mới khớp 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 đi sử dụng lại cùng một mật khẩu. Chính sách này thường được sử 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 nhất định.

Ví dụ: đoạn mã này 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 mà người dùng 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ể 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();

Xoá sạch dữ liệu

Bạn có thể 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á sạch thiết bị là khi bạn đáp ứng một số điều kiện nhất định. Ví dụ: bạn có thể sử dụng setMaximumFailedPasswordsForWipe() để cho biết rằng một thiết bị sẽ bị xoá sau một số lần thử mật khẩu không thành công.

Bạn xoá sạch 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 mặt nạ bit của các tuỳ chọn bổ sung. Hiện tại, giá trị phải là 0.

Tắt camera

Kể từ Android 4.0, bạn có thể tắt máy ảnh. Xin lưu ý rằng không nhất thiết phải vô hiệu hoá vĩnh viễn tính năng này. Bạn có thể bật/tắt máy ảnh một cách linh động dựa trên ngữ cảnh, thời gian, v.v.

Bạn có thể kiểm soát việc máy ảnh có bị tắt hay không bằng cách sử dụng phương thức setCameraDisabled(). Ví dụ: đoạn mã này đặt camera 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 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 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

Các mẫu Android AppRestrictionEnforcerDeviceOwner minh hoạ thêm về việc sử dụng các API được trình bày trên trang này.