Ağ iletişimi ve telefon

Bu kılavuzdaki özellikler ağ ve telefon yönetimini açıklar cihaz politikanızda uygulayabileceğiniz özellikler denetleyici (DPC) uygulaması olabilir. Bu dokümanda kod var test etmek için kullanabilirsiniz. Test DPC uygulamasını Android'in kurumsal özellikleri için örnek kod kaynağı.

Bir DPC uygulaması kişisel cihazlarda veya cihaz sahibinde profil sahibi modunda çalışabilir modunda kullanabilirsiniz. Bu tabloda, hangi özelliklerin DPC, profil sahibi modunda veya cihaz sahibi modunda çalıştığında kullanılabilir mod:

Özellik Profil sahibi Cihaz sahibi
İş kişilerine erişim farklı profillerde
iş trafiği için güvenli ağ bağlantısı
Bir tüm bölgelerde tek bir kablosuz ağ kimliği
Bir iş profili için ayrı bir numara çevirici

Farklı profillerde iş kişilerine 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 uzak dizin araması. Kişisel cihazlarda, kişisel modda tek bir numara çevirici profili, iş aramalarının yanı sıra kişisel aramalar yapıp gelen aramaları yanıtlayabilir. Ayrıca, İşle ilgili iletişim bilgileri sistem arayüzüne iyi bir şekilde entegre edilmiştir. İş profili şifrelenmişse verileri kişisel profilde kullanılamaz.

Sistem kullanıcı arayüzüyle entegre

Sistem kullanıcı arayüzü, gelen iş aramalarını evrak çantası simgesiyle gösterir. İlgili içeriği oluşturmak için kullanılan callLog ayrıca şunları da gösterir: simgesi (gelen ve giden iş aramalarını belirtmek için) Kişisel numara çevirici ve kişi uygulamaları uzaktan kumanda kullanarak bir iş kişisinin arayan kimliği bilgilerini görüntüleyebilir Böylece, kişinin Google Hesabı’nda senkronize edilmiş olması gerekmez. yerel cihaz. Mesajlaşma uygulaması yerel arayan kimliği ve arama yapabilir.

Android Uyumluluğu Tanımı Doküman (CDD) şartları içeriyor varsayılan numara çeviricide görüntülenmesini sağlayan iş kişilerine ve Kişiler ve mesajlaşma uygulamaları, işten geldiklerini belirtmek için rozetle işaretlenmiştir seçin.

İş kişileri erişilebilir ve aranabilir

Kullanıcı, kişisel profilinden iş kişilerine erişebilir ve bu kişileri arayabilir. Bu bilgiler, numara çevirici uygulamasının arama ekranında görüntülenir. Kullanıcı iş araması yapabilir otomatik tamamlama kullanan, cihazla yerel olarak senkronize edilen ve uzaktan dizin araması yapabilirsiniz.

Birincil profilde iş kişilerini kontrol etme

İş kişilerinde arama yapma izni DPC tarafından kontrol edilir. Profil sahibinde çalışıyor modunda, DPC iş kişilerinin kişisel profildeki görünürlüğünü yönetir. Daha fazla bilgi için Cihaz politikası oluşturma bölümüne bakın denetleyici aracılığıyla kontrol edebilirsiniz.

İş kişilerini kişisel profile göre arama özelliği varsayılan olarak etkindir.

İş trafiği için güvenli bir ağ bağlantısı sağlama

Cihaz sahibi modunda veya profil sahibi modunda çalışan bir cihaz politikası her zaman açık Sanal Özel Ağ (VPN) bağlantısını kullanarak uygulamaları, trafiği belirli bir VPN uygulamasından geçirmeye zorlamak için atlandı. DPC, her zaman açık VPN bağlantısı kullanarak ağın Bir iş profilinden veya yönetilen cihazdan gelen trafiğin bir VPN hizmetinden geçtiği ve en iyi uygulamaları paylaşacağız. Bu işlem güvenli bir ağ bağlantısı oluşturur. bir hiyerarşiye sokan bir araçtır.

Her zaman açık VPN bağlantıları hakkında

Sistem çerçevesinin bir parçası olarak, VPN yönlendirmesi otomatik olarak yönetilir. Kullanıcı VPN hizmetini atlayamaz. Uygulama açıkken VPN hizmetinin bağlantısı kesilirse tam kilitleme modunda ise trafik açık internete sızdıramaz. Uygulamalar için uygulamak VpnService, Her zaman açık VPN, VPN bağlantısının güvenli bir şekilde yönetilmesi için bir çerçeve sunar. ayakta tutmak için iyi bir fırsattır. VPN hizmeti, otomatik olarak yeniden başlatılacak güncellemeler arasında bağlantı kurun. Bağlantı, kablosuz ağ veya Hücresel'i tıklayın. Cihaz yeniden başlatılırsa çerçeve, VPN bağlantısını yeniden başlatır.

VPN hizmetine giden bağlantı, kullanıcı açısından şeffaftır. Örneğin, bir izin iletişim kutusunu onaylamak için kullanıcının VPN her zaman açık modda. Kullanıcının VPN ağ ayarları, her zaman açık bağlantıyı manuel olarak devre dışı bırakabilirsiniz.

Eğer DISALLOW_CONFIG_VPN ise true ise kullanıcının VPN'yi yapılandırması engellendi. Etkinleştir DISALLOW_DEBUGGING_FEATURES. kullanıcıların adb hata ayıklama komutunu kullanarak her zaman açık VPN'yi geçersiz kılmasını kısıtlamanızı sağlar. Kullanıcının VPN'yi kaldırmasını engellemek için şu numarayı arayın: DevicePolicyManager.setUninstallBlocked

VPN hizmetini ayarlama

Android için kurumsal çözümünüzü kullanan kuruluş, VPN'yi ayarlar.

  1. Aşağıdakileri uygulayan bir VPN uygulaması yükleyin: VpnService Şununla eşleşen bir intent filtresi kullanarak etkin VPN hizmetlerini bulabilirsiniz: işlem VpnService.SERVICE_INTERFACE
  2. Tanımlayın VpnService. izni tarafından korunan uygulama manifest dosyasında BIND_VPN_SERVICE.
  3. Şunu yapılandır: VpnService. sistem tarafından başlatılıyor. VPN uygulamasını kendi kendine başlayacak şekilde ayarlamaktan kaçının çalışmasını dinleme ve kendi yaşam döngüsünü kontrol etme şeklinde özetlenebilir.
  4. Yönetilen yapılandırma VPN uygulaması (aşağıdaki örneğe bakın).

Her zaman açık VPN bağlantısını etkinleştir

DPC, belirli bir uygulama üzerinden her zaman açık VPN bağlantısını yapılandırabilir. arama DevicePolicyManager.setAlwaysOnVpnPackage()

Bu bağlantı otomatik olarak verilir ve yeniden başlatma sonrasında da devam eder. Eğer lockdownEnabled yanlıştır. Ağ trafiği şu andan itibaren güvenli olmayabilir: telefonunuzu yeniden başlatır ve VPN bağlanır. Sürekli iyileştirme yapmak istemiyorsanız VPN başarısız olduğunda veya VPN gerekli değilse ağ bağlantısını kullanmaya devam edebilir.

Her zaman açık VPN bağlantısını doğrulama

DPC, her zaman açık VPN'yi yöneten paketin adını okuyabilir geçerli kullanıcı için DevicePolicyManager.getAlwaysOnVpnPackage()..

Böyle bir paket yoksa veya VPN, sistem Ayarları'nda oluşturulmuşsa null döndürüldü.

Ö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:

  • Yönetilen yapılandırmanın VPN hizmeti DevicePolicyManager CANNOT TRANSLATE setApplicationRestrictions() yöntemidir.
  • Yönetilen yapılandırmalarda rastgele anahtar/değer çiftleri ve bu örnek uygulama kullanılır VPN'nin ağ ayarlarını yapılandırmak için başka bir yerde kullanır (bkz. Yönetilen Yapılandırmaları Kontrol Edin).
  • Örnekte, Android paket yükleyici bir ret listesine eklenir. Böylece yükleyicinin VPN üzerinden sistem paketlerini güncelleme. Kullanıcının tüm ağ trafiği iş profili veya cihaz, paket hariç bu VPN uygulamasından geçer yükleyici; açık interneti kullanıyor.
  • Ardından DevicePolicyManager, Şunu kullanan VPN paketi: setAlwaysOnVpnPackage(), ve tam kilitleme modunu etkinleştirin.

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 oluşturun

Cihaz sahibi modunda veya profil sahibi modunda çalışan bir cihaz politikası denetleyici (DPC) birden fazla sertifika yetkilisi (CA) sertifikasını ilişkilendirebilir tek bir kablosuz ağ yapılandırmasıyla kullanabilirsiniz. Bu yapılandırmada bir cihaz aynı ağ adına sahip kablosuz erişim noktalarına bağlanabiliyor veya hizmet seti tanımlayıcısı (SSID) kullanılmasına rağmen farklı CA ile yapılandırılmıştır ekleyebilirsiniz. Bu özellik, kuruluşunuzun kablosuz ağları birden fazla coğrafi bölgede bulunuyor ve her bölge için farklı bir sertifika yetkilisizdir. Örneğin, yasal imzalar için yetkili bir kurum yetkilisiz.

Not: Android tarafından desteklenenler setCaCertificate API 18'den (Jelly Bean) itibaren kullanılabilir, ancak BT yöneticilerinin ağlarını için her sertifika yetkilisiyle ayrı ayrı bağlanarak erişim noktalarından yararlanabilmeniz gerekir.

Sunucuyu tanımlamak için CA sertifikalarını belirtin

Sunucuyu tanımlayan X.509 sertifikalarının listesini belirtmek için SSID, WifiEnterpriseConfig.setCaCertificates() kullanarak kablosuz yapılandırmadaki ilgili tüm CA'ları ekleyin.

Sertifikanın CA'sı, belirtilen sertifikalarla eşleşirse sunucunun sertifikası geçerlidir. Varsayılan adlar sertifikalara otomatik olarak atanır ve yapılandırma. İlgili içeriği oluşturmak için kullanılan WifiManager. Sertifikayı yükler ve ağ etkinleştirildiğinde ve yapılandırma devre dışı bırakıldığında sertifikayı kaldırır. silindi.

Kablosuz yapılandırmayla ilişkili tüm CA sertifikalarını almak için Aşağıdakileri içeren listeyi döndürmek için WifiEnterpriseConfig.getCaCertificates() X509Certificate nesne.

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 ilişkin bir örnek için HTTPS ve SSL ile güvenlik başlıklı makaleye bakın.
  2. Yeni oluştur WifiConfiguration. SSID ve anahtar yönetimini ayarlayın.
  3. Ayarlayın: WifiEnterpriseConfig. örneği hakkında daha fazla bilgi edinin.WifiConfiguration
    1. Sunucuyu X509Certificate. nesneleri setCaCertificates().
    2. İstemci kimlik bilgilerini, kimliğini ve şifresini belirleyin.
    3. Genişletilebilir Kimlik Doğrulama Protokolü (EAP) ve Aşama 2 yöntemini şu şekilde ayarlayın: bağlantı kurmanın bir bölümüdür.
  4. Ağı WifiManager
  5. Ağı etkinleştirin. WifiManager, yapılandırma sırasında kurulumu.

Şu örnek bu adımları birbirine bağlar:

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 ConnectionService. Çağrı yapan arka uç için API. Bu, aynı entegre sistem kullanıcı arayüzü çevirisini sağlar. iş profilinde VoIP uygulamalarına dair deneyim kazanarak bir temel özelliğe sahiptir. İş görüşmesi hesaplarına gelen aramalar gelen aramalardan kişisel arama hesaplarına göre ayrılır.

Kullanıcı izin verilenler listesindeki iş çeviricisini kullanarak arama yapmayı ve almayı tercih edebilir. oturum açın. O numara çeviriciden yapılan veya işe gelen tüm aramalar iş profilinin hesabına kaydedilir. CallLog. sağlar. İş numara çevirici, yalnızca iş iletişim bilgileri. Gelen devre geçişi çağrıları birincil numara çevirici tarafından işlenir ve kişisel bir çağrı kaydında saklanır. İş profili silinirse çağrı kaydı o iş profiliyle ilişkilendirilmiş ve tüm iş profiliyle ilişkilendirilmiş veriler de silinir. dışı verilerdir.

Üçüncü taraf uygulamaları, ConnectionService'i uygulamalıdır

Telefon araması yapması ve bu aramaları yapması gereken üçüncü taraf VoIP uygulamaları yerleşik telefon uygulamasına entegre ederek ConnectionService. API'ye gidin. Bu, iş görüşmesinde kullanılan tüm VoIP hizmetleri için gereklidir. Bu uygulamalar aramaları geleneksel cep telefonu aramaları gibi ele alınarak dahili numara çeviricide ve arama kaydında görünürler. Öğe uygulama ConnectionService. iş profilinde yüklüyse, yalnızca çevirici tarafından erişilebilir ve iş profilinde yüklü olmalıdır.

Geliştirici, uygulamayı ConnectionService, bunu uygulamanın manifest dosyasına eklemeli ve PhoneAccount şununla: TelecomManager. Telefon hesabı, telefon araması yapmak veya almak için farklı bir yöntemi temsil eder. Ayrıca her biri için birden fazla PhoneAccounts olabilir ConnectionService. Telefon hesabı kaydedildikten sonra kullanıcı numara çevirici ayarlarından etkinleştirebilir.

Sistem kullanıcı arayüzü entegrasyonu ve bildirimler

Sistem kullanıcı arayüzü, kullanıcılara tutarlı ve entegre bir arama deneyimi sunar. kullanan üçüncü taraf uygulamaları için ConnectionService. Çağrı yapmak için arka uç olarak API. Uygulamayı bir iş profilinde kullanıyorsanız evrak çantası simgesi, gelen aramalarda ve durum çubuğunda görüntülenir. Bir projenin İş profilinde yüklü olan ConnectionService, veya iş için ayrı bir numara çevirici oluşturabilirsiniz. Bunlar tek bir uygulama veya ayrı uygulamalar.

Çevirici uygulama, bir çağrının bayrağı kontrol ediyor android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL Çağrı bir iş çağrısıysa, çevirici bir iş rozeti (evrak çantası simgesi):

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
}