当呼叫结束时,如何确保在呼叫信息写入数据库后查询呼叫记录?Android:询问呼叫记录后,呼叫记录更新一次呼叫结束后
我正在通过使用BroadcastReceiver
和android.intent.action.PHONE_STATE
上的意向过滤器寻找电话结束,寻找手机闲置。
任何帮助,将不胜感激。
谢谢
当呼叫结束时,如何确保在呼叫信息写入数据库后查询呼叫记录?Android:询问呼叫记录后,呼叫记录更新一次呼叫结束后
我正在通过使用BroadcastReceiver
和android.intent.action.PHONE_STATE
上的意向过滤器寻找电话结束,寻找手机闲置。
任何帮助,将不胜感激。
谢谢
这是非常非常好的答案。
见下面链接
当你看到上面的例子,您将学习如何获得受理的最终状态,你也会记住,通话结束后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>
谢谢您的答复。你将如何查询'PhoneStateListener'中的'CallLog.Calls.CONTENT_URI'?此解决方案是否解决了在电话状态更改后查询'CallLog.Calls.CONTENT_URI'时通常出现的争用情况? – gnub
我编辑了我的答案,您可以检查它 – Dharmendra
正确。我遇到的问题是,有时在CallLog更新之前触发'BroadCastReceiver',所以当你查询'android.provider.CallLog.Calls.CONTENT_URI'时,你错过了最近的调用。 – gnub