как остановить телефонные звонки чтобы войти в журнал звонков на андроид - PullRequest
2 голосов
/ 21 ноября 2011

Я пишу приложение, которое блокирует некоторые телефонные звонки.Я использую широковещательный приемник для прослушивания входящих вызовов:

<receiver android:name="InComingCallReceiver">
<intent-filter android:priority="100">
    <action android:name="android.intent.action.PHONE_STATE"></action>
</intent-filter>
</receiver>

И я отменил вызовы, которые не хочу:

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());
}

Вызов отменен, но он отображаетсяжурнал звонков.

Есть ли способ предотвратить ведение журнала звонков в журнале звонков после того, как я его отменил?

Если нет, то как можно программно удалить из журнала?

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011

Похоже, что нет способа помешать системе записать телефонный звонок в журнал звонков.Поэтому мы должны удалить его из журнала вызовов.Проблема заключается в том, что запись добавляется в журнал вызовов спустя долгое время после того, как телефонный звонок был прерван, и мы не видим ее в базе данных, когда используем метод 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");
            }
        }
    }
}
0 голосов
/ 21 ноября 2011

Я сомневаюсь, что вы можете предотвратить отображение вызова в журнале вызовов. Вместо того, чтобы запретить добавление вызова в журнал, попробуйте открыть журнал вызовов и удалить его.

...