电话拦截问题
调用系统的服务,电话管理器去监听打电话的状态,当电话改变的时候去拦截电话
寻找API时候,挂断电话,调用系统的隐藏API,遇到问题怎么看方法和调用
04.安卓框架的在线源码
http://grepcode.com/ 看源码要用LInux去下载,搞不定
05.完整的源码环境
http://androidxref.com/ 可以找到源码
调用接口中的方法,通过调用远程服务实现,远程服务的方法又被隐藏了不能调用,用反射区调用方法,完成。
短信拦截
// 2. 电话拦截
// 1) 知道电话什么时候拨入
// 2) 通过代码去挂电话
mTm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
mCallListener = new CallListener();
// 注册电话的监听
mTm.listen(mCallListener, PhoneStateListener.LISTEN_CALL_STATE);
private class CallListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, final String incomingNumber) {
// * @see TelephonyManager#CALL_STATE_IDLE:闲置状态
// * @see TelephonyManager#CALL_STATE_RINGING:响铃状态
// * @see TelephonyManager#CALL_STATE_OFFHOOK:摘机状态,接听电话状态
// state
// incomingNumber:拨入的号码
if (state == TelephonyManager.CALL_STATE_RINGING) {
// 响铃时,正在拨入时
int type = mDao.findType(incomingNumber);
// 判断是否是被拦截的电话
if (type == BlackBean.TYPE_CALL || type == BlackBean.TYPE_ALL) {
// 通过代码去挂断电话
Log.d(TAG, "通过代码去挂断" + incomingNumber + "电话");
// TODO:
// 1) ITelephony 实例
// a. ITelephony.aidl添加到代码中--》ITelephony.java
ITelephony iTelephony = null;
// TelephonyManager.getITelephony()-->ITelephony
// 通过反射调用TelephonyManager.getITelephony()--->不可行的
// try {
// Method method = TelephonyManager.class
// .getDeclaredMethod("getITelephony");
// iTelephony = (ITelephony) method.invoke(mTm);
// } catch (Exception e) {
// e.printStackTrace();
// }
// ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
// IBinder ibinder = ServiceManager
// .getService(Context.TELEPHONY_SERVICE);
try {
Class<?> clazz = Class
.forName("android.os.ServiceManager");
Method method = clazz.getMethod("getService",
String.class);
IBinder ibinder = (IBinder) method.invoke(null,
Context.TELEPHONY_SERVICE);
iTelephony = ITelephony.Stub.asInterface(ibinder);
// 2) ITelephony.endCall();
iTelephony.endCall();// 异步操作
// // 通过线程睡一会
// Thread.sleep(300);
// 删除通话记录
final ContentResolver cr = getContentResolver();
final Uri url = CallLog.Calls.CONTENT_URI;
// content://calls
// content://calls/1/100
// notifyForDescendents: true
// -->url下面的任何分支发生改变,都会通知对应的observer
// fasle-->只通知当前的url
cr.registerContentObserver(url, true,
new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
String where = CallLog.Calls.NUMBER
+ "=?";
String[] selectionArgs = new String[] { incomingNumber };
cr.delete(url, where, selectionArgs);
// 注销
cr.unregisterContentObserver(this);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}