Bu kılavuzdaki özelliklerde, cihaz politikası denetleyici (DPC) uygulamanızda kullanabileceğiniz ağ iletişimi ve telefon yönetimi yetenekleri açıklanmaktadır. Bu dokümanda kod örnekleri bulunmaktadır. Ayrıca, Android'in kurumsal özellikleri için örnek kod kaynağı olarak DPC'yi test et uygulamasını da kullanabilirsiniz.
Bir DPC uygulaması, kişisel cihazlarda profil sahibi modunda veya tümüyle yönetilen cihazlarda cihaz sahibi modunda çalışabilir. Bu tabloda, DPC profil sahibi modunda veya cihaz sahibi modunda çalıştırıldığında hangi özelliklerin kullanılabileceği gösterilir:
Özellik | Profil sahibi | Cihaz sahibi |
Farklı profillerde iş kişilerine erişme | ✓ | |
İş trafiği için güvenli bir ağ bağlantısı sağlama | ✓ | ✓ |
Bölgeler arasında tek bir kablosuz ağ kimliği oluşturma | ✓ | ✓ |
İş profili için ayrı bir numara çevirici belirtin | ✓ |
İş kişilerine farklı profillerde erişme
EMM'ler bir kullanıcının kişisel profilinin iş kişilerine erişmesine izin verebilir. Böylece, bir kullanıcının özel ve iş kişilerine yerel arama ve uzaktan dizin araması yoluyla erişilebilir. Kişisel cihazlarda, kişisel profildeki tek bir numara çevirici, kişisel telefon aramalarının yanı sıra iş amaçlı aramalar da yapabilir ve alabilir. Buna ek olarak, iş kişileri sistem kullanıcı arayüzüne iyi entegre edilmiştir. İş profili şifrelenmişse bu profildeki veriler, kişisel profil tarafından kullanılamaz.
Sistem kullanıcı arayüzü ile entegre
Sistem kullanıcı arayüzünde, gelen iş çağrıları evrak çantası simgesiyle gösteriliyor. callLog
, gelen ve giden iş çağrılarını belirtmek için de bir simge gösterir. Kişisel numara çevirici ve kişi uygulamaları, uzak dizin araması kullanarak bir iş kişisinin arayan kimliği bilgilerini görüntüleyebilir. Bu nedenle, kişinin yerel cihazla senkronize edilmiş olması gerekmez. Mesajlaşma uygulaması, yerel arayan kimliği ve arama yapabilir.
Android Uyumluluk Tanımı Belgesi (CDD), iş kişilerinin varsayılan numara çeviricide görüntülenmesi için gereksinimlerin yanı sıra kişilerin ve mesajlaşma uygulamalarının iş profilinden olduklarını belirten rozetlerle gösterilmesini sağlar.
İş kişileri erişilebilir ve aranabilir
Kullanıcı, çevirici uygulamasının arama ekranında görüntülenen kişisel profilinden iş kişilerine erişebilir ve bu kişileri arayabilir. Kullanıcı, otomatik tamamlama özelliğini kullanarak cihazla yerel olarak senkronize edilen ve uzak dizin aramasında listelenen iş kişilerini arayabilir.
Birincil profilde iş kişilerini kontrol edin
DPC, iş kişilerinde arama yapma iznini kontrol eder. Profil sahibi modunda çalışan DPC, kişisel profildeki iş kişilerinin görünürlüğünü yönetir. Daha fazla bilgi için Cihaz politikası denetleyici oluşturma başlıklı makaleye bakın.
Kişisel profille iş kişilerini arama özelliği varsayılan olarak etkindir.
Politikanın nasıl ayarlandığını görmek için
DevicePolicyManager.getCrossProfileContactsSearchDisabled()
politikasını kullanın.İş kişilerinde kişisel profile göre arama yapma özelliğini etkinleştirmek veya devre dışı bırakmak için
DevicePolicyManager.setCrossProfileContactsSearchDisabled()
işlevini kullanın.
İş trafiği için güvenli bir ağ bağlantısı sağlayın
Cihaz sahibi modunda veya profil sahibi modunda çalışan cihaz politikası denetleyicisi, her zaman açık olan bir Sanal Özel Ağ (VPN) bağlantısı kullanarak uygulamaların trafiği atlanamayan belirli bir VPN uygulamasından geçmesini zorunlu kılabilir. DPC, her zaman açık VPN bağlantısı kullanarak bir iş profilinden veya yönetilen cihazdan gelen ağ trafiğinin kullanıcı müdahalesi olmadan bir VPN hizmetinden geçmesini sağlayabilir. Bu işlem, bir iş profili içindeki sürekli trafik için güvenli bir ağ bağlantısı oluşturur.
Her zaman açık VPN bağlantıları hakkında
Sistem çerçevesinin bir parçası olarak, VPN yönlendirmesi otomatik olarak yönetilir. Böylece kullanıcı, VPN hizmetini atlayamaz. Tam kilitleme modundayken VPN hizmetinin bağlantısı kesilirse trafik açık internete sızamaz. VpnService
özelliğini uygulayan uygulamalar için her zaman açık VPN, güvenilir bir sunucu üzerinden güvenli bir VPN bağlantısını yönetmek ve bağlantıyı sürdürmek için bir çerçeve sağlar. VPN hizmeti, bağlantının kablosuz veya hücresel ağ üzerinden olmasına bakılmaksızın uygulama güncellemelerinde bağlantıyı otomatik olarak yeniden başlatır. Cihaz yeniden başlatılırsa çerçeve de VPN bağlantısını yeniden başlatır.
VPN hizmeti bağlantısı kullanıcı için şeffaftır. Şirkete ait cihazlarda kullanıcının her zaman açık moddaki VPN için rıza iletişim kutusunu onaylaması gerekmez. Kullanıcının VPN ağ ayarları, her zaman açık bağlantının manuel olarak etkinleştirilmesine olanak tanır.
DISALLOW_CONFIG_VPN
değeri true
ise kullanıcının VPN'i yapılandırması engellenir. Kullanıcıların her zaman açık VPN'yi geçersiz kılmasını adb hata ayıklama komutunu kullanarak kısıtlamak için DISALLOW_DEBUGGING_FEATURES
özelliğini etkinleştirin.
Kullanıcıların VPN'yi kaldırmasını önlemek için DevicePolicyManager.setUninstallBlocked
numaralı telefonu arayın.
VPN hizmetini kurma
VPN, Android için kurumsal çözümünüzü kullanan kuruluş tarafından ayarlanır.
VpnService
özelliğini kullanan bir VPN uygulaması yükleyin. Etkin VPN hizmetlerini,VpnService.SERVICE_INTERFACE
işlemiyle eşleşen bir amaç filtresi kullanarak bulabilirsiniz.- Uygulamanın manifest dosyasında, izinle korunan bir
VpnService
beyan edin (BIND_VPN_SERVICE
). VpnService
öğesini sistem tarafından başlatılacak şekilde yapılandırın. VPN uygulamasını, sistem başlangıcını dinleyerek ve kendi yaşam döngüsünü kontrol ederek kendiliğinden başlatılacak şekilde ayarlamaktan kaçının.- VPN uygulaması için yönetilen yapılandırmaları ayarlayın (aşağıdaki örneğe bakın).
Her zaman açık VPN bağlantısını etkinleştirme
DPC, DevicePolicyManager.setAlwaysOnVpnPackage()
çağrısı yaparak belirli bir uygulama üzerinden her zaman açık VPN bağlantısı yapılandırabilir.
Bu bağlantı otomatik olarak verilir ve yeniden başlatma sonrasında da devam eder. lockdownEnabled
değeri Yanlış değerine ayarlanırsa telefonun yeniden başlatıldığı ve VPN bağlandığı andan itibaren ağ trafiğinin güvenliği sağlanamayabilir. VPN başarısız olduğunda ağ bağlantısını durdurmak istemiyorsanız veya VPN gerekli değilse bu yararlı bir özelliktir.
Her zaman açık VPN bağlantısını doğrulayın
DPC, DevicePolicyManager.getAlwaysOnVpnPackage().
ile mevcut kullanıcı için her zaman açık VPN bağlantısını yöneten paketin adını okuyabilir
Böyle bir paket yoksa veya VPN sistemin Ayarlar uygulamasında oluşturulmuşsa null
döndürülür.
Örnek
AlwaysOnVpnFragment.java
, TestDPC uygulamasında her zaman açık VPN bağlantısı ayarını etkinleştirmek için bu API'leri kullanır.
Aşağıdaki örnekte:
- VPN hizmetinin yönetilen yapılandırmaları,
setApplicationRestrictions()
yöntemi kullanılarakDevicePolicyManager
tarafından ayarlanır. - Yönetilen yapılandırmalar rastgele anahtar/değer çiftleri kullanır. Bu örnek uygulama, VPN'nin ağ ayarlarını yapılandırmak için bunları başka bir yerde kullanır (Yönetilen Yapılandırmaları Kontrol Etme bölümüne bakın).
- Örnek, sistem paketlerini VPN üzerinden güncellememesi için Android paket yükleyiciyi bir ret listesine ekler. Kullanıcının iş profilindeki veya cihazdaki tüm ağ trafiği, paket yükleyici hariç bu VPN uygulamasından geçer. Uygulamanın güncellemeleri açık interneti kullanır.
- Daha sonra
DevicePolicyManager
,setAlwaysOnVpnPackage()
kullanarak ve tam kilitleme modunu etkinleştirerek VPN paketi için her zaman açık VPN bağlantısını etkinleştirir.
Kotlin
// Set VPN's managed configurations val config = Bundle().apply { putString(Extras.VpnApp.ADDRESS, "192.0.2.0") putString(Extras.VpnApp.IDENTITY, "vpn.account1") putString(Extras.VpnApp.CERTIFICATE, "keystore://auth_certificate") putStringArray(Extras.VpnApp.DENYLIST, arrayOf("com.android.packageinstaller")) } val dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager val admin = myDeviceAdminReceiver.getComponentName(this) // Name of package to update managed configurations val vpnPackageName = "com.example.vpnservice" // Associate managed configurations with DeviceAdminReceiver dpm.setApplicationRestrictions(admin, vpnPackageName, config) // Enable always-on VPN connection through VPN package try { val lockdownEnabled = true dpm.setAlwaysOnVpnPackage(admin, vpnPackageName, lockdownEnabled) } catch (ex: Exception) { throw PolicyException() }
Java
// Set VPN's managed configurations final Bundle config = new Bundle(); config.putString(Extras.VpnApp.ADDRESS, "192.0.2.0"); config.putString(Extras.VpnApp.IDENTITY, "vpn.account1"); config.putString(Extras.VpnApp.CERTIFICATE, "keystore://auth_certificate"); config.putStringArray(Extras.VpnApp.DENYLIST, new String[]{"com.android.packageinstaller"}); DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName admin = myDeviceAdminReceiver.getComponentName(this); // Name of package to update managed configurations final String vpnPackageName = "com.example.vpnservice"; // Associate managed configurations with DeviceAdminReceiver dpm.setApplicationRestrictions(admin, vpnPackageName, config); // Enable always-on VPN connection through VPN package try { boolean lockdownEnabled = true; dpm.setAlwaysOnVpnPackage(admin, vpnPackageName, lockdownEnabled)); } catch (Exception ex) { throw new PolicyException(...); }
Bölgeler arasında tek bir kablosuz ağ kimliği kurun
Cihaz sahibi modunda veya profil sahibi modunda çalışan bir cihaz politikası denetleyici (DPC), birden fazla sertifika yetkilisi (CA) sertifikasını tek bir kablosuz ağ yapılandırmasıyla ilişkilendirebilir. Bu yapılandırmayla bir cihaz, aynı ağ adına veya hizmet kümesi tanımlayıcısına (SSID) sahip ancak farklı CA sertifikalarıyla yapılandırılmış kablosuz erişim noktalarına bağlanabilir. Kuruluşunuzun kablosuz ağları birden fazla coğrafi bölgede bulunuyorsa ve her bölge farklı bir sertifika yetkilisine ihtiyaç duyuyorsa bu seçenek yararlıdır. Örneğin, yasal imzalar için bölgesel bir CA'ya ihtiyaç duyan yerel bir yetkili gerekebilir.
Not: Android,
setCaCertificate
API 18'den (Jelly Bean) itibaren desteklemiştir, ancak BT yöneticileri,
bölgelerinden bağımsız olarak cihazların her erişim noktasında sorunsuz bir kimlik doğrulaması yapmasını sağlamak için
ağlarının temel hazırlığını her CA ile ayrı olarak yapmalıdır.
Sunucuyu tanımlamak için CA sertifikalarını belirtin
Aynı SSID'yi kullanan sunucuyu tanımlayan X.509 sertifikalarının listesini belirtmek için WifiEnterpriseConfig.setCaCertificates()
kullanarak kablosuz yapılandırmaya tüm ilgili CA'ları ekleyin.
CA'sı verilen sertifikalardan biriyle eşleşen sunucunun sertifikası geçerlidir.
Varsayılan adlar sertifikalara otomatik olarak atanır ve yapılandırma dahilinde kullanılır. WifiManager
, sertifikayı yükler, ağ etkinleştirildiğinde yapılandırmayı otomatik olarak kaydeder ve yapılandırma silindiğinde sertifikayı kaldırır.
Kablosuz yapılandırmayla ilişkili tüm CA sertifikalarını almak için WifiEnterpriseConfig.getCaCertificates()
kullanarak X509Certificate
nesnelerinin listesini döndürün.
Birden çok CA sertifikası kullanarak kablosuz yapılandırma ekleme
- Sunucunun kimliğini doğrulayın:
- X.509 CA sertifikalarını yükleyin.
- İstemcinin özel anahtarını ve sertifikasını yükleyin. Sertifika dosyasının nasıl okunacağına dair bir örnek için HTTPS ve SSL ile güvenlik sayfasına bakın.
- Yeni bir
WifiConfiguration
oluşturup SSID'sini ve anahtar yönetimini ayarlayın. WifiEnterpriseConfig
örneğini buWifiConfiguration
üzerinde oluşturun.setCaCertificates()
kullanarak sunucuyuX509Certificate
nesnelerinin bir listesiyle tanımlayın.- İstemci kimlik bilgilerini, kimliğini ve şifresini ayarlayın.
- Bağlantının bir parçası olarak Genişletilebilir Kimlik Doğrulama Protokolü (EAP) ve 2. Aşama yöntemini ayarlayın.
WifiManager
ile ağı ekleyin.- Ağı etkinleştirin. WifiManager, kurulum sırasında yapılandırmayı otomatik olarak kaydeder.
Bu örnek, adımları birbirine bağlamaktadır:
Kotlin
// Verify the server's identity val caCert0 = getCaCert("cert0.crt") val caCert1 = getCaCert("cert1.crt") val clientKey = getClientKey() val clientCert = getClientCert() // Create Wi-Fi configuration val wifiConfig = WifiConfiguration().apply { SSID = "mynetwork" allowedKeyManagement.set(KeyMgmt.WPA_EAP) allowedKeyManagement.set(KeyMgmt.IEEE8021X) // Set up Wi-Fi enterprise configuration enterpriseConfig.setCaCertificates(arrayOf<X509Certificate>(caCert0, caCert1)) enterpriseConfig.setClientKeyEntry(clientKey, clientCert) enterpriseConfig.setIdentity("myusername") enterpriseConfig.setEapMethod(Eap.TLS) enterpriseConfig.setPhase2Method(Phase2.NONE) } // Add network val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager val netId = wifiManager.addNetwork(wifiConfig) // Enable network if (netId < 0) { // Error creating new network } else { wifiManager.enableNetwork(netId, true) }
Java
// Verify the server's identity X509Certificate caCert0 = getCaCert("cert0.crt"); X509Certificate caCert1 = getCaCert("cert1.crt"); PrivateKey clientKey = getClientKey(); X509Certificate clientCert = getClientCert(); // Create Wi-Fi configuration WifiConfiguration wifiConfig = new WifiConfiguration(); wifiConfig.SSID = "mynetwork"; wifiConfig.allowedKeyManagement.set(KeyMgmt.WPA_EAP); wifiConfig.allowedKeyManagement.set(KeyMgmt.IEEE8021X); // Set up Wi-Fi enterprise configuration wifiConfig.enterpriseConfig.setCaCertificates(new X509Certificate[] {caCert0, caCert1}); wifiConfig.enterpriseConfig.setClientKeyEntry(clientKey, clientCert); wifiConfig.enterpriseConfig.setIdentity("myusername"); wifiConfig.enterpriseConfig.setEapMethod(Eap.TLS); wifiConfig.enterpriseConfig.setPhase2Method(Phase2.NONE); // Add network WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); int netId = wifiManager.addNetwork(wifiConfig); // Enable network if (netId < 0) { // Error creating new network } else { wifiManager.enableNetwork(netId, true); }
İş profili için ayrı bir numara çevirici belirtin
İş profilinde kullanılacak ayrı bir numara çevirici uygulamasını izin verilenler listesine ekleyebilirsiniz.
Bu, numara çeviricinin kendisi veya çağrı arka ucu için ConnectionService
API'yi uygulayan bir IP üzerinden ses (VoIP) uygulaması olabilir. Bu, iş profilindeki VoIP uygulamalarına yönelik entegre sistem kullanıcı arayüzü arama deneyiminin aynısını sağlar ve iş arama aracını etkin bir şekilde temel bir özellik haline getirir. İş arama hesaplarına gelen aramalar, kişisel arama hesaplarına gelen aramalardan farklıdır.
Kullanıcı, bir telefon hesabında izin verilenler listesindeki iş çeviricisinden arama yapıp gelen aramaları yanıtlamayı seçebilir. Bu numara çeviriciden yapılan veya iş telefonu hesabına gelen tüm çağrılar, iş profilinin CallLog
sağlayıcısına kaydedilir. İş için numara çevirici, yalnızca iş kişilerine erişim sağlayan, yalnızca iş amaçlı bir arama kaydı tutar. Gelen devre anahtarı çağrıları, birincil numara çevirici tarafından işlenir ve kişisel bir çağrı kaydında saklanır. Bir iş profili silinirse iş profiliyle ilişkilendirilmiş arama kaydı ve tüm iş profili verileri de silinir.
Üçüncü taraf uygulamaları, ConnectionService'i kullanmalıdır
Telefon aramaları yapması gereken ve bu çağrıları yerleşik telefon uygulamasına entegre etmesi gereken üçüncü taraf VoIP uygulamaları ConnectionService
API'sini uygulayabilir. Bu, iş çağrısında kullanılan tüm VoIP hizmetleri için gereklidir. Bu uygulamalar, çağrılarının geleneksel hücresel aramalar gibi ele alınmasını sağlayarak fayda sağlar. Örneğin, yerleşik sistem numara çeviricide ve çağrı kaydında görünürler. ConnectionService
uygulamasını uygulayan uygulama iş profiline
yüklüyse uygulamaya, bu iş profilinde de yüklü olan bir numara çevirici
tarafından erişilebilir.
Geliştiricinin ConnectionService
uygulamasından sonra bunu, uygulamanın manifest dosyasına eklemesi ve TelecomManager
ile bir PhoneAccount
kaydetmesi gerekir.
Telefon hesabı, telefon araması yapmak veya almak için farklı bir yöntemi temsil eder ve her ConnectionService
için birden fazla PhoneAccounts
olabilir. Telefon hesabı kaydedildikten sonra kullanıcı, telefon numarasını numara çevirici ayarlarından etkinleştirebilir.
Sistem kullanıcı arayüzü entegrasyonu ve bildirimleri
Sistem kullanıcı arayüzü, kullanıcılara ConnectionService
API'yi arama yapmak için arka uç olarak kullanan üçüncü taraf uygulamaları için tutarlı ve entegre bir arama deneyimi sunar. Uygulamayı bir iş profilinde kullanıyorsanız gelen
aramalarda ve durum çubuğunda evrak çantası simgesi görüntülenir. İş profilinde yüklü olan ConnectionService
işlevini uygulayan bir uygulama, sistem numara çeviriciyi kullanabilir veya ayrı bir iş çevirici oluşturabilir. Bunlar tek bir uygulama veya
ayrı uygulamalar olabilir.
Çevirici uygulaması, bir iş çağrısı yapıp yapmadığını veya alıp almadığını, işareti kontrol ederek belirler
android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL
.
Arama bir iş çağrısıysa çevirici, bir iş rozeti (evrak çantası simgesi) ekleyerek kullanıcıya bunu bildirir:
Kotlin
// Call placed through a work phone account. getCurrentCall() is defined by the // dialer. val call = getCurrentCall() if (call.hasProperty(android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL)) { // Set briefcase icon }
Java
// Call placed through a work phone account. getCurrentCall() is defined by the // dialer. Call call = getCurrentCall(); if (call.hasProperty(android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL)) { // Set briefcase icon }