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