Android platformu, cihazların iş profillerine (bazen yönetilen profil olarak da adlandırılır) sahip olmasına olanak tanır. İş profili BT yöneticisi tarafından kontrol edilir ve iş profiline sunulan işlevler kullanıcının birincil profilinin işlevlerinden ayrı olarak ayarlanır. Kuruluşlar bu yaklaşım sayesinde şirkete özel uygulamaların ve verilerin kullanıcının cihazında çalıştığı ortamı kontrol ederken kullanıcıların kişisel uygulamalarını ve profillerini kullanmasına da izin verebilir.
Bu derste, iş profili olan bir cihazda güvenilir şekilde çalışması için uygulamanızı nasıl değiştireceğiniz gösterilmektedir. Uygulama geliştirmeyle ilgili sıradan en iyi uygulamalar dışında bir şey yapmanıza gerek yoktur. Ancak bu en iyi uygulamalardan bazıları, iş profili olan cihazlarda özellikle önemli hale gelir. Bu dokümanda, bilmeniz gereken sorunlar vurgulanmaktadır.
Genel bakış
Kullanıcılar genellikle kişisel cihazlarını kurumsal bir ortamda kullanmak ister. Bu durum kurumlarda bir ikilem oluşmasına yol açabilir. Kullanıcı kendi cihazını kullanabiliyorsa kuruluş, gizli bilgilerin (çalışan e-postaları ve kişileri gibi) kuruluşun kontrol etmediği bir cihazda bulunması konusunda endişelidir.
Android 5.0 (API düzeyi 21), bu durumu düzeltmek için kuruluşların iş profilleri oluşturmasına olanak tanır. Bir cihazda iş profili varsa profilin ayarları BT yöneticisinin kontrolünde olur. BT yöneticisi, söz konusu profil için hangi uygulamalara izin verileceğini seçebilir ve profilde yalnızca hangi cihaz özelliklerinin kullanılabileceğini kontrol edebilir.
Bir cihazda iş profili varsa uygulamanın çalıştığı profilden bağımsız olarak, bu cihazda çalışan uygulamalar bundan etkilenir:
- Varsayılan olarak çoğu amaç bir profilden diğerine geçmez. Profilde çalışan bir uygulama bir niyet tetiklerse söz konusu profilde amaç için işleyici bulunmaz ve profil kısıtlamaları nedeniyle amacın diğer profile geçmesine izin verilmez, istek başarısız olur ve uygulama beklenmedik bir şekilde kapatılabilir.
- Profil BT yöneticisi, iş profilinde hangi sistem uygulamalarının kullanılabileceğini sınırlayabilir. Bu kısıtlama, iş profilinde bazı yaygın amaçlar için işleyici olmamasına da yol açabilir.
- Kişisel profiller ve iş profilleri ayrı depolama alanları olduğundan, bir profilde geçerli olan bir dosya URI'si diğer profilde geçerli olmaz. Bir profilde tetiklenen herhangi bir niyet diğerinde işlenebilir (profil ayarlarına bağlı olarak), bu nedenle amaçlara dosya URI'leri eklemek güvenli değildir.
Başarısız amaçları önleyin
İş profili olan bir cihazda, amaçların bir profilden diğerine geçip geçemeyeceğine dair kısıtlamalar vardır. Çoğu durumda, bir amaç etkinleştiğinde, tetiklendiği profilde işlenir. Bu profilde amaç için işleyici yoksa amaç işlenmez ve bunu tetikleyen uygulama, diğer profilde amaç için bir işleyici olsa bile beklenmedik şekilde kapanabilir.
Profil yöneticisi, hangi amaçların bir profilden diğerine geçirileceğini seçebilir. Bu kararı BT yöneticisi verdiğinden hangi amaçların bu sınırı geçmesine izin verildiğini önceden bilmenin bir yolu yoktur. Bu politikayı BT yöneticisi belirler ve istediği zaman değiştirebilir.
Uygulamanız bir etkinlik başlatmadan önce uygun bir çözüm olduğunu doğrulamanız gerekir. Kabul edilebilir bir çözüm olduğunu doğrulamak için Intent.resolveActivity()
numaralı telefonu arayabilirsiniz. Amacı çözümlemenin bir yolu yoksa yöntem null
değerini döndürür. Yöntem null olmayan bir değer döndürürse amacı çözmenin en az bir yolu vardır ve amacı etkinleşmek güvenlidir. Bu durumda, geçerli profilde bir işleyici olduğu veya amacın diğer profilde bir işleyiciye geçmesine izin verildiği için amaç çözümlenebilir olabilir. (Amaçları çözümleme hakkında daha fazla bilgi için Yaygın Amaçlar konusuna bakın.)
Örneğin, uygulamanızın zamanlayıcılar ayarlaması gerekiyorsa ACTION_SET_TIMER
amacı için geçerli bir işleyici olup olmadığını kontrol etmesi gerekir. Uygulama amacı çözemezse gereken işlemi (hata mesajı göstermek gibi) yapmalıdır.
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); } }
Profiller arasında dosya paylaşma
Bazen bir uygulamanın başka uygulamaların kendi dosyalarına erişmesini sağlaması gerekir. Örneğin, bir resim galerisi uygulaması, resimlerini resim düzenleyicilerle paylaşmak isteyebilir. Dosyaları normalde iki şekilde paylaşabilirsiniz: dosya URI'sı veya içerik URI'si ile.
Dosya URI'si, file:
önekiyle başlar ve ardından cihazın depolama alanındaki dosyanın mutlak yolu gelir. Ancak, iş profili ve kişisel profil ayrı depolama alanları kullandığından, bir profilde geçerli olan bir dosya URI'si diğer profilde geçerli değildir. Bu durum, bir amaca bir dosya URI'si eklerseniz ve amaç diğer profilde işlenirse işleyicinin dosyaya erişemeyeceği anlamına gelir.
Bunun yerine, dosyaları içerik URI'leriyle paylaşmanız gerekir. İçerik URI'leri dosyayı daha güvenli ve paylaşılabilir bir şekilde tanımlar. İçerik URI'si, dosya yolunun yanı sıra dosyayı sağlayan yetkiliyi ve dosyayı tanımlayan bir kimlik numarasını da içerir. FileProvider
kullanarak herhangi bir dosya için içerik kimliği oluşturabilirsiniz. Daha sonra bu Content ID'yi diğer uygulamalarla (başka profilde bile) paylaşabilirsiniz. Alıcı, gerçek dosyaya erişmek için Content ID'yi kullanabilir.
Örneğin, belirli bir dosya URI'si için içerik URI'sini şu şekilde alabilirsiniz:
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);
getUriForFile()
yöntemini çağırırken dosya sağlayıcının yetkisini (bu örnekte, "com.example.myapp.fileprovider"
) eklemeniz gerekir. Bu yetki, uygulama manifestinizin <provider>
öğesinde belirtilir.
Dosyaları içerik URI'leriyle paylaşma hakkında daha fazla bilgi için Dosya Paylaşımı konusuna bakın.
Bildirimleri dinleyin
Uygulamalar genellikle bildirimlerde yapılan değişikliklerle ilgili sistemden geri aramaları almak için bir NotificationListenerService
alt sınıfı sağlar. İş profili olan cihazlar, NotificationListenerService
uygulamasının uygulamanızla çalışma şeklini etkileyebilir.
İş profilinde
İş profilinde çalışan bir uygulamadaki NotificationListenerService
öğesini kullanamazsınız. Uygulamanız bir iş profilinde çalışırken sistem, uygulamanızın NotificationListenerService
özelliğini yoksayar. Ancak, kişisel profilde çalışan uygulamalar bildirimleri dinleyebilir.
Kişisel profilde
Uygulamanız kişisel profilde çalıştığında, iş profilinde çalışan uygulamalar için bildirim alamayabilirsiniz. Varsayılan olarak tüm kişisel profil uygulamaları geri çağırmaları alır ancak BT yöneticisi, bildirim değişikliklerini dinlemesine izin verdiği bir veya daha fazla kişisel profil uygulamasını izin verilenler listesine ekleyebilir. Ardından sistem, izin verilenler listesinde
olmayan uygulamaları engeller. Android 8.0 (API düzeyi 26) veya sonraki sürümlerde, bir iş profilini yöneten cihaz politikası denetleyici (DPC), DevicePolicyManager
yöntemini setPermittedCrossProfileNotificationListeners()
kullanarak uygulamanızın iş profili bildirimlerini dinlemesini engelleyebilir.
Uygulamanız, kişisel profilde yayınlanan bildirimlerle ilgili geri aramaları almaya devam eder.
Uygulamanızın İş Profilleriyle Uyumluluk Testi
Uygulamanızın iş profili olan bir cihazda başarısız olmasına neden olacak sorunları tespit etmek için uygulamanızı bir iş profili ortamında test etmeniz gerekir. Özellikle, bir iş profili cihazında test etmek, uygulamanızın amaçları doğru şekilde işlediğinden emin olmanın iyi bir yoludur: İşlenemeyen niyetleri tetiklememek, profiller arası çalışmayan URI'ları eklememek vb.
Android 5.0 (API düzeyi 21) ve sonraki sürümleri çalıştıran Android cihazlarda iş profili oluşturmak için kullanabileceğiniz örnek bir uygulama olan TestDPC'yi sunuyoruz. Bu uygulama, uygulamanızı bir iş profili ortamında test etmeniz için basit bir yol sunar. Bu uygulamayı, iş profilini şu şekilde yapılandırmak için de kullanabilirsiniz:
- Yönetilen profilde hangi varsayılan uygulamaların kullanılabileceğini belirtin
- Bir profilden diğerine geçişine izin verilen amaçları yapılandırın
İş profili olan bir cihaza USB kablosu üzerinden manuel olarak bir uygulama yüklerseniz, uygulama hem kişisel profile hem de iş profiline yüklenir. Uygulamayı yükledikten sonra aşağıdaki koşullar altında test edebilirsiniz:
- Bir niyet normalde varsayılan bir uygulama (örneğin, kamera uygulaması) tarafından işlenecekse iş profilinde bu varsayılan uygulamayı devre dışı bırakmayı deneyin ve uygulamanın bunu düzgün bir şekilde işlediğini doğrulayın.
- Başka bir uygulama tarafından işlenmesini bekleyen bir niyet tetiklerseniz amacın bir profilden diğerine geçiş iznini etkinleştirip devre dışı bırakmayı deneyin. Uygulamanın her iki koşulda da düzgün şekilde çalıştığını doğrulayın. Amacın profiller arasında geçiş yapmasına izin verilmiyorsa hem uygulamanın profilinde uygun bir işleyici olduğunda hem de böyle bir işleyici olmadığında uygulamanın davranışını doğrulayın.
Örneğin, uygulamanız haritayla ilgili bir amacı tetiklerse aşağıdaki senaryoların her birini deneyin:
- Cihaz, harita amaçlarının bir profilden diğerine geçiş yapmasına olanak tanır ve diğer profilde uygun bir işleyici vardır (uygulamanın çalışmadığı profil)
- Cihaz, harita amaçlarının profiller arasında geçiş yapmasına izin vermiyordur, ancak uygulamanın profilinde uygun bir işleyici vardır
- Cihaz, harita amaçlarının profiller arasında geçiş yapmasına izin vermez ve cihazın profilinde harita amaçları için uygun bir işleyici yoktur
- Bir amaca içerik eklerseniz niyetin hem uygulama profilinde işlendiğinde hem de profiller arasında kesiştiğinde düzgün davrandığını doğrulayın.
İş profilleri üzerinde test yapma: ipuçları ve püf noktaları
Bir iş profili cihazında test ederken faydalı bulabileceğiniz birkaç püf noktası vardır.
- Daha önce de belirtildiği gibi, bir uygulamayı iş profili cihazına başka cihazdan yüklediğinizde, uygulama her iki profile de yüklenir. İsterseniz, uygulamayı bir profilden silip diğer profilde bırakabilirsiniz.
- Android Debug Bridge (adb) kabuğunda bulunan etkinlik yöneticisi komutlarının çoğu, hangi kullanıcı olarak çalıştırılacağını belirtmenizi sağlayan
--user
işaretini destekler. Bir kullanıcı belirterek, yönetilmeyen birincil kullanıcı veya iş profili olarak çalıştırılıp çalıştırılmayacağını seçebilirsiniz. Daha fazla bilgi için ADB Kabuk Komutları bölümünü inceleyin. - Bir cihazdaki etkin kullanıcıları bulmak için adb paket yöneticisinin
list users
komutunu kullanın. Çıkış dizesindeki ilk sayı,--user
işaretiyle birlikte kullanabileceğiniz kullanıcı kimliğidir. Daha fazla bilgi için ADB Kabuk Komutları bölümüne bakın.
Örneğin, bir cihazdaki kullanıcıları bulmak için şu komutu çalıştırırsınız:
$ adb shell pm list users UserInfo{0:Drew:13} running UserInfo{10:Work profile:30} running
Bu durumda, birincil kullanıcı("Drew"), kullanıcı kimliği 0 ve iş profilinin kullanıcı kimliği 10'dur. İş profilinde bir uygulama çalıştırmak için şöyle bir komut kullanmanız gerekir:
$ adb shell am start --user 10 \ -n "com.example.myapp/com.example.myapp.testactivity" \ -a android.intent.action.MAIN -c android.intent.category.LAUNCHER