Profil kerja

Platform Android memungkinkan perangkat untuk memiliki kantor (terkadang disebut sebagai profil terkelola). Profil kerja dikontrol oleh admin IT, dan fungsionalitas yang tersedia diatur secara terpisah dari fungsionalitas profil utama pengguna. Pendekatan ini memungkinkan organisasi mengendalikan lingkungan di mana aplikasi dan data khusus perusahaan berjalan di perangkat pengguna, sembari tetap mengizinkan pengguna untuk menggunakan aplikasi dan profil pribadi mereka.

Tutorial ini menunjukkan cara memodifikasi aplikasi agar dapat berfungsi secara andal pada perangkat dengan profil kerja. Anda tidak perlu melakukan apa pun di luar praktik terbaik pengembangan aplikasi yang biasa. Namun, beberapa di antaranya menjadi sangat penting pada perangkat dengan profil kerja. Ini menyoroti masalah yang perlu Anda ketahui.

Ringkasan

Pengguna sering kali ingin menggunakan perangkat pribadi mereka dalam lingkungan perusahaan. Ini yang berbeda dapat menyebabkan organisasi mengalami dilema. Jika pengguna dapat menggunakan perangkat itu, organisasi harus mengkhawatirkan informasi rahasia (seperti karyawan email dan kontak) berada di perangkat yang tidak dikontrol oleh organisasi.

Untuk mengatasi situasi ini, Android 5.0 (API level 21) memungkinkan organisasi untuk menyiapkan profil kerja. Jika perangkat memiliki profil kerja, nama pengguna profil setelan berada di bawah kendali admin IT. Tujuan Admin IT dapat memilih aplikasi mana yang diizinkan untuk profil tersebut, dan dapat mengontrol fitur perangkat apa yang tersedia untuk profil.

Jika perangkat memiliki profil kerja, akan ada implikasi untuk aplikasi berjalan di perangkat, apa pun profil tempat aplikasi berjalan:

  • Secara default, sebagian besar intent tidak menyilang dari satu profil ke profil lainnya. Jika aplikasi yang berjalan di profil mengaktifkan intent, tidak ada pengendali untuk intent pada profil tersebut, dan intent-nya tidak diizinkan untuk menyeberang ke profil lain karena pembatasan profil, permintaan gagal dan aplikasi dapat dinonaktifkan secara tidak terduga.
  • Admin IT profil dapat membatasi aplikasi sistem mana yang tersedia di profil kerja Anda. Pembatasan ini juga dapat mengakibatkan tidak adanya pengendali untuk beberapa intent umum pada profil kerja.
  • Karena profil pribadi dan profil kerja memiliki area penyimpanan yang terpisah, sebuah URI file yang valid di satu profil tidak valid di profil yang lain. Apa saja intent yang diaktifkan di satu profil mungkin akan ditangani di profil yang lain (bergantung pada profilnya setelan), sehingga tidak aman untuk melampirkan URI file ke intent.

Mencegah intent yang gagal

Pada perangkat dengan profil kerja, ada batasan terkait apakah intent dapat disilangkan dari satu profil ke profil lainnya. Umumnya, saat intent diaktifkan dinonaktifkan, ditangani pada profil yang sama tempatnya diaktifkan. Jika tidak ada pengendali untuk intent di profil tersebut, intent tidak akan ditangani dan aplikasi yang memicunya dapat mati secara tiba-tiba—bahkan jika ada pengendali untuk maksud pada profil lain.

Admin profil dapat memilih intent yang diizinkan untuk menyeberang dari satu profil ke profil lain. Karena admin IT membuat keputusan ini, tidak ada cara bagi Anda untuk mengetahui terlebih dahulu intent mana yang diizinkan untuk melewati batas ini. Tujuan Admin IT menetapkan kebijakan ini, dan bebas mengubahnya kapan saja.

Sebelum aplikasi memulai aktivitas, Anda harus memverifikasi bahwa ada resolusi yang sesuai. Anda dapat memverifikasi adanya resolusi yang dapat diterima dengan memanggil Intent.resolveActivity(). Jika tidak ada untuk menyelesaikan intent, metode akan mengembalikan null. Jika metode mengembalikan {i>non-null<i}, setidaknya ada satu cara untuk menyelesaikan intent, dan aman untuk memicu intent tersebut. Dalam hal ini, intent dapat diselesaikan karena ada pengendali pada profil saat ini, atau karena intent-nya diizinkan untuk menyeberang ke pengendali di profil lain. (Untuk informasi selengkapnya tentang menyelesaikan intent, lihat Intent Umum.)

Misalnya, jika aplikasi Anda perlu mengatur timer, aplikasi itu perlu memeriksa ada pengendali yang valid untuk intent ACTION_SET_TIMER. Jika aplikasi tidak dapat menyelesaikan intent, maka harus mengambil tindakan yang sesuai (seperti menampilkan error pesan ini).

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);

    }
}

Berbagi file di seluruh profil

Terkadang sebuah aplikasi perlu memberi aplikasi lain akses ke filenya sendiri. Misalnya, aplikasi galeri gambar mungkin ingin membagikan gambarnya dengan gambar Google. Biasanya ada dua cara untuk berbagi file: dengan file URI atau URI konten.

URI file dimulai dengan awalan file:, diikuti dengan jalur absolut file di penyimpanan perangkat. Namun, karena profil kerja dan profil pribadi menggunakan area penyimpanan terpisah, yaitu URI file yang valid di satu profil tidak valid di profil yang lain. Situasi ini berarti jika Anda melampirkan URI file ke intent, dan intent tersebut ditangani di profil lain, {i>handler<i} tidak dapat mengakses file.

Sebagai gantinya, Anda harus berbagi file dengan URI konten. URI Konten mengidentifikasi {i>file<i} dengan cara yang lebih aman dan dapat dibagikan. URI konten berisi jalur file, tetapi juga otoritas yang menyediakan file, dan nomor ID yang mengidentifikasi file. Anda dapat membuat ID konten untuk file apa pun menggunakan FileProvider. Anda kemudian dapat membagikan konten tersebut ID dengan aplikasi lain (bahkan di profil lainnya). Penerima dapat menggunakan Content ID untuk mendapatkan akses ke file yang sebenarnya.

Misalnya, berikut ini cara mendapatkan URI konten untuk file tertentu 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);

Saat Anda memanggil metode getUriForFile(), Anda harus menyertakan otoritas penyedia file (dalam contoh ini, "com.example.myapp.fileprovider"), yang ditentukan dalam <provider> dari manifes aplikasi Anda. Untuk informasi selengkapnya tentang berbagi file dengan URI konten, lihat Berbagi File.

Mendengarkan notifikasi

Sebuah aplikasi biasanya menyediakan NotificationListenerService subclass ke menerima callback dari sistem tentang perubahan notifikasi. Perangkat dengan profil kerja mungkin memengaruhi cara kerja NotificationListenerService dengan aplikasi Anda.

Di profil kerja

Anda tidak dapat menggunakan NotificationListenerService dari aplikasi yang berjalan di profil kerja. Saat aplikasi Anda berjalan di profil kerja, sistem akan mengabaikan NotificationListenerService aplikasi Anda. Namun, aplikasi yang berjalan di profil pribadi dapat memproses notifikasi.

Di profil pribadi

Jika aplikasi Anda berjalan di profil pribadi, Anda mungkin tidak mendapatkan notifikasi untuk aplikasi yang berjalan di profil kerja. Secara default, semua aplikasi profil pribadi menerima callback, tetapi admin IT dapat mengizinkan satu atau beberapa profil pribadi aplikasi yang mereka izinkan untuk mendengarkan perubahan notifikasi. Sistem kemudian memblokir aplikasi yang tidak diizinkan. Di Android 8.0 (API level 26) atau yang lebih baru, kebijakan perangkat pengontrol (DPC) yang mengelola profil kerja dapat memblokir aplikasi Anda agar tidak memproses ke notifikasi profil kerja menggunakan DevicePolicyManager metode setPermittedCrossProfileNotificationListeners(). Aplikasi Anda masih menerima callback tentang notifikasi yang diposting di kontak pribadi untuk profil.

Menguji Kompatibilitas Aplikasi dengan Profil Kerja

Anda harus menguji aplikasi di lingkungan profil kerja untuk menangkap masalah yang akan menyebabkan aplikasi Anda gagal pada perangkat dengan profil kerja. Secara khusus, menguji pada perangkat profil kerja adalah cara untuk memastikan bahwa aplikasi Anda menangani intent dengan benar: tidak memicu intent yang tidak dapat ditangani, tidak melampirkan URI yang tidak berfungsi antar-profil, sehingga kueri.

Kami telah menyediakan aplikasi contoh, TestDPC, yang dapat digunakan untuk menyiapkan profil kerja di perangkat Android yang menjalankan Android 5.0 (level API 21) dan yang lebih tinggi. Aplikasi ini menawarkan cara mudah untuk menguji aplikasi Anda di lingkungan profil kerja. Anda juga dapat menggunakan aplikasi ini untuk mengonfigurasi profil kerja sebagai berikut:

  • Tentukan aplikasi default mana yang tersedia di perangkat profil Linkedin Anda
  • Mengonfigurasi intent mana yang diizinkan untuk menyeberang dari satu profil ke yang lain

Jika Anda menginstal aplikasi secara manual melalui kabel USB ke perangkat yang memiliki profil kerja, aplikasi diinstal di profil kerja dan untuk profil. Setelah menginstal aplikasi, Anda dapat menguji aplikasi tersebut di kondisi berikut:

  • Jika suatu intent biasanya akan ditangani oleh aplikasi default (misalnya, aplikasi kamera), coba nonaktifkan aplikasi default tersebut di profil kerja, dan memverifikasi bahwa aplikasi menangani hal ini dengan tepat.
  • Jika Anda mengaktifkan intent yang mengharapkannya ditangani oleh aplikasi lain, coba mengaktifkan dan menonaktifkan izin intent tersebut untuk menyeberang dari satu profil ke lain. Pastikan aplikasi berperilaku dengan benar dalam kedua situasi tersebut. Jika intent tidak diizinkan untuk berpindah di antara profil, verifikasi perilaku aplikasi ketika ada pengendali yang sesuai pada profil aplikasi, dan saat tidak ada. Misalnya, jika aplikasi Anda mengaktifkan intent terkait peta, coba setiap tindakan berikut skenario:
    • Perangkat memungkinkan intent peta menyeberang dari satu profil ke profil lainnya, dan ada pengendali yang sesuai di profil lain (profil yang bukan berjalan di)
    • Perangkat tidak mengizinkan intent peta untuk persilangan profil, tetapi ada adalah pengendali yang sesuai pada profil aplikasi
    • Perangkat tidak mengizinkan intent peta untuk persilangan profil, dan di sana bukan pengendali yang cocok untuk intent peta di profil perangkat
  • Jika Anda melampirkan konten ke intent, verifikasi apakah intent tersebut berperilaku dengan benar baik saat ditangani di profil aplikasi, maupun saat berpindah di antara untuk profil.

Menguji profil kerja: tips dan trik

Ada beberapa trik yang mungkin dapat membantu Anda menguji perangkat profil kerja.

  • Seperti yang telah disebutkan, saat Anda melakukan sideload aplikasi di perangkat profil kerja, aplikasi diinstal di kedua profil. Jika mau, Anda dapat menghapus aplikasi dari satu profil dan meninggalkannya di sisi lain.
  • Sebagian besar perintah pengelola aktivitas tersedia di shell Android Debug Bridge (adb) mendukung flag --user, yang memungkinkan Anda menentukan pengguna mana yang akan dijalankan sebagai. Dengan menentukan pengguna, Anda dapat memilih apakah akan menjalankannya sebagai pengguna utama yang tidak dikelola atau profil kerja Anda. Untuk informasi selengkapnya, lihat ADB Perintah Shell.
  • Untuk menemukan pengguna aktif di perangkat, gunakan metode Perintah list users. Angka pertama dalam {i>string <i}output adalah ID pengguna, yang dapat Anda gunakan dengan tanda --user. Untuk selengkapnya informasi tambahan, lihat ADB Shell Perintah.

Misalnya, untuk menemukan pengguna di perangkat, Anda harus menjalankan perintah ini:

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

Dalam hal ini, pengguna utama("Drew") memiliki ID Pengguna 0, dan profil kerja memiliki ID pengguna 10. Untuk menjalankan aplikasi di profil kerja, Anda akan menggunakan perintah seperti ini:

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