Вот очень очень хороший ответ.
См. Ссылку ниже
Нажмите здесь
Когда вы увидите пример выше, вы узнаете, какполучите конечное состояние вызова, и вы также будете иметь в виду, что после завершения вызова CALL_STATE_IDLE
будет вызывать несколько раз, поэтому вам нужно взять одну статическую переменную в некотором месте, и вы должны проверить значение этой переменной, прежде чем работать в идеальном состоянии.
EDIT
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>