黑名单挂断电话及删除电话记录:
- 挂断电话
挂断电话需要申请权限android.permission.CALL_PHONE
对于黑名单号码的来电如何挂断,由于监听来电时在TelephonyManager
中进行监听的,在Android1.5
之前,
TelephonyManager
中有一个endCall()
方法能够直接挂断电话,但是后来谷歌工程师认为这样挂断电话是不安全的,所以就隐藏了这个方法。
挂断电话是Android中的一个远程服务,必须要拷贝系统的aidl文件,ITelephony.aidl,在自己的工程中新建一个包(com.android.internal.telephony)
然后将ITelephony.aidl放到这个包中,但是发现报错了,原因是还要再考一个aidl文件NeighboringCellInfo.aidl,
然后新建一个包(android.telephony)将这个aidl文件放入到这个包中。在程序中怎么使用呢?(这个ITelephony接口通常都是由TelephonyManager使用)一般都是在电话来电状态监听的时候监听到了响铃状态时就挂断电话,但是仍会在来电记录中有记录
/** * 挂断电话的方法. */ public void endCall(String incomingNumber) { try { // Object obj = getSystemService(TELEPHONY_SERVICE); // ITelephony iTelephony = ITelephony.Stub.asInterface((IBinder) // obj);这样写得到的是IBinder的一个代理对象,会报错,所以要用下面的反射而不能这样做 Method method = Class.forName("android.os.ServiceManager") .getMethod("getService", String.class);//getSystemService内部就是调用了ServiceManager的getService方法。 IBinder binder = (IBinder) method.invoke(null, new Object[] { TELEPHONY_SERVICE }); ITelephony iTelephony = ITelephony.Stub.asInterface(binder); iTelephony.endCall(); } catch (Exception e) { e.printStackTrace(); } }
- 删除电话记录
删除通话记录要申请权限android.permission.WRITE_CONTACTS
而且通话记录并不是在挂断电话后立即生成的,所以这里要对通话记录的内容提供者注册一个内容观察者,在内容观察者观察到内容变化的时候再删除其中的数据。public class CallSmsFirewallService extends Service { @Override public void onCreate() { tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); listener = new PhoneListener(); tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); super.onCreate(); } @Override public void onDestroy() { tm.listen(listener, PhoneStateListener.LISTEN_NONE);//服务关闭的时候就取消电话状态的监听 } private class PhoneListener extends PhoneStateListener { long startTime; @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_IDLE: // 空闲状态 break; case TelephonyManager.CALL_STATE_RINGING: String mode = dao.findMode(incomingNumber); if ("1".equals(mode) || "2".equals(mode)) { Log.i(TAG, "挂断电话..."); endCall(incomingNumber);// 呼叫记录不是立刻生成的 . // 注册一个呼叫记录内容变化的内容观察者. Uri uri = Uri.parse("content://call_log/calls"); getContentResolver().registerContentObserver(uri, true, new CallLogObserver(new Handler(), incomingNumber)); } break; } super.onCallStateChanged(state, incomingNumber); } } private class CallLogObserver extends ContentObserver { private String incomingNumber; public CallLogObserver(Handler handler, String incomingNumber) { super(handler); this.incomingNumber = incomingNumber; } // 当观察到数据发生改变的时候调用的方法. @Override public void onChange(boolean selfChange) { Log.i(TAG, "呼叫记录变化了."); deleteCallLog(incomingNumber); getContentResolver().unregisterContentObserver(this);//删除完通话记录之后就立马进行移除内容观察者 super.onChange(selfChange); } } /** * 挂断电话的方法. * * @param incomingNumber */ public void endCall(String incomingNumber) { try { // Object obj = getSystemService(TELEPHONY_SERVICE); // ITelephony iTelephony = ITelephony.Stub.asInterface((IBinder) // obj); Method method = Class.forName("android.os.ServiceManager") .getMethod("getService", String.class); IBinder binder = (IBinder) method.invoke(null, new Object[] { TELEPHONY_SERVICE }); ITelephony iTelephony = ITelephony.Stub.asInterface(binder); iTelephony.endCall(); } catch (Exception e) { e.printStackTrace(); } } /** * 移除呼叫记录 * * @param incomingNumber */ public void deleteCallLog(String incomingNumber) { Uri uri = Uri.parse("content://call_log/calls"); getContentResolver().delete(uri, "number=?", new String[] { incomingNumber }); } }