2011-08-30 96 views

回答

8

这是非常非常好的答案。

见下面链接

Click Here

当你看到上面的例子,您将学习如何获得受理的最终状态,你也会记住,通话结束后CALL_STATE_IDLE会调用不止一次,所以你必须在某个地方使用一个静态变量,并且在理想状态下工作之前必须检查该变量值。

编辑

的Android商店通话记录在其内置的数据库信息。 所以更好的解决办法是,当你的代码调用后IDLE状态OFFHOOK状态,那么您可以复制所有新调用的内置数据库登录到数据库,为获得

可以使用检索从内置的数据库调用日志信息,通话记录的信息下面的查询

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

正确。我遇到的问题是,有时在CallLog更新之前触发'BroadCastReceiver',所以当你查询'android.provider.CallLog.Calls.CONTENT_URI'时,你错过了最近的调用。 – gnub