الاتصال الهاتفي والاتصال الهاتفي

تصف الميزات الواردة في هذا الدليل إمكانات إدارة الشبكات والاتصالات التي يمكنك تنفيذها في تطبيق وحدة التحكّم بسياسة الجهاز (DPC). يحتوي هذا المستند على نماذج للرموز ويمكنك أيضًا استخدام تطبيق اختبار وحدة التحكّم بسياسة الجهاز (DPC) كمصدر نموذج لرموز برمجية لميزات المؤسسة من Android.

يمكن تشغيل تطبيق وحدة التحكّم بسياسة الجهاز (DPC) في وضع مالك الملف الشخصي على الأجهزة الشخصية أو في وضع مالك الجهاز على الأجهزة المُدارة بالكامل. يشير هذا الجدول إلى الميزات المتاحة عند تشغيل وحدة التحكّم بسياسة الجهاز في وضع مالك الملف الشخصي أو وضع مالك الجهاز:

الميزة مالك الملف الشخصي مالك الجهاز
الوصول إلى جهات اتصال العمل على جميع الملفات
ضمان اتصال شبكة آمن لحركة مرور العمل
إعداد معرّف شبكة لاسلكية واحد في جميع المناطق
تحديد برنامج اتصال منفصل للملف الشخصي للعمل

الوصول إلى جهات اتصال العمل على جميع الملفات الشخصية

يمكن أن تسمح إدارة الخدمات الجوّالة للمؤسسات (EMM) للملف الشخصي للمستخدم بالوصول إلى جهات اتصال العمل لكي يتسنى الوصول إلى جهات الاتصال الشخصية وجهات اتصال العمل من خلال البحث المحلي والبحث عن الدليل عن بُعد. على الأجهزة الشخصية، يمكن لمتصل واحد في الملف الشخصي إجراء المكالمات الشخصية وتلقيها، بالإضافة إلى مكالمات العمل. بالإضافة إلى ذلك، يتم دمج جهات اتصال العمل بشكل جيد في واجهة مستخدم النظام. إذا كان الملف الشخصي للعمل مشفّرًا، لن تكون بياناته متاحة للملف الشخصي.

متكامل مع واجهة مستخدم النظام

تشير واجهة مستخدم النظام إلى مكالمات العمل الواردة باستخدام رمز حقيبة أوراق. يعرض callLog أيضًا الرمز لتخصيص مكالمات العمل الواردة والصادرة. يمكن لتطبيق الاتصال الشخصي وتطبيق جهات الاتصال عرض معلومات معرف المتصل لجهة اتصال العمل باستخدام بحث دليل عن بُعد، لذلك ليس مطلوبًا أن تتم مزامنة جهة الاتصال بالفعل على الجهاز المحلي. يمكن لتطبيق المراسلة إجراء إظهار رقم المتّصل والبحث محليًا.

يتضمن مستند تعريف التوافق مع Android (CDD) متطلبات لعرض جهات اتصال العمل في برنامج الاتصال التلقائي والمتطلبات التي تتطلب وضع شارة لجهات الاتصال وتطبيقات المراسلة للإشارة إلى أنّها واردة من الملف الشخصي للعمل.

جهات اتصال العمل قابلة للوصول إليها والبحث فيها

يمكن للمستخدم الوصول إلى جهات اتصال العمل والاتصال بها من ملفه الشخصي، والذي يظهر في شاشة البحث في تطبيق برنامج الاتصال. ويمكن للمستخدم البحث عن جهات اتصال العمل - باستخدام الإكمال التلقائي - التي تتم مزامنتها محليًا مع الجهاز، وإدراجها من خلال البحث عن الدليل البعيد.

التحكُّم في جهات اتصال العمل في الملف الشخصي الأساسي

وتتحكّم وحدة التحكّم بسياسة الجهاز في إذن البحث في جهات اتصال العمل. في وضع مالك الملف الشخصي، يدير وحدة التحكّم بسياسة الجهاز إمكانية رؤية جهات اتصال العمل في الملف الشخصي. لمزيد من المعلومات، راجع إنشاء وحدة تحكم في سياسة الجهاز.

يكون البحث في جهات اتصال العمل حسب الملف الشخصي مفعَّلاً تلقائيًا.

التأكُّد من توفُّر اتصال شبكة آمن لحركة مرور العمل

عند التشغيل في وضع مالك الجهاز أو وضع مالك الملف الشخصي، يمكن لوحدة التحكّم بسياسة الجهاز استخدام اتصال شبكة افتراضية خاصة (VPN) قيد التشغيل دائمًا لفرض مرور التطبيقات على حركة البيانات من خلال تطبيق شبكة افتراضية خاصة لا يمكن تجاوزه. باستخدام اتصال شبكة VPN قيد التشغيل دائمًا، يمكن لوحدة التحكّم بسياسة الجهاز أن تضمن مرور حركة بيانات الشبكة من ملف شخصي للعمل أو جهاز مُدار عبر خدمة شبكة VPN، وبدون تدخل المستخدم. تنشئ هذه العملية اتصالاً آمنًا بالشبكة لحركة المرور المستمرة داخل الملف الشخصي للعمل.

لمحة عن اتصالات الشبكة الافتراضية الخاصة (VPN) التي يتم تشغيلها دائمًا

كجزء من إطار عمل النظام، تتم إدارة توجيه شبكة VPN تلقائيًا حتى لا يمكن للمستخدم تجاوز خدمة الشبكة الافتراضية الخاصة. إذا كانت خدمة VPN غير متصلة أثناء استخدام وضع التأمين، فلن تسرب حركة البيانات إلى الإنترنت المفتوح. بالنسبة إلى التطبيقات التي تفعِّل VpnService، توفّر شبكة VPN التي تكون قيد التشغيل دائمًا إطارًا لإدارة الاتصال الآمن عبر شبكة VPN من خلال خادم موثوق به والحفاظ على مستوى أدائه. ستُعيد خدمة شبكة VPN الاتصال تلقائيًا عبر تحديثات التطبيقات، بغض النظر عما إذا كان الاتصال عبر شبكة Wi-Fi أو شبكة خلوية. وفي حال إعادة تشغيل الجهاز، سيُعيد إطار العمل الاتصال بشبكة VPN.

يكون الاتصال بخدمة VPN شفافًا للمستخدم. بالنسبة إلى الجهاز المملوك للشركة، لا يُطلب من المستخدم تأكيد مربّع إفادة الموافقة على استخدام شبكة VPN في وضع التشغيل الدائم. تسمح إعدادات الشبكة الافتراضية الخاصة للمستخدم بتفعيل الاتصال الدائم دائمًا يدويًا.

وإذا كانت قيمة DISALLOW_CONFIG_VPN هي true، سيتم منع المستخدم من ضبط شبكة VPN. تفعيل DISALLOW_DEBUGGING_FEATURES لمنع المستخدمين من تجاوز الشبكة الافتراضية الخاصة (VPN) التي يتم تشغيلها دائمًا باستخدام الأمر adb debug. لمنع أحد المستخدمين من إلغاء تثبيت شبكة VPN، يمكنك الاتصال بالرقم DevicePolicyManager.setUninstallBlocked.

إعداد خدمة VPN

أعدّت المؤسسة التي تستخدم حل المؤسسة لنظام Android شبكة VPN.

  1. تثبيت تطبيق شبكة افتراضية خاصة ينفّذ VpnService. يمكنك العثور على خدمات شبكة VPN النشطة باستخدام فلتر أهداف يتطابق مع الإجراء VpnService.SERVICE_INTERFACE.
  2. يُرجى توضيح ما يلي: VpnService في ملف بيان التطبيق الذي يحميه الإذن BIND_VPN_SERVICE.
  3. اضبط VpnService ليبدأ النظام. تجنَّب إعداد تطبيق شبكة VPN ليبدأ تلقائيًا من خلال الاستماع إلى تشغيل النظام والتحكم في دورة حياته.
  4. اضبط عمليات الضبط المُدارة لتطبيق شبكة VPN (انظر المثال أدناه).

تفعيل اتصال شبكة VPN قيد التشغيل دائمًا

يمكن لوحدة التحكّم بسياسة الجهاز (DPC) ضبط اتصال شبكة VPN قيد التشغيل دائمًا من خلال تطبيق معيّن من خلال الاتصال بـ DevicePolicyManager.setAlwaysOnVpnPackage().

ويتم منح هذا الاتصال تلقائيًا ويستمر بعد إعادة التشغيل. إذا كانت قيمة lockdownEnabled غير صحيحة، قد تكون حركة بيانات الشبكة غير آمنة عند إعادة تشغيل الهاتف والاتصال بشبكة VPN. يكون هذا مفيدًا إذا كنت لا تريد إيقاف الاتصال بالشبكة عند تعطُّل الشبكة الافتراضية الخاصة، أو إذا لم تكن الشبكة الافتراضية الخاصة ضرورية.

التحقق من اتصال شبكة VPN قيد التشغيل دائمًا

يمكن لوحدة التحكّم بسياسة الجهاز قراءة اسم الحزمة التي تدير اتصال شبكة VPN قيد التشغيل دائمًا للمستخدم الحالي باستخدام DevicePolicyManager.getAlwaysOnVpnPackage().

إذا لم تتوفّر هذه الحزمة أو تم إنشاء شبكة VPN ضمن تطبيق "الإعدادات" الخاصة بالنظام، يتم عرض null.

مثال

في تطبيق TestDPC، يستخدم AlwaysOnVpnFragment.java واجهات برمجة التطبيقات هذه لتفعيل إعداد اتصال شبكة VPN قيد التشغيل دائمًا.

في المثال التالي:

  • يتم ضبط عمليات الضبط المُدارة لخدمة شبكة VPN من خلال DevicePolicyManager باستخدام طريقة setApplicationRestrictions() الخاصة بها.
  • تستخدم عمليات الضبط المُدارة أزواجًا عشوائية من المفاتيح/القيمة، ويستخدمها هذا المثال في مكان آخر لضبط إعدادات شبكة VPN (راجِع التحقّق من عمليات الضبط المُدارة).
  • يضيف هذا المثال أداة تثبيت حزمة Android إلى قائمة الحظر، بحيث لا يقوم بتحديث حزم النظام عبر شبكة VPN. تنتقل جميع حركة بيانات الشبكة للمستخدم ضمن الملف الشخصي للعمل أو الجهاز عبر تطبيق شبكة VPN هذا، باستثناء أداة تثبيت الحزمة، حيث تستخدم تحديثاته شبكة الإنترنت المفتوحة.
  • بعد ذلك، يفعّل DevicePolicyManager الاتصال عبر شبكة VPN لحزمة الشبكة الافتراضية الخاصة باستخدام setAlwaysOnVpnPackage()، مع تفعيل "وضع الإغلاق".

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(...);
}

إعداد معرّف شبكة لاسلكية واحد في جميع المناطق

يمكن لوحدة التحكّم بسياسة الجهاز (DPC) أن تربط عدة شهادات مرجع تصديق (CA) بإعدادات شبكة لاسلكية واحدة، وذلك إما في وضع مالك الجهاز أو وضع مالك الملف الشخصي. من خلال هذه الإعدادات، يمكن توصيل جهاز بنقاط وصول لاسلكية لها اسم الشبكة نفسه أو معرّف مجموعة الخدمات (SSID)، لكن يتم ضبطها بشهادات CA مختلفة. ويكون ذلك مفيدًا إذا كانت الشبكات اللاسلكية لمؤسستك موجودة في مناطق جغرافية متعددة، وتتطلب كل منطقة مرجع تصديق مختلفًا. على سبيل المثال، قد تتطلب التوقيعات القانونية هيئة محلية تحتاج إلى مرجع تصديق إقليمي.

ملاحظة: لقد حصل Android على دعم setCaCertificate منذ واجهة برمجة التطبيقات 18 (Jelly Bean)، لكن على مشرفي تكنولوجيا المعلومات تزويد شبكاتهم بشكل منفصل مع كل مرجع تصديق لضمان حصول الأجهزة على مصادقة سلسة عند كل نقطة وصول، بغض النظر عن منطقتها.

تحديد شهادات CA لتحديد الخادم

لتحديد قائمة بشهادات X.509 التي تحدّد الخادم الذي يستخدم معرّف SSID نفسه، عليك تضمين جميع مراجع التصديق ذات الصلة في الإعدادات اللاسلكية باستخدام WifiEnterpriseConfig.setCaCertificates().

تكون شهادة الخادم صالحة إذا كان مرجع التصديق (CA) التابع له يطابق إحدى الشهادات المحددة. يتم تخصيص الأسماء التلقائية للشهادات تلقائيًا واستخدامها في عملية الإعداد. يثبّت WifiManager الشهادة ويحفظ الإعدادات تلقائيًا عند تفعيل الشبكة، ويزيل الشهادة عند حذف الإعداد.

للحصول على جميع شهادات CA المرتبطة بالإعداد اللاسلكي، استخدِم WifiEnterpriseConfig.getCaCertificates() لعرض قائمة بكائنات X509Certificate.

إضافة إعداد لاسلكي باستخدام شهادات CA متعدّدة

  1. التحقّق من هوية الخادم:
    1. حمِّل شهادات X.509 CA.
    2. حمِّل المفتاح الخاص والشهادة للعميل. راجع الأمان باستخدام HTTPS وطبقة المقابس الآمنة للحصول على مثال حول كيفية قراءة ملف شهادة.
  2. يمكنك إنشاء WifiConfiguration جديد وضبط معرّف SSID وإدارة المفاتيح.
  3. يمكنك إعداد المثيل WifiEnterpriseConfig على جهاز WifiConfiguration هذا.
    1. حدِّد الخادم من خلال قائمة تضم عناصر X509Certificate باستخدام setCaCertificates().
    2. اضبط بيانات اعتماد العميل وهويته وكلمة المرور له.
    3. اضبط بروتوكول المصادقة القابلة للامتداد (EAP) وطريقة المرحلة الثانية كجزء من إنشاء الاتصال.
  4. أضِف الشبكة باستخدام WifiManager.
  5. فعِّل الشبكة. يحفظ WifiManager الإعداد تلقائيًا أثناء الإعداد.

يربط هذا المثال الخطوات معًا:

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);
}

تحديد برنامج اتصال منفصل للملف الشخصي للعمل

يمكنك إضافة تطبيق برنامج اتصال منفصل إلى القائمة المسموح بها لاستخدامه في الملف الشخصي للعمل. قد يكون هذا هو برنامج الاتصال نفسه أو تطبيق Voice عبر IP (VoIP) الذي ينفّذ ConnectionService واجهة برمجة التطبيقات للواجهة الخلفية للاتصال. يوفر ذلك نفس تجربة الاتصال عبر واجهة مستخدم النظام المتكاملة لتطبيقات بروتوكول الصوت على الإنترنت في الملف الشخصي للعمل، ما يجعل من برنامج اتصال العمل ميزة أساسية بشكل فعّال. يتم تمييز المكالمات الواردة إلى حسابات مكالمات العمل عن المكالمات الواردة إلى حسابات الاتصال الشخصية.

يمكن للمستخدم اختيار إجراء المكالمات وتلقّيها من برنامج اتصال العمل المدرَجة في القائمة المسموح بها على حساب الهاتف. ويتم تسجيل جميع المكالمات التي يتم إجراؤها من برنامج الاتصال هذا أو الواردة إلى حساب هاتف العمل في مقدّم خدمة CallLog الملف الشخصي للعمل. يحتفظ برنامج الاتصال بالعمل بسجل مكالمات للعمل فقط مع إمكانية الوصول فقط إلى جهات اتصال العمل. يعالج برنامج الاتصال الأساسي مكالمات مبدل الدائرة الواردة ويتم تخزينها في سجل المكالمات الشخصي. إذا تم حذف ملف شخصي للعمل، سيتم أيضًا حذف سجلّ المكالمات المرتبط بهذا الملف الشخصي للعمل، بالإضافة إلى جميع بيانات الملف الشخصي للعمل.

يجب على التطبيقات التابعة لجهات خارجية تنفيذ ConnectionService

أمّا تطبيقات VoIP التابعة لجهات خارجية والتي تحتاج إلى إجراء مكالمات هاتفية وتم دمجها في تطبيق الهاتف المدمج، فيمكنها تنفيذ ConnectionService واجهة برمجة التطبيقات. وهذا الإجراء مطلوب لأي خدمة من خدمات بروتوكول الصوت على الإنترنت المستخدمة في مكالمات العمل. تستفيد هذه التطبيقات من خلال التعامل مع مكالماتها مثل المكالمات الخلوية التقليدية، فعلى سبيل المثال، تظهر في برنامج الاتصال المدمج بالنظام وسجل المكالمات. في حال تثبيت تطبيق ConnectionService في الملف الشخصي للعمل، لا يمكن الوصول إليه إلا من خلال برنامج اتصال مثبَّت أيضًا في الملف الشخصي للعمل هذا.

بعد أن ينفّذ المطوّر ConnectionService، عليه إضافته إلى ملف بيان التطبيق وتسجيل PhoneAccount في TelecomManager. يمثّل حساب الهاتف طريقة مختلفة لإجراء المكالمات الهاتفية أو تلقّيها، ويمكن أن يكون هناك عدة PhoneAccounts لكل ConnectionService. بعد تسجيل حساب الهاتف، يمكن للمستخدم تمكينه من خلال إعدادات برنامج الاتصال.

دمج واجهة مستخدم النظام والإشعارات

توفّر واجهة مستخدم النظام للمستخدمين تجربة اتصال متسقة ومتكاملة للتطبيقات التابعة للجهات الخارجية التي تستخدم ConnectionService واجهة برمجة التطبيقات كخلفية لإجراء المكالمات. عند استخدام التطبيق في ملف شخصي للعمل، يظهر رمز حقيبة أوراق في المكالمات الواردة وفي شريط الحالة. يمكن لأي تطبيق ينفِّذ ConnectionService مُثبَّت في الملف الشخصي للعمل استخدام برنامج اتصال النظام أو إنشاء برنامج اتصال منفصل للعمل. يمكن أن تكون تطبيقًا واحدًا أو تطبيقات منفصلة.

يحدد تطبيق برنامج الاتصال ما إذا كان يجري أو يستقبل مكالمة عمل من خلال البحث عن العلامة android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL. إذا كانت المكالمة هي مكالمة عمل، فسيشير برنامج الاتصال إلى ذلك للمستخدم عن طريق إضافة شارة عمل (رمز حقيبة الأوراق):

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
}