Похоже, что нет способа помешать системе записать телефонный звонок в журнал звонков.Поэтому мы должны удалить его из журнала вызовов.Проблема заключается в том, что запись добавляется в журнал вызовов спустя долгое время после того, как телефонный звонок был прерван, и мы не видим ее в базе данных, когда используем метод onReceive приемника вещания.
Послемного исследований и испытаний, я придумал это простое решение.Я заставляю поток спать в течение 2 секунд перед его удалением.
Вот код:
@Override
public void onReceive(Context context, Intent intent) {
Log.i(LOG_TAG, "Début InComingCallReceiver.onReceive");
Log.i(LOG_TAG, "IS ORDERED = " + this.isOrderedBroadcast());
Bundle extras = intent.getExtras();
if (extras != null) {
String state = extras.getString(TelephonyManager.EXTRA_STATE);
Log.i(LOG_TAG, state);
String phoneNumber = extras.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.i(LOG_TAG, phoneNumber);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
if (phoneNumber.contains(PHONE_FILTER)) {
Log.i(LOG_TAG, "Cancelling the incoming call");
TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
try {
Class c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony) m.invoke(telephony);
telephonyService.silenceRinger();
telephonyService.endCall();
}
catch (Exception e) {
Log.e(LOG_TAG,"Exception in InComingCallReceiver.onReceive");
Log.e(LOG_TAG,"ERROR: " + e.toString() + " Message: " + e.getMessage() + " --- " + e.getLocalizedMessage() + " Cause: " + e.getCause() + " StackTrace: " + e.getStackTrace());
}
}
}
else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
if (phoneNumber.contains(PHONE_FILTER)) {
Log.i(LOG_TAG, "Waiting 2sec");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i(LOG_TAG, "After Waiting 2sec");
Log.i(LOG_TAG, "Deleting the incoming call from call log");
int nbRowDeleted = context.getContentResolver().delete(CallLog.Calls.CONTENT_URI, CallLog.Calls.NUMBER + " = ?", new String[] {phoneNumber});
Log.i(LOG_TAG, nbRowDeleted + " Row(s) Deleted");
}
}
}
}