Đây là câu trả lời rất hay.
Xem bên dưới liên kết
Click Here
Khi bạn nhìn thấy ở trên Ví dụ, bạn sẽ tìm hiểu làm thế nào để kết thúc trạng thái cuộc gọi và bạn cũng sẽ ghi nhớ rằng sau khi cuộc gọi kết thúc CALL_STATE_IDLE
sẽ gọi nhiều hơn một lần, do đó bạn phải mất một biến tĩnh ở một số nơi và bạn phải kiểm tra giá trị biến đó trước khi bạn làm việc ở trạng thái lý tưởng.
EDIT
cửa hàng Android gọi thông tin trong cơ sở dữ liệu sẵn có của nó đăng nhập. giải pháp Vì vậy, tốt hơn là khi mã nguồn gọi IDLE
nhà nước sau khi OFFHOOK
nhà nước sau đó bạn có thể sao chép tất cả mới nhật ký cuộc gọi từ cơ sở dữ liệu sẵn có cơ sở dữ liệu của bạn cho thu thập thông tin của nhật ký cuộc gọi
Bạn có thể lấy call-log thông tin từ cơ sở dữ liệu sẵn có sử dụng sau truy vấn
Cursor c = context.getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI, null, null, null, null);
EDIT2
Dưới đây là hoàn dụ
Đây là PhoneStateListener lớp
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;
}
này được phát sóng nhận lớp
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);
}
}
Đây là chức năng cho được các bản ghi cuộc gọi mới từ cơ sở dữ liệu nội bộ
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
Đây là file manifest
<receiver android:name=".PhoneStateBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
Cảm ơn bạn đã trả lời của bạn. Làm thế nào bạn sẽ truy vấn 'CallLog.Calls.CONTENT_URI' từ' PhoneStateListener'? Giải pháp này có giải quyết được điều kiện chủng tộc thường được trình bày khi truy vấn 'CallLog.Calls.CONTENT_URI' sau khi trạng thái điện thoại thay đổi không? – gnub
Tôi đã chỉnh sửa câu trả lời của mình, bạn có thể kiểm tra nó – Dharmendra
Đúng.Vấn đề tôi gặp phải là đôi khi vụ cháy 'BroadCastReceiver' trước khi CallLog được cập nhật, vì vậy khi bạn truy vấn' android.provider.CallLog.Calls.CONTENT_URI', bạn đang thiếu cuộc gọi gần đây nhất. – gnub