2011-08-30 74 views
8

Khi cuộc gọi kết thúc, làm cách nào để đảm bảo rằng tôi đang truy vấn Nhật ký Cuộc gọi sau khi thông tin cuộc gọi được ghi vào cơ sở dữ liệu?Android: Truy vấn Nhật ký Cuộc gọi Sau khi Cuộc gọi Kết thúc

Tôi đang tìm kết thúc cuộc gọi bằng cách sử dụng BroadcastReceiver với bộ lọc ý định trên android.intent.action.PHONE_STATE, tìm điện thoại ở chế độ chờ.

Bất kỳ trợ giúp nào về điều này sẽ được đánh giá cao.

Cảm ơn

Trả lời

8

Đâ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> 
+0

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

+0

Tôi đã chỉnh sửa câu trả lời của mình, bạn có thể kiểm tra nó – Dharmendra

+4

Đú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

Các vấn đề liên quan