نظرة عامة على بروتوكول بدء الجلسة

رصد شرائح eSIM وشرائح SIM

جارٍ رصد البطاقات

تستخدم أجهزة Android التي تتضمّن شرائح SIM وشرائح eSIM أرقام التعريف التالية في الاتصالات الهاتفية. تشمل واجهات برمجة التطبيقات [`ContactManager`](/reference/android/telephony/TechnicalManager) و ["SubscriptionManager"](/reference/android/telephony/SUBSCRIPTIONManager): * معرّف الاشتراك: المعرّف الفريد لاشتراك الأجهزة الجوّالة. * معرّف أو فهرس الخانة المنطقية: فهرس فريد يشير إلى فتحة SIM منطقية. تبدأ أرقام تعريف الخانات المنطقية من 0 وترتفع اعتمادًا على عدد الخانات النشطة المتوافقة على الجهاز. على سبيل المثال، يستخدم الجهاز بشريحتَي SIM عادةً تحتوي على الفتحة 0 والخانة 1. إذا كان الجهاز يحتوي على عدة خانات مادية تدعم خانة نشطة واحدة، لن يتوفر لها سوى معرف الخانة المنطقي 0. * فهرس أو معرّف الخانة المادية: فهرس فريد يشير إلى فتحة شريحة SIM فعلية. تبدأ أرقام تعريف الخانات المادية من 0 وترتفع اعتمادًا على عدد الفتحات في الجهاز. يختلف هذا عن عدد الخانات المنطقية للجهاز والذي يتوافق مع عدد الخانات النشطة التي يمكن للجهاز التي تستخدمها. على سبيل المثال، جهاز يبدِّل بين شريحتَي SIM وشريحة SIM واحدة فتحتين ماديتين دائمًا، غير أنّه في وضع شريحة SIM الواحدة خانة منطقية واحدة فقط. * رقم تعريف البطاقة: المعرّف الفريد المستخدَم لتحديد بطاقة UiccCard ![رسم بياني لكيفية استخدام المعرّفات في حالة تحتوي على خانتين منطقيتين وثلاث خانات مادية](/images/guide/topics/connectivity/tel-ids.png) في المخطط أعلاه: * يشتمل الجهاز على فتحتين منطقيتين. * في الفتحة 0، تتوفّر بطاقة UICC فعلية تحتوي على ملف شخصي نشط. * في الفتحة المادية 2، تتوفّر eUICC مع ملف شخصي نشط. * الفتحة المادية 1 غير مُستخدَمة حاليًا. ![رسم بياني لكيفية استخدام المعرّفات في حالة تحتوي على ثلاث خانات منطقية وخانتين ماديتين](/images/guide/topics/connectivity/tel-ids-2.png) في المخطط أعلاه: * يتضمّن الجهاز ثلاث خانات منطقية. * في الفتحة 0، تتوفّر بطاقة UICC فعلية تحتوي على ملف شخصي نشط. * في الخانة المادية 1، تتوفّر eUICC التي تحتوي على ملفَّين شخصيَّين تم تنزيلهما، فكلاهما نشطان باستخدام MEP (الملفات الشخصية المتعدّدة المفعّلة).

نظرة عامة على بروتوكول بدء الجلسة

يوفر Android واجهة برمجة تطبيقات تتوافق مع بروتوكول بدء الجلسة (SIP). يتيح لك ذلك إضافة ميزات الاتصال الهاتفي على الإنترنت المستندة إلى SIP إلى تطبيقاتك. يشتمل Android على حزمة كاملة من بروتوكول SIP وإدارة المكالمات المدمجة. التي تتيح للتطبيقات إعداد المكالمات الصوتية الصادرة والواردة بسهولة، بدون الحاجة إلى إدارة الجلسات أو الاتصالات على مستوى وسائل النقل أو التسجيلات الصوتية التسجيل أو التشغيل مباشرةً

في ما يلي أمثلة على أنواع التطبيقات التي قد تستخدم SIP API:

  • اجتماعات الفيديو
  • الرسائل الفورية

المتطلبات والقيود

في ما يلي متطلبات تطوير تطبيق SIP:

  • يجب أن يكون لديك جهاز جوّال يعمل بنظام التشغيل Android 2.3 أو إصدار أحدث.
  • تعمل خدمة SIP عبر اتصال بيانات لاسلكي، لذا يجب أن يتضمّن جهازك بيانات. اتصال (من خلال خدمة بيانات الجوّال أو شبكة Wi-Fi). هذا يعني أنك الذي لا يمكنك اختباره على AVD - يمكنك اختباره على جهاز فعلي فقط. للحصول على التفاصيل، يمكنك مراجعة اختبار تطبيقات SIP:
  • ينبغي أن يكون لكل مشارك في جلسة التواصل الخاصة بالتطبيق حساب SIP. هناك العديد من مقدمي خدمة SIP المختلفين الذين يقدمون حسابات SIP.

ملاحظة: لا يمكنك مشاهدة الفيديو في مكتبة android.net.sip. الاتصالات. إذا كنت تريد تنفيذ اتصال VOIP باستخدام حزمة SIP، مثل android.net.sip، يمكنك إلقاء نظرة على أحد البرامج الحديثة المفتوحة المصدر بديلة كأساس لتنفيذ أي مكالمات من خلال ميزة انتقال الصوت عبر بروتوكول الإنترنت (VoIP). بدلاً من ذلك، يمكنك تنفيذ ConnectionService واجهة برمجة تطبيقات توفر إمكانية دمج هذه المكالمات في تطبيق Dialer للجهاز التطبيق.

فئات وواجهات SIP API

في ما يلي ملخص للفصول وواجهة واحدة (SipRegistrationListener) المضمّنة في بروتوكول Android SIP واجهة برمجة التطبيقات:

الصف/الواجهة الوصف
SipAudioCall التعامل مع المكالمات الصوتية على الإنترنت عبر SIP.
SipAudioCall.Listener أداة معالجة الأحداث المرتبطة بمكالمة SIP، مثل وقت إجراء مكالمة تم تلقيها ("عند الرنين") أو كانت المكالمة صادرة ("أثناء الاتصال").
SipErrorCode لتحديد رموز الخطأ التي يتم عرضها أثناء إجراءات SIP.
SipManager توفير واجهات برمجة تطبيقات لمهام SIP، مثل بدء اتصالات SIP، وتوفير إمكانية الوصول بخدمات SIP ذات الصلة
SipProfile تحدد هذه السمة ملف SIP، بما في ذلك معلومات حساب SIP والنطاق والخادم.
SipProfile.Builder فئة مساعدة لإنشاء ملف SipProfile.
SipSession يمثّل هذا النوع جلسة SIP المرتبطة بمربّع حوار SIP أو معاملة مستقلة. وليس داخل مربع حوار.
SipSession.Listener أدوات معالجة الأحداث المرتبطة بجلسة SIP، مثل وقت تسجيل جلسة ("عند التسجيل") أو أن تكون المكالمة صادرة ("أثناء الاتصال").
SipSession.State تحدد حالات جلسة SIP، مثل "التسجيل" و"مكالمة صادرة" و"في المكالمة".
SipRegistrationListener يشير ذلك المصطلح إلى واجهة تستخدم خدمة معالجة أحداث تسجيل SIP.

جارٍ إنشاء البيان

إذا كنت تطوّر تطبيقًا يستخدم SIP API، تذكّر أنّه لا تتوفّر هذه الميزة إلا على نظام التشغيل Android 2.3 (المستوى 9 من واجهة برمجة التطبيقات) والإصدارات الأحدث من المنصة. بالإضافة إلى ذلك، من بين الأجهزة التي تعمل بنظام التشغيل Android 2.3 (المستوى 9 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، لن توفر كل الأجهزة دعم SIP.

لاستخدام SIP، أضِف الأذونات التالية إلى بيان التطبيق:

  • android.permission.USE_SIP
  • android.permission.INTERNET

للتأكد من إمكانية تثبيت تطبيقك على الأجهزة التي: قادر على دعم SIP، أضِف ما يلي إلى قسم البيان:

<uses-sdk android:minSdkVersion="9" />

يشير هذا إلى أنّ تطبيقك يتطلب الإصدار 2.3 من نظام التشغيل Android أو إصدارًا أحدث. بالنسبة مزيد من المعلومات، راجع مستويات واجهة برمجة التطبيقات والوثائق الخاصة <uses-sdk> العنصر.

للتحكّم في كيفية فلترة تطبيقك من الأجهزة غير المتوافقة في Google Play (على سبيل المثال، Google Play)، أضِف ما يلي إلى عنوان URL البيان:

<uses-feature android:name="android.software.sip.voip" />

يشير ذلك إلى أنّ تطبيقك يستخدم SIP API. يجب أن يتضمن البيان ضمِّن سمة android:required تشير إلى ما إذا كنت تريد أن تتم تصفية التطبيق من الأجهزة التي لا توفر دعم SIP. قد تكون هناك حاجة أيضًا إلى بيانات <uses-feature> أخرى، اعتمادًا على طريقة التنفيذ. لمزيد من المعلومات، راجِع المستندات بالنسبة إلى <uses-feature> العنصر.

إذا تم تصميم تطبيقك لتلقّي المكالمات، يجب أيضًا تحديد جهاز استقبال (فئة فرعية واحدة (BroadcastReceiver)) في بيان التطبيق:

<receiver android:name=".IncomingCallReceiver" android:label="Call Receiver" />

في ما يلي مقتطفات من بيان SipDemo:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.android.sip">
  ...
     <receiver android:name=".IncomingCallReceiver" android:label="Call Receiver" />
  ...
  <uses-sdk android:minSdkVersion="9" />
  <uses-permission android:name="android.permission.USE_SIP" />
  <uses-permission android:name="android.permission.INTERNET" />
  ...
  <uses-feature android:name="android.software.sip.voip" android:required="true" />
  <uses-feature android:name="android.hardware.wifi" android:required="true" />
  <uses-feature android:name="android.hardware.microphone" android:required="true" />
</manifest>

جارٍ إنشاء SipManager

لاستخدام SIP API، يجب أن ينشئ تطبيقك عنصر SipManager. يبدأ SipManager عليك الاهتمام بما يلي في طلبك:

  • جارٍ بدء جلسات SIP.
  • بدء المكالمات واستلامها
  • التسجيل وإلغاء التسجيل لدى مقدم خدمة SIP.
  • جارٍ التحقّق من اتصال الجلسة.

يمكنك إنشاء مثيل جديد لـ SipManager على النحو التالي:

Kotlin

val sipManager: SipManager? by lazy(LazyThreadSafetyMode.NONE) {
    SipManager.newInstance(this)
}

Java

public SipManager sipManager = null;
...
if (sipManager == null) {
    sipManager = SipManager.newInstance(this);
}

التسجيل باستخدام خادم SIP

يتضمّن تطبيق Android SIP النموذجي مستخدمًا واحدًا أو أكثر، يستخدم كل منهم. لديه حساب على SIP. في تطبيق Android SIP، يتم التعامل مع كل حساب SIP يتم تمثيلها بواسطة كائن SipProfile.

تحدِّد SipProfile ملفًا شخصيًا في SIP، بما في ذلك SIP. ومعلومات الحساب والنطاق والخادم. الملف الشخصي المرتبط ببروتوكول SIP على الجهاز الذي يشغِّل التطبيق يُسمى المحلي بك. يُطلق على الملف الشخصي الذي تتصل به الجلسة الملف الشخصي للزملاء. عندما يسجّل تطبيق SIP الدخول إلى خادم SIP باستخدام SipProfile المحلية، يتم تسجيل الجهاز كموقع لإرسال مكالمات SIP إليه لعنوان SIP.

يعرض هذا القسم كيفية إنشاء SipProfile وتسجيله مع خادم SIP، وتتبُّع أحداث التسجيل.

يمكنك إنشاء كائن SipProfile على النحو التالي:

Kotlin

private var sipProfile: SipProfile? = null
...

val builder = SipProfile.Builder(username, domain)
        .setPassword(password)
sipProfile = builder.build()

Java

public SipProfile sipProfile = null;
...

SipProfile.Builder builder = new SipProfile.Builder(username, domain);
builder.setPassword(password);
sipProfile = builder.build();

يفتح مقتطف الرمز التالي الملف الشخصي المحلي لإجراء المكالمات و/أو تلقّي مكالمات عامة من خلال SIP. يمكن للمتصل إجراء مكالمات لاحقة من خلال mSipManager.makeAudioCall يحدد هذا المقتطف أيضًا الإجراء android.SipDemo.INCOMING_CALL، والذي سيتم استخدامه من خلال هدف عندما يتلقى الجهاز مكالمة (راجع إعداد فلتر أهداف لتلقّي المكالمات). هذه هي خطوة التسجيل:

Kotlin

val intent = Intent("android.SipDemo.INCOMING_CALL")
val pendingIntent: PendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA)
sipManager?.open(sipProfile, pendingIntent, null)

Java

Intent intent = new Intent();
intent.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA);
sipManager.open(sipProfile, pendingIntent, null);

أخيرًا، يضبط هذا الرمز SipRegistrationListener على SipManager. يتيح لك هذا الخيار تتبُّع ما إذا كان قد تم تسجيل "SipProfile" بنجاح في خدمة SIP. مقدِّم الخدمة:

Kotlin

sipManager?.setRegistrationListener(sipProfile?.uriString, object : SipRegistrationListener {

    override fun onRegistering(localProfileUri: String) {
        updateStatus("Registering with SIP Server...")
    }

    override fun onRegistrationDone(localProfileUri: String, expiryTime: Long) {
        updateStatus("Ready")
    }

    override fun onRegistrationFailed(
            localProfileUri: String,
            errorCode: Int,
            errorMessage: String
    ) {
        updateStatus("Registration failed. Please check settings.")
    }
})

Java

sipManager.setRegistrationListener(sipProfile.getUriString(), new SipRegistrationListener() {

    public void onRegistering(String localProfileUri) {
        updateStatus("Registering with SIP Server...");
    }

    public void onRegistrationDone(String localProfileUri, long expiryTime) {
        updateStatus("Ready");
    }

    public void onRegistrationFailed(String localProfileUri, int errorCode,
        String errorMessage) {
        updateStatus("Registration failed.  Please check settings.");
    }
}

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

Kotlin

fun closeLocalProfile() {
    try {
        sipManager?.close(sipProfile?.uriString)
    } catch (ee: Exception) {
        Log.d("WalkieTalkieActivity/onDestroy", "Failed to close local profile.", ee)
    }
}

Java

public void closeLocalProfile() {
    if (sipManager == null) {
       return;
    }
    try {
       if (sipProfile != null) {
          sipManager.close(sipProfile.getUriString());
       }
     } catch (Exception ee) {
       Log.d("WalkieTalkieActivity/onDestroy", "Failed to close local profile.", ee);
     }
}

إجراء مكالمة صوتية

لإجراء مكالمة صوتية، يجب أن يكون لديك ما يلي:

  • جهاز SipProfile الذي يقوم بالاتصال (ب "الملف الشخصي المحلي")، وعنوان SIP صالح لتلقي المكالمة ( "ملف شخصي للزملاء").
  • عنصر SipManager

لإجراء مكالمة صوتية، يجب إعداد SipAudioCall.Listener. إن الكثير من تفاعل العميل مع تحدث حزمة SIP من خلال المستمعين. في هذا المقتطف، سترى طريقة إعداد SipAudioCall.Listener بعد المكالمة. :

Kotlin

var listener: SipAudioCall.Listener = object : SipAudioCall.Listener() {

    override fun onCallEstablished(call: SipAudioCall) {
        call.apply {
            startAudio()
            setSpeakerMode(true)
            toggleMute()
        }
    }

    override fun onCallEnded(call: SipAudioCall) {
        // Do something.
    }
}

Java

SipAudioCall.Listener listener = new SipAudioCall.Listener() {

   @Override
   public void onCallEstablished(SipAudioCall call) {
      call.startAudio();
      call.setSpeakerMode(true);
      call.toggleMute();
         ...
   }

   @Override

   public void onCallEnded(SipAudioCall call) {
      // Do something.
   }
};

بعد إعداد "SipAudioCall.Listener"، يمكنك إجراء المكالمة. الطريقة SipManager تستخدم makeAudioCall المعلمات التالية:

  • ملف شخصي محلي على SIP (المتصل).
  • ملف شخصي SIP نظير (يتم الاتصال بالمستخدم).
  • SipAudioCall.Listener للاستماع إلى المكالمة أحداث من SipAudioCall. يمكن أن تكون null، ولكن كما هو موضح أعلاه، يتم استخدام المستمع لإعداد الأشياء بمجرد إجراء التأسيس.
  • قيمة المهلة بالثواني.

مثلاً:

Kotlin

val call: SipAudioCall? = sipManager?.makeAudioCall(
        sipProfile?.uriString,
        sipAddress,
        listener,
        30
)

Java

call = sipManager.makeAudioCall(sipProfile.getUriString(), sipAddress, listener, 30);

استلام مكالمات

لتلقّي المكالمات، يجب أن يشتمل تطبيق SIP على فئة فرعية من BroadcastReceiver لديها القدرة على الاستجابة لهدف. يشير إلى وجود مكالمة واردة. وبالتالي، يجب عليك القيام بما يلي تطبيقك:

  • في AndroidManifest.xml، يجب الإفصاح عن <receiver> في SipDemo، تكون <receiver android:name=".IncomingCallReceiver" android:label="Call Receiver" />
  • تنفيذ جهاز الاستقبال، وهو فئة فرعية من BroadcastReceiver. في SipDemo، تكون IncomingCallReceiver
  • إعداد الملف الشخصي المحلي (SipProfile) باستخدام في انتظار المراجعة يؤدي إلى تنشيط الجهاز عند اتّصال أحد المستخدمين بالملفّ التجاري المحلي.
  • أعِدّ فلتر أهداف تتم الفلترة حسب الإجراء الذي يمثّل إحدى مكالمة واردة. في SipDemo، يكون هذا الإجراء android.SipDemo.INCOMING_CALL

جهاز استقبال بث تصنيف فرعي

لتلقّي المكالمات، يجب أن يشتمل تطبيق SIP على الفئة الفرعية "BroadcastReceiver". يعالج نظام Android مكالمات SIP الواردة ويبث رسالة استدعاء" intent (على النحو المحدد في التطبيق) عند استلامه إجراء مكالمة في ما يلي الفئة الفرعية BroadcastReceiver من نموذج SiipDemo.

Kotlin

/**
 * Listens for incoming SIP calls, intercepts and hands them off to WalkieTalkieActivity.
 */
class IncomingCallReceiver : BroadcastReceiver() {

    /**
     * Processes the incoming call, answers it, and hands it over to the
     * WalkieTalkieActivity.
     * @param context The context under which the receiver is running.
     * @param intent The intent being received.
     */
    override fun onReceive(context: Context, intent: Intent) {
        val wtActivity = context as WalkieTalkieActivity

        var incomingCall: SipAudioCall? = null
        try {
            incomingCall = wtActivity.sipManager?.takeAudioCall(intent, listener)
            incomingCall?.apply {
                answerCall(30)
                startAudio()
                setSpeakerMode(true)
                if (isMuted) {
                    toggleMute()
                }
                wtActivity.call = this
                wtActivity.updateStatus(this)
            }
        } catch (e: Exception) {
            incomingCall?.close()
        }
    }

    private val listener = object : SipAudioCall.Listener() {

        override fun onRinging(call: SipAudioCall, caller: SipProfile) {
            try {
                call.answerCall(30)
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
}

Java

/**
 * Listens for incoming SIP calls, intercepts and hands them off to WalkieTalkieActivity.
 */
public class IncomingCallReceiver extends BroadcastReceiver {
    /**
     * Processes the incoming call, answers it, and hands it over to the
     * WalkieTalkieActivity.
     * @param context The context under which the receiver is running.
     * @param intent The intent being received.
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        SipAudioCall incomingCall = null;
        try {
            SipAudioCall.Listener listener = new SipAudioCall.Listener() {
                @Override
                public void onRinging(SipAudioCall call, SipProfile caller) {
                    try {
                        call.answerCall(30);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
            incomingCall = wtActivity.sipManager.takeAudioCall(intent, listener);
            incomingCall.answerCall(30);
            incomingCall.startAudio();
            incomingCall.setSpeakerMode(true);
            if(incomingCall.isMuted()) {
                incomingCall.toggleMute();
            }
            wtActivity.call = incomingCall;
            wtActivity.updateStatus(incomingCall);
        } catch (Exception e) {
            if (incomingCall != null) {
                incomingCall.close();
            }
        }
    }
}

إعداد فلتر أهداف لتلقّي المكالمات

عندما تتلقّى خدمة SIP مكالمة جديدة، ترسِل رسالة intent مع سلسلة الإجراء التي يقدمها التطبيق. في SipDemo، تكون سلسلة الإجراء هذه android.SipDemo.INCOMING_CALL

يعرض مقتطف الرمز هذا من SipDemo كيفية إنشاء العنصر SipProfile لغرض في انتظار المراجعة استنادًا إلى. سلسلة الإجراء android.SipDemo.INCOMING_CALL. تشير رسالة الأشكال البيانية سيُجري كائن "PendingIntent" بثًا عندما يتلقّى "SipProfile" مكالمة:

Kotlin

val sipManager: SipManager? by lazy(LazyThreadSafetyMode.NONE) {
    SipManager.newInstance(this)
}

var sipProfile: SipProfile? = null
...

val intent = Intent("android.SipDemo.INCOMING_CALL")
val pendingIntent: PendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA)
sipManager?.open (sipProfile, pendingIntent, null)

Java

public SipManager sipManager = null;
public SipProfile sipProfile = null;
...

Intent intent = new Intent();
intent.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA);
sipManager.open(sipProfile, pendingIntent, null);

سيتم اعتراض البث بواسطة فلتر الأهداف، الذي ينشط بعد ذلك المستلِم (IncomingCallReceiver). يمكنك تحديد هدف في ملف بيان تطبيقك، أو يمكنك تنفيذ ذلك في رمز برمجي كما في SipDemo طريقة onCreate() لنموذج التطبيق Activity للتطبيق:

Kotlin

class WalkieTalkieActivity : Activity(), View.OnTouchListener {
    ...
    lateinit var callReceiver: IncomingCallReceiver
    ...

    override fun onCreate(savedInstanceState: Bundle) {
        val filter = IntentFilter().apply {
            addAction("android.SipDemo.INCOMING_CALL")
        }
        callReceiver = IncomingCallReceiver()
        this.registerReceiver(callReceiver, filter)
        ...
    }
    ...
}

Java

public class WalkieTalkieActivity extends Activity implements View.OnTouchListener {
...
    public IncomingCallReceiver callReceiver;
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {

       IntentFilter filter = new IntentFilter();
       filter.addAction("android.SipDemo.INCOMING_CALL");
       callReceiver = new IncomingCallReceiver();
       this.registerReceiver(callReceiver, filter);
       ...
    }
    ...
}

اختبار تطبيقات SIP

لاختبار تطبيقات SIP، تحتاج إلى ما يلي:

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

لاختبار تطبيق SIP:

  1. على جهازك، اتصل بالشبكة اللاسلكية (الإعدادات > اللاسلكي والشبكات &gt; Wi-Fi > إعدادات Wi-Fi).
  2. عليك إعداد جهازك الجوّال للاختبار، كما هو موضّح في التطوير على الجهاز.
  3. شغِّل التطبيق على جهازك الجوّال، كما هو موضَّح في مقالة التطوير على الجهاز.
  4. إذا كنت تستخدم "استوديو Android"، يمكنك عرض ناتج سجلّ التطبيق من خلال فتح وحدة تحكم سجل الأحداث (عرض > نافذة الأداة > سجل الأحداث).
  5. تأكَّد من ضبط تطبيقك لتشغيل Logcat تلقائيًا عند تشغيله:
    1. حدد تشغيل > عدِّل الإعدادات.
    2. اختَر علامة التبويب متنوعات في نافذة إعدادات التشغيل/تصحيح الأخطاء.
    3. ضِمن Logcat، اختَر عرض Logcat تلقائيًا ثم. اختَر حسنًا.