Hồ sơ công việc

Nền tảng Android cho phép các thiết bị có cơ quan hồ sơ (đôi khi được gọi là hồ sơ được quản lý). Hồ sơ công việc được kiểm soát bởi một quản trị viên CNTT và chức năng có sẵn cho dịch vụ này được đặt riêng biệt với chức năng hồ sơ chính của người dùng. Phương pháp này cho phép tổ chức kiểm soát môi trường nơi các ứng dụng và dữ liệu của công ty đang chạy trên thiết bị của người dùng, mà vẫn cho phép người dùng sử dụng hồ sơ và ứng dụng cá nhân của họ.

Bài học này sẽ hướng dẫn bạn cách sửa đổi ứng dụng để ứng dụng hoạt động một cách đáng tin cậy trên thiết bị có hồ sơ công việc. Bạn không phải làm gì thêm bên cạnh những phương pháp hay nhất để phát triển ứng dụng thông thường. Tuy nhiên, một số phương pháp trở nên đặc biệt quan trọng trên các thiết bị có hồ sơ công việc. Chiến dịch này tài liệu nêu bật các vấn đề mà bạn cần lưu ý.

Tổng quan

Người dùng thường muốn sử dụng thiết bị cá nhân của họ trong chế độ cài đặt dành cho doanh nghiệp. Chiến dịch này tình huống có thể khiến tổ chức rơi vào thế tiến thoái lưỡng nan. Nếu người dùng có thể sử dụng thiết bị nào thì tổ chức phải lo lắng về thông tin mật đó (như nhân viên email và danh bạ) đều ở trên một thiết bị mà tổ chức không kiểm soát.

Để giải quyết tình huống này, Android 5.0 (API cấp 21) cho phép các tổ chức thiết lập hồ sơ công việc. Nếu thiết bị có hồ sơ công việc, các chế độ cài đặt này đều do quản trị viên CNTT kiểm soát. Chiến lược phát hành đĩa đơn Quản trị viên CNTT có thể chọn những ứng dụng được phép dùng hồ sơ đó và có thể kiểm soát những tính năng thiết bị có thể sử dụng cho hồ sơ.

Nếu thiết bị có hồ sơ công việc, thì các ứng dụng sẽ có nhiều ảnh hưởng chạy trên thiết bị, bất kể ứng dụng đang chạy trong cấu hình nào:

  • Theo mặc định, hầu hết các ý định không chuyển từ hồ sơ này sang hồ sơ khác. Nếu một ứng dụng chạy trên hồ sơ kích hoạt một ý định, không có trình xử lý nào cho ý định trên hồ sơ đó và ý định không được phép chuyển sang hồ sơ khác do các hạn chế về hồ sơ, yêu cầu sẽ không thành công và ứng dụng có thể bị tắt bất ngờ.
  • Quản trị viên CNTT của hồ sơ có thể giới hạn những ứng dụng hệ thống nào có sẵn trên hồ sơ công việc. Quy định hạn chế này cũng có thể dẫn đến việc không có trình xử lý cho một số ý định phổ biến trên hồ sơ công việc.
  • Vì hồ sơ cá nhân và hồ sơ công việc có khu vực lưu trữ riêng, nên URI tệp hợp lệ trên một cấu hình nhưng lại không hợp lệ trên cấu hình còn lại. Bất kỳ hạng nào ý định được kích hoạt trên một hồ sơ có thể được xử lý trên hồ sơ còn lại (tuỳ thuộc vào hồ sơ cài đặt), vì vậy, việc đính kèm URI tệp vào ý định là không an toàn.

Ngăn chặn ý định không thành công

Trên thiết bị có hồ sơ công việc, sẽ có những hạn chế về việc liệu ý định có thể chuyển từ hồ sơ này sang hồ sơ khác. Trong hầu hết các trường hợp, khi một ý định được kích hoạt tắt, thì lệnh đó được xử lý trên cùng một hồ sơ nơi lệnh được kích hoạt. Nếu không có trình xử lý đối với ý định trên hồ sơ đó, ý định sẽ không được xử lý và ứng dụng kích hoạt, nó có thể tắt đột ngột—ngay cả khi có một trình xử lý ý định trên hồ sơ khác.

Quản trị viên hồ sơ có thể chọn ý định được phép chuyển từ hồ sơ này sang hồ sơ khác. Vì quản trị viên CNTT đưa ra quyết định này, không có cách nào để bạn biết trước ý định nào được phép vượt qua ranh giới này. Chiến lược phát hành đĩa đơn Quản trị viên CNTT đặt chính sách này và có thể thay đổi bất cứ lúc nào.

Trước khi ứng dụng của bạn bắt đầu một hoạt động, bạn nên xác minh rằng có độ phân giải phù hợp. Bạn có thể xác minh một giải pháp được chấp nhận bằng cách gọi Intent.resolveActivity(). Nếu không có để phân giải ý định, thì phương thức sẽ trả về null. Nếu phương thức này trả về một giá trị khác rỗng, có ít nhất một cách để giải quyết ý định đó và có thể kích hoạt ý định đó một cách an toàn. Trong trường hợp này, có thể phân giải được bằng vì hồ sơ hiện tại có một trình xử lý hoặc vì ý định được phép chuyển đến trình xử lý trên hồ sơ khác. (Để biết thêm thông tin về giải quyết ý định, vui lòng xem phần Ý định phổ biến.)

Ví dụ: nếu ứng dụng của bạn cần đặt bộ hẹn giờ, ứng dụng cần kiểm tra xem có một trình xử lý hợp lệ cho ý định ACTION_SET_TIMER. Nếu ứng dụng không phân giải được ý định thì phải hành động thích hợp (chẳng hạn như hiển thị lỗi ).

Kotlin

fun startTimer(message: String, seconds: Int) {

    // Build the "set timer" intent
    val timerIntent = Intent(AlarmClock.ACTION_SET_TIMER).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_LENGTH, seconds)
        putExtra(AlarmClock.EXTRA_SKIP_UI, true)
    }

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(packageManager) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent)

    }
}

Java

public void startTimer(String message, int seconds) {

    // Build the "set timer" intent
    Intent timerIntent = new Intent(AlarmClock.ACTION_SET_TIMER)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
            .putExtra(AlarmClock.EXTRA_SKIP_UI, true);

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(getPackageManager()) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent);

    }
}

Chia sẻ các tệp giữa nhiều hồ sơ

Đôi khi, một ứng dụng cần cung cấp cho các ứng dụng khác quyền truy cập vào các tệp của ứng dụng đó. Ví dụ: một ứng dụng thư viện hình ảnh có thể muốn chia sẻ hình ảnh của ứng dụng cùng với hình ảnh người chỉnh sửa. Thông thường, có hai cách để bạn chia sẻ một tệp: bằng cách dùng tệp URI hoặc URI nội dung.

URI tệp bắt đầu bằng tiền tố file:, theo sau là đường dẫn tuyệt đối của tệp trên bộ nhớ của thiết bị. Tuy nhiên, vì hồ sơ công việc và hồ sơ cá nhân sử dụng các khu vực lưu trữ riêng biệt, URI tệp có hiệu lực trên một hồ sơ nhưng không hợp lệ trên hồ sơ còn lại. Tình huống này có nghĩa là nếu bạn đính kèm URI tệp vào ý định và ý định được xử lý trên cấu hình khác, trình xử lý không thể truy cập vào tệp.

Thay vào đó, bạn nên chia sẻ tệp bằng URI nội dung. URI nội dung xác định tệp theo cách an toàn hơn, có thể chia sẻ. URI nội dung chứa đường dẫn tệp, cũng như đơn vị quản lý cung cấp tệp và số nhận dạng xác định tệp. Bạn có thể tạo Content ID cho bất kỳ tệp nào bằng cách sử dụng FileProvider. Sau đó, bạn có thể chia sẻ nội dung đó Mã nhận dạng của các ứng dụng khác (ngay cả trên hồ sơ khác). Người nhận có thể sử dụng Content ID để có quyền truy cập vào tệp thực tế.

Ví dụ: dưới đây là cách bạn sẽ nhận URI nội dung cho một tệp cụ thể URI:

Kotlin

// Open File object from its file URI
val fileToShare = File(fileUriToShare)

val contentUriToShare: Uri = FileProvider.getUriForFile(
        context,
        "com.example.myapp.fileprovider",
        fileToShare
)

Java

// Open File object from its file URI
File fileToShare = new File(fileUriToShare);

Uri contentUriToShare = FileProvider.getUriForFile(getContext(),
        "com.example.myapp.fileprovider", fileToShare);

Khi bạn gọi phương thức getUriForFile(), bạn phải bao gồm thẩm quyền của nhà cung cấp tệp (trong ví dụ này, "com.example.myapp.fileprovider"), được chỉ định trong <provider> của tệp kê khai ứng dụng. Để biết thêm thông tin về cách chia sẻ tệp bằng URI nội dung, hãy xem Chia sẻ doanh thu Tệp.

Nghe thông báo

Một ứng dụng thường cung cấp NotificationListenerService lớp con sang nhận lệnh gọi lại từ hệ thống về các thay đổi đối với thông báo. Thiết bị có hồ sơ công việc có thể ảnh hưởng đến cách hoạt động của NotificationListenerService với ứng dụng của bạn.

Trong hồ sơ công việc

Bạn không thể sử dụng NotificationListenerService từ một ứng dụng chạy trong hồ sơ công việc. Khi ứng dụng của bạn đang chạy trong hồ sơ công việc, hệ thống bỏ qua NotificationListenerService của ứng dụng. Tuy nhiên, các ứng dụng chạy trong hồ sơ cá nhân có thể theo dõi thông báo.

Trong hồ sơ cá nhân

Khi ứng dụng của bạn chạy trong hồ sơ cá nhân, bạn có thể không nhận được thông báo cho các ứng dụng chạy trong hồ sơ công việc. Theo mặc định, tất cả các ứng dụng hồ sơ cá nhân nhận cuộc gọi lại nhưng quản trị viên CNTT có thể đưa một hoặc nhiều hồ sơ cá nhân vào danh sách cho phép mà họ cho phép theo dõi các thay đổi về thông báo. Sau đó, hệ thống sẽ chặn ứng dụng không có trong danh sách cho phép. Trong Android 8.0 (API cấp 26) trở lên, chính sách thiết bị bộ điều khiển (DPC) quản lý hồ sơ công việc có thể chặn ứng dụng của bạn nghe đối với các thông báo của hồ sơ công việc bằng DevicePolicyManager phương thức setPermittedCrossProfileNotificationListeners() Ứng dụng của bạn vẫn nhận được lệnh gọi lại về thông báo đã đăng trong hồ sơ cá nhân hồ sơ.

Kiểm tra khả năng tương thích của ứng dụng với Hồ sơ công việc

Bạn nên kiểm thử ứng dụng của mình trong môi trường hồ sơ công việc để phát hiện các vấn đề có thể khiến ứng dụng của bạn gặp lỗi trên thiết bị có hồ sơ công việc. Cụ thể, thử nghiệm trên thiết bị có hồ sơ công việc là giúp đảm bảo ứng dụng của bạn xử lý ý định đúng cách: không kích hoạt ý định bạn không thể xử lý, không đính kèm URI không hoạt động giữa các hồ sơ, v.v. .

Chúng tôi đã cung cấp một ứng dụng mẫu, TestDPC, mà bạn có thể dùng để thiết lập hồ sơ công việc trên thiết bị Android chạy Android 5.0 (API cấp 21) trở lên. Ứng dụng này cung cấp cho bạn một cách đơn giản để thử nghiệm ứng dụng của bạn trong môi trường hồ sơ công việc. Bạn cũng có thể dùng ứng dụng này để định cấu hình hồ sơ công việc như sau:

  • Chỉ định ứng dụng mặc định nào có sẵn trên trình quản lý hồ sơ
  • Định cấu hình những ý định được phép chuyển từ một hồ sơ sang thiết bị khác

Nếu bạn cài đặt thủ công một ứng dụng qua cáp USB vào một thiết bị có hồ sơ công việc, ứng dụng được cài đặt trên cả hồ sơ cá nhân và hồ sơ công việc hồ sơ. Sau khi cài đặt ứng dụng, bạn có thể kiểm tra ứng dụng trong các điều kiện sau:

  • Nếu một ý định thường được một ứng dụng mặc định xử lý (ví dụ: ứng dụng máy ảnh), hãy thử tắt ứng dụng mặc định đó trên hồ sơ công việc và xác minh rằng ứng dụng xử lý vấn đề này một cách phù hợp.
  • Nếu bạn kích hoạt một ý định và mong muốn ứng dụng đó được xử lý bởi một ứng dụng khác, hãy thử bật và tắt quyền của ý định để chuyển từ một hồ sơ sang khác. Xác minh rằng ứng dụng hoạt động đúng cách trong cả hai trường hợp. Nếu ý định không được phép trao đổi giữa các hồ sơ, hãy xác minh hành vi của ứng dụng khi hồ sơ ứng dụng có trình xử lý phù hợp và khi hồ sơ không có trình xử lý. Ví dụ: nếu ứng dụng của bạn kích hoạt một ý định liên quan đến bản đồ, hãy thử từng cách sau trường hợp:
    • Thiết bị này cho phép các ý định trên bản đồ đi từ hồ sơ này sang hồ sơ khác, và có một trình xử lý phù hợp trên hồ sơ khác (hồ sơ mà ứng dụng không chạy trên)
    • Thiết bị này không cho phép các ý định bản đồ đi giữa các hồ sơ, nhưng là trình xử lý phù hợp trong hồ sơ của ứng dụng
    • Thiết bị này không cho phép các ý định trên bản đồ đi giữa các hồ sơ, và không phải là trình xử lý phù hợp cho ý định của bản đồ trên hồ sơ của thiết bị
  • Nếu bạn đính kèm nội dung vào một ý định, hãy xác minh rằng ý định đó hoạt động đúng cách cả khi được xử lý trên hồ sơ của ứng dụng lẫn khi giao thoa giữa hồ sơ.

Kiểm thử trên hồ sơ công việc: mẹo và thủ thuật

Có một số thủ thuật mà bạn có thể thấy hữu ích khi thử nghiệm trên hồ sơ công việc.

  • Như đã lưu ý, khi bạn cài đặt một ứng dụng không qua cửa hàng ứng dụng trên thiết bị có hồ sơ công việc, ứng dụng đó được cài đặt trên cả hai hồ sơ. Nếu muốn, bạn có thể xoá ứng dụng khỏi một hồ sơ và để nguyên trên nền tảng còn lại.
  • Hầu hết các lệnh của trình quản lý hoạt động có sẵn trong shell Cầu gỡ lỗi Android (adb) hỗ trợ cờ --user, cho phép bạn chỉ định người dùng nào cần chạy dưới dạng. Bằng cách chỉ định người dùng, bạn có thể chọn chạy với tư cách là người dùng chính không được quản lý hoặc hồ sơ công việc. Để biết thêm thông tin, xem ADB Lệnh Shell.
  • Để tìm người dùng đang hoạt động trên một thiết bị, hãy sử dụng Lệnh list users. Số đầu tiên trong chuỗi đầu ra là mã nhận dạng người dùng mà bạn có thể sử dụng với cờ --user. Để biết thêm thông tin, xem ADB Shell Lệnh.

Ví dụ: để tìm người dùng trên một thiết bị, bạn sẽ chạy lệnh sau:

$ adb shell pm list users
UserInfo{0:Drew:13} running
UserInfo{10:Work profile:30} running

Trong trường hợp này, người dùng chính ("Drew") có mã nhận dạng người dùng là 0 và hồ sơ công việc có mã nhận dạng người dùng là 10. Để chạy ứng dụng trong hồ sơ công việc, bạn sẽ sử dụng một lệnh như sau:

$ adb shell am start --user 10 \
-n "com.example.myapp/com.example.myapp.testactivity" \
-a android.intent.action.MAIN -c android.intent.category.LAUNCHER