2

私はいくつかの電話をブロックするアプリケーションを書いています。ブロードキャストレシーバーを使用して、着信コールをリッスンします。

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

通話は完全にキャンセルされますが、通話ログに表示されます。

キャンセルした後、通話が通話記録に記録されないようにする方法はありますか?

そうでない場合、プログラムでログから削除するにはどうすればよいですか?

4

2 に答える 2

3

システムが通話ログに通話を記録するのを防ぐ方法はないようです。したがって、コールログから削除する必要があります。問題は、電話が切られてからかなり経ってからエントリが通話ログに追加され、ブロードキャストレシーバーの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");
            }
        }
    }
}
于 2011-11-23T17:25:15.543 に答える
0

通話が通話履歴に表示されないようにすることはできないと思います。通話がログに追加されないようにする代わりに、通話ログを開いて削除してみてください。

于 2011-11-21T18:56:12.487 に答える