رصد شرائح 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:
- على جهازك، اتصل بالشبكة اللاسلكية (الإعدادات > اللاسلكي والشبكات > Wi-Fi > إعدادات Wi-Fi).
- عليك إعداد جهازك الجوّال للاختبار، كما هو موضّح في التطوير على الجهاز.
- شغِّل التطبيق على جهازك الجوّال، كما هو موضَّح في مقالة التطوير على الجهاز.
- إذا كنت تستخدم "استوديو Android"، يمكنك عرض ناتج سجلّ التطبيق من خلال فتح وحدة تحكم سجل الأحداث (عرض > نافذة الأداة > سجل الأحداث).
- تأكَّد من ضبط تطبيقك لتشغيل Logcat تلقائيًا عند تشغيله:
- حدد تشغيل > عدِّل الإعدادات.
- اختَر علامة التبويب متنوعات في نافذة إعدادات التشغيل/تصحيح الأخطاء.
- ضِمن Logcat، اختَر عرض Logcat تلقائيًا ثم. اختَر حسنًا.