यहां बहुत अच्छा जवाब है।
लिंक नीचे देखें
Click Here
आप उपरोक्त उदाहरण देखते हैं आप कैसे कॉल के अंत राज्य पाने के लिए और आप भी है कि कॉल समाप्त होने के बाद CALL_STATE_IDLE
इच्छा एक बार से अधिक कॉल तो आप को ध्यान में रखना होगा सीखना होगा आदर्श स्थिति में काम करने से पहले आपको कुछ स्थिर चर लेना होगा और आपको उस वैरिएबल वैल्यू को देखना होगा।
संपादित
एंड्रॉयड स्टोर लॉग ऑन अपने इनबिल्ट डेटाबेस में जानकारी कहते हैं। तो बेहतर समाधान है कि जब अपने कोड कॉल OFFHOOK
IDLE
राज्य के बाद राज्य तो आप सभी कॉपी कर सकते हैं कॉल लॉग की जानकारी
आप का उपयोग इनबिल्ट डेटाबेस से कॉल-लॉग जानकारी को पुन: प्राप्त कर सकते हैं पाने के लिए हाल में अपने डाटाबेस के इनबिल्ट डेटाबेस से लॉग ऑन कहते हैं क्वेरी निम्नलिखित
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>
आपकी प्रतिक्रिया के लिए धन्यवाद है। 'PhoneStateListener' से आप 'CallLog.Calls.CONTENT_URI'' से कैसे पूछेंगे? क्या यह समाधान उस स्थिति की स्थिति को संबोधित करता है जो फ़ोन स्थिति में परिवर्तन के बाद 'CallLog.Calls.CONTENT_URI' से पूछताछ करते समय आम तौर पर प्रस्तुत किया जाता है? – gnub
मैंने अपना जवाब संपादित किया था आप इसे देख सकते हैं – Dharmendra
सही।मेरी समस्या यह है कि कभी-कभी 'ब्रॉडकास्ट रिसीवर' कॉललॉग से पहले आग लग जाती है, इसलिए जब आप 'android.provider.CallLog.Calls.CONTENT_URI' से पूछते हैं, तो आप सबसे हालिया कॉल खो रहे हैं। – gnub