2011-08-30 3 views
8

जब कोई कॉल समाप्त होता है, तो मैं कैसे सुनिश्चित कर सकता हूं कि कॉल जानकारी के बाद मैं कॉल लॉग से पूछताछ कर रहा हूं?एंड्रॉइड: कॉल लॉग इन करने के बाद इसे अपडेट किया गया है एक बार कॉल समाप्त होने के बाद

मैं BroadcastReceiver का उपयोग करके android.intent.action.PHONE_STATE पर एक इरादा-फ़िल्टर के साथ कॉल के अंत की तलाश में हूं, फोन को निष्क्रिय होने के लिए देख रहा हूं।

इस पर किसी भी मदद की सराहना की जाएगी।

धन्यवाद

उत्तर

8

यहां बहुत अच्छा जवाब है।

लिंक नीचे देखें

Click Here

आप उपरोक्त उदाहरण देखते हैं आप कैसे कॉल के अंत राज्य पाने के लिए और आप भी है कि कॉल समाप्त होने के बाद CALL_STATE_IDLE इच्छा एक बार से अधिक कॉल तो आप को ध्यान में रखना होगा सीखना होगा आदर्श स्थिति में काम करने से पहले आपको कुछ स्थिर चर लेना होगा और आपको उस वैरिएबल वैल्यू को देखना होगा।

संपादित

एंड्रॉयड स्टोर लॉग ऑन अपने इनबिल्ट डेटाबेस में जानकारी कहते हैं। तो बेहतर समाधान है कि जब अपने कोड कॉल OFFHOOKIDLE राज्य के बाद राज्य तो आप सभी कॉपी कर सकते हैं कॉल लॉग की जानकारी

आप का उपयोग इनबिल्ट डेटाबेस से कॉल-लॉग जानकारी को पुन: प्राप्त कर सकते हैं पाने के लिए हाल में अपने डाटाबेस के इनबिल्ट डेटाबेस से लॉग ऑन कहते हैं क्वेरी निम्नलिखित

Cursor c = context.getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI, null, null, null, null);

EDIT2

यहाँ पूरा उदाहरण है

यह PhoneStateListener वर्ग

public class CustomPhoneStateListener extends PhoneStateListener { 

Context context; 
public CustomPhoneStateListener(Context context) { 
super(); 
this.context = context; 
} 

@Override 
public void onCallStateChanged(int state, String incomingNumber) { 
super.onCallStateChanged(state, incomingNumber); 

switch (state) { 
    case TelephonyManager.CALL_STATE_IDLE: 
     // Toast.makeText(context, "CALL_STATE_IDLE", Toast.LENGTH_LONG).show(); 
     if(UDF.phoneState != TelephonyManager.CALL_STATE_IDLE) { 
      UDF.fetchNewCallLogs(context); 
     } 
     break; 
    case TelephonyManager.CALL_STATE_OFFHOOK: 
     //Toast.makeText(context, "CALL_STATE_OFFHOOK", Toast.LENGTH_LONG).show(); 
     break; 
    case TelephonyManager.CALL_STATE_RINGING: 
     //Toast.makeText(context, "CALL_STATE_RINGING", Toast.LENGTH_LONG).show(); 
     endCallIfBlocked(incomingNumber); 
     break; 

    default: 
     break; 
} 
UDF.phoneState = state; 
} 

यह प्रसारित किया जाता है रिसीवर वर्ग है

public class PhoneStateBroadcastReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //UDF.createTablesIfNotExists(context); 
     TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
     telephonyManager.listen(new CustomPhoneStateListener(context), PhoneStateListener.LISTEN_CALL_STATE); 
    } 
} 

यह आंतरिक डेटाबेस से नया कॉल लॉग प्राप्त करने के लिए समारोह है

public static void fetchNewCallLogs(Context context) { 

     CallLogHelper callLogHelper = new CallLogHelper(context); 
     callLogHelper.open(); 
     Long maxId = callLogHelper.getMaxId(); 

     Cursor c = context.getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI, null, "_id > ?", new String[]{String.valueOf(maxId)}, null); 
     if(c != null && c.moveToFirst()) { 
      while (c.isAfterLast() == false) { 
       int _ID = c.getColumnIndex(android.provider.CallLog.Calls._ID); 
       int _NUMBER = c.getColumnIndex(android.provider.CallLog.Calls.NUMBER); 
       int _DATE = c.getColumnIndex(android.provider.CallLog.Calls.DATE); 
       int _DURATION = c.getColumnIndex(android.provider.CallLog.Calls.DURATION); 
       int _CALLTYPE = c.getColumnIndex(android.provider.CallLog.Calls.TYPE); 
       int _NAME = c.getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME); 
       int _NUMBERTYPE = c.getColumnIndex(android.provider.CallLog.Calls.CACHED_NUMBER_TYPE); 
       int _NEW = c.getColumnIndex(android.provider.CallLog.Calls.NEW); 

       String id = c.getString(_ID); 
       String number = c.getString(_NUMBER); 
       String date = c.getString(_DATE); 
       String duration = c.getString(_DURATION); 
       String callType = c.getString(_CALLTYPE); 
       String name = c.getString(_NAME); 
       String numberType = c.getString(_NUMBERTYPE); 
       String _new = c.getString(_NEW); 

       callLogHelper.createLog(id, number, date, duration, callType, name, numberType, _new, "N"); 

       c.moveToNext(); 
      } 
     } 
     callLogHelper.close(); 
    } 


**Where** 


=> CallLogHelper is a helper class to communicate with my local database 
    => callLogHelper.getMaxId(); will returns the maximum id of call logs in my local database and I am keeping the id in local database and internal database will be same 
    => callLogHelper.createLog() is my function to insert call log in my local database 

इस मैनिफ़ेस्ट फ़ाइल

<receiver android:name=".PhoneStateBroadcastReceiver"> 
<intent-filter> 
    <action android:name="android.intent.action.PHONE_STATE"/>  
</intent-filter> 
</receiver> 
+0

आपकी प्रतिक्रिया के लिए धन्यवाद है। 'PhoneStateListener' से आप 'CallLog.Calls.CONTENT_URI'' से कैसे पूछेंगे? क्या यह समाधान उस स्थिति की स्थिति को संबोधित करता है जो फ़ोन स्थिति में परिवर्तन के बाद 'CallLog.Calls.CONTENT_URI' से पूछताछ करते समय आम तौर पर प्रस्तुत किया जाता है? – gnub

+0

मैंने अपना जवाब संपादित किया था आप इसे देख सकते हैं – Dharmendra

+4

सही।मेरी समस्या यह है कि कभी-कभी 'ब्रॉडकास्ट रिसीवर' कॉललॉग से पहले आग लग जाती है, इसलिए जब आप 'android.provider.CallLog.Calls.CONTENT_URI' से पूछते हैं, तो आप सबसे हालिया कॉल खो रहे हैं। – gnub