2011-04-21 18 views
7

हम प्रोग्रामेटिक रूप से कैसे जानते हैं कि मैं जो कॉल कर रहा हूं वह दूसरी तरफ प्राप्त हुआ है? मुझे पता है कि कुछ फोन स्टेटस जैसे आईडीई, ऑफफोक और रिंगिंग हैं। मैं अधिसूचित होना चाहता हूं कि जो आउटगोइंग कॉल मैं प्राप्त कर रहा हूं, वह दूसरी तरफ से डिस्कनेक्ट हो गया है या दूसरी तरफ अनुपस्थित है।फोन कॉल राज्य

कृपया सुझाव दें।

उत्तर

1

क्या मैं समझता हूँ कि हम OffHook राज्य के अंदर विभिन्न राज्यों के बीच अंतर नहीं कर सकते, जब तक कि हम आंतरिक पैकेज उपयोग कर सकते है है: तो फिर तुम कुछ इस तरह कर सकते हैं।

यदि हमारे पास आंतरिक पैकेज पहुंच है तो केवल हम ही जान सकते हैं कि कनेक्ट किया गया कॉल वास्तव में प्राप्त हुआ है या दूसरी तरफ से डिस्कनेक्ट हो गया है या डिस्कनेक्ट किया गया है।

+0

हाय क्या मैं वास्तव में जानता हूं कि आंतरिक पैकेज किस संदर्भ में है? – user2199280

3

आपको PhoneStateListener की आवश्यकता है। फोन कॉल की स्थिति की जांच करना संभव है। आपको onCallStateChanged लागू करना होगा। इस विधि को हर बार फोन कॉल की स्थिति में बदलाव कहा जाता है।

switch(state) { 
      case TelephonyManager.CALL_STATE_IDLE: 
        Log.d("Call","Outgoing Call finished"); 
      break; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
        Log.d("Call","Outgoing Call Starting"); 
      break; 
     } 
+1

यह नहीं है कि OffHook राज्य इन डायलन के सभी का मतलब है, की स्थापना की और त्रिशंकु फोन कॉल? मैं इन तीनों के बीच अंतर कैसे कर सकता हूं। जहां एक लिंक में मैंने देखा कि ऑफफोक राज्य का मतलब केवल कॉल है। कृपया स्पष्ट करें। कॉल किए गए कॉल के साथ –

+0

मेरा मतलब है कि दूसरी तरफ फोन उठाया गया है। मैं यह भी जानना चाहता हूं कि यह संभव है कि दूसरी तरफ कॉल को उठाए बिना सीधे डिस्कनेक्ट हो। तो क्या मैं इसके बारे में जान सकता हूँ? –

+0

यहां आप तीन राज्यों को कॉल कर सकते हैं: http://developer.android.com/reference/android/telephony/TelephonyManager.html –

0

आप निम्नलिखित onReceive कार्यान्वयन के साथ broadcastreceiver उपयोग करने के लिए phonestate के लिए जाँच करने के लिए है में परिवर्तन

@Override 
public void onReceive(Context context, Intent intent) { 
    this.context = context; 
    final Bundle extras = intent.getExtras(); 
    if (intent.getAction().equals(
    TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ 
     final String state = extras.getString(TelephonyManager.EXTRA_STATE); 
     if ("IDLE".equals(state)){ 
      //TODO 
     } 
     if ("OFFHOOK".equals(state)){ 
      //TODO 
     } 
     if ("RINGING".equals(state)){ 
      //TODO 
     } 
    } 
} 

और तुम मध्यवर्ती राज्य के लिए जाँच करना चाहते हैं, तो आप जैसे जोड़ सकते हैं एक पूर्णांक के रूप में राज्य नियंत्रण ....

2

हालांकि एंड्रॉइड टेलीफोनी प्रबंधक में केवल तीन राज्य उपलब्ध हैं, फिर भी फोन कॉल में सभी स्थितियों के लिए राज्य की पहचान करना बहुत आसान है। तो यहां हम एंड्रॉइड से 3 घटनाएं जैसे कि रिंगिंग, ऑफफोक और आईडीएलई प्राप्त कर रहे हैं। और कॉल की प्रतीक्षा स्थिति प्राप्त करने के लिए, हमें रिंगिंग, ऑफफोक, आईडीईएल, FIRST_CALL_RINGING, SECOND_CALL_RINGING जैसे अपने स्वयं के राज्यों को परिभाषित करने की आवश्यकता है।
कृपया इस तरह से सोचें कि हम एंड्रॉइड से ईवेंट प्राप्त कर रहे हैं और हम राज्यों पर हमारे कॉल को परिभाषित करेंगे।
पर कॉल स्टेटस प्राप्त करने का तरीका यहां प्रसारण-रिसीवर की विधि phonestatelistener पंजीकृत किए बिना और अन्य जटिलताओं से बचने के तरीके पर है। कोड देखें

public class CallListening extends BroadcastReceiver { 
 
    static CustomPhoneStateListener customPhoneListener; 
 
    private static final String TAG ="broadcast_intent"; 
 
    public static String incoming_number; 
 
    private String current_state,previus_state,event; 
 
    public static Boolean dialog= false; 
 
    private Context context; 
 
    private SharedPreferences sp,sp1; 
 
    private SharedPreferences.Editor spEditor,spEditor1; 
 
    public void onReceive(Context context, Intent intent) { 
 
     //Log.d("intent_log", "Intent" + intent); 
 
     dialog=true; 
 
     this.context = context; 
 
     event = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
 
     incoming_number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
 
     Log.d(TAG, "The received event : "+event+", incoming_number : " + incoming_number); 
 
     previus_state = getCallState(context); 
 
     current_state = "IDLE"; 
 
     if(incoming_number!=null){ 
 
      updateIncomingNumber(incoming_number,context); 
 
     }else { 
 
      incoming_number=getIncomingNumber(context); 
 
     } 
 
     switch (event) { 
 
      case "RINGING": 
 
       Log.d(TAG, "State : Ringing, incoming_number : " + incoming_number); 
 
      if((previus_state.equals("IDLE")) || (previus_state.equals("FIRST_CALL_RINGING"))){ 
 
        current_state ="FIRST_CALL_RINGING"; 
 
       } 
 
       if((previus_state.equals("OFFHOOK"))||(previus_state.equals("SECOND_CALL_RINGING"))){ 
 
        current_state = "SECOND_CALL_RINGING"; 
 
       } 
 

 
       break; 
 
      case "OFFHOOK": 
 
       Log.d(TAG, "State : offhook, incoming_number : " + incoming_number); 
 
       if((previus_state.equals("IDLE")) ||(previus_state.equals("FIRST_CALL_RINGING")) || previus_state.equals("OFFHOOK")){ 
 
        current_state = "OFFHOOK"; 
 
       } 
 
       if(previus_state.equals("SECOND_CALL_RINGING")){ 
 
        current_state ="OFFHOOK"; 
 
        startDialog(context); 
 
       } 
 
       break; 
 
      case "IDLE": 
 
       Log.d(TAG, "State : idle and incoming_number : " + incoming_number); 
 
       if((previus_state.equals("OFFHOOK")) || (previus_state.equals("SECOND_CALL_RINGING")) || (previus_state.equals("IDLE"))){ 
 
        current_state="IDLE"; 
 
       } 
 
       if(previus_state.equals("FIRST_CALL_RINGING")){ 
 
        current_state = "IDLE"; 
 
        startDialog(context); 
 
       } 
 
       updateIncomingNumber("no_number",context); 
 
       Log.d(TAG,"stored incoming number flushed"); 
 
       break; 
 
     } 
 
     if(!current_state.equals(previus_state)){ 
 
      Log.d(TAG, "Updating state from "+previus_state +" to "+current_state); 
 
      updateCallState(current_state,context); 
 

 
     } 
 
    } 
 
    public void startDialog(Context context) { 
 
     Log.d(TAG,"Starting Dialog box"); 
 
     Intent intent1 = new Intent(context, NotifyHangup.class); 
 
     intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
 
     context.startActivity(intent1); 
 

 
    } 
 
    public void updateCallState(String state,Context context){ 
 
     sp = PreferenceManager.getDefaultSharedPreferences(context); 
 
     spEditor = sp.edit(); 
 
     spEditor.putString("call_state", state); 
 
     spEditor.commit(); 
 
     Log.d(TAG, "state updated"); 
 

 
    } 
 
    public void updateIncomingNumber(String inc_num,Context context){ 
 
     sp = PreferenceManager.getDefaultSharedPreferences(context); 
 
     spEditor = sp.edit(); 
 
     spEditor.putString("inc_num", inc_num); 
 
     spEditor.commit(); 
 
     Log.d(TAG, "incoming number updated"); 
 
    } 
 
    public String getCallState(Context context){ 
 
     sp1 = PreferenceManager.getDefaultSharedPreferences(context); 
 
     String st =sp1.getString("call_state", "IDLE"); 
 
     Log.d(TAG,"get previous state as :"+st); 
 
     return st; 
 
    } 
 
    public String getIncomingNumber(Context context){ 
 
     sp1 = PreferenceManager.getDefaultSharedPreferences(context); 
 
     String st =sp1.getString("inc_num", "no_num"); 
 
     Log.d(TAG,"get incoming number as :"+st); 
 
     return st; 
 
    } 
 
}

संबंधित मुद्दे