Ağ iletişimi ve telefon

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.

İş 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.

  1. 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.
  2. Uygulamanın manifest dosyasında, izinle korunan bir VpnService beyan edin (BIND_VPN_SERVICE).
  3. 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.
  4. 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ılarak DevicePolicyManager 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

  1. Sunucunun kimliğini doğrulayın:
    1. X.509 CA sertifikalarını yükleyin.
    2. İ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.
  2. Yeni bir WifiConfiguration oluşturup SSID'sini ve anahtar yönetimini ayarlayın.
  3. WifiEnterpriseConfig örneğini bu WifiConfiguration üzerinde oluşturun.
    1. setCaCertificates() kullanarak sunucuyu X509Certificate nesnelerinin bir listesiyle tanımlayın.
    2. İstemci kimlik bilgilerini, kimliğini ve şifresini ayarlayın.
    3. Bağlantının bir parçası olarak Genişletilebilir Kimlik Doğrulama Protokolü (EAP) ve 2. Aşama yöntemini ayarlayın.
  4. WifiManager ile ağı ekleyin.
  5. 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
}