您的位置:首页 > 移动开发 > Android开发

android黑名单挂断电话(endCall)反射方法获取

2016-06-04 17:40 465 查看
由于保证手机安全性,挂断电话的endcall方法被隐藏了。但是我们可以通过java反射机制获得此方法去拦截电话,下面代码为拦截电话片段代码。请参阅

//获取到系统的电话服务
TelephonyManager  tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
MyPhoneStateListener listener = new MyPhoneStateListener();
//设置监听
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
private class MyPhoneStateListener extends PhoneStateListener {
//电话状态改变的监听
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
//            * @see TelephonyManager#CALL_STATE_IDLE  电话闲置
//            * @see TelephonyManager#CALL_STATE_RINGING 电话铃响的状态
//            * @see TelephonyManager#CALL_STATE_OFFHOOK 电话接通
switch (state){
//电话铃响的状态
case TelephonyManager.CALL_STATE_RINGING:

String mode = dao.findNumber(incomingNumber);
/**
* 黑名单拦截模式
* 1 全部拦截 电话拦截 + 短信拦截
* 2 电话拦截
* 3 短信拦截
*/
if(mode.equals("1")|| mode.equals("2")){
System.out.println("挂断黑名单电话号码");

Uri uri = Uri.parse("content://call_log/calls");

getContentResolver().registerContentObserver(uri,true,new MyContentObserver(new Handler(),incomingNumber));

//挂断电话
endCall();

}
break;
}
}
}
/**
* 挂断电话(通过反射机制获得隐藏的endCall方法)
*/
private void endCall() {

try {
//通过类加载器加载ServiceManager
Class<?> clazz = getClassLoader().loadClass("android.os.ServiceManager");
//通过反射得到当前的方法
Method method = clazz.getDeclaredMethod("getService", String.class);

IBinder iBinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);

ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);

iTelephony.endCall();

} catch (Exception e) {
e.printStackTrace();
}

}


 * 挂断电话(通过反射机制获得隐藏的endCall方法) 

     */  

    private void endCall() {  

  

        try {  

            //通过类加载器加载ServiceManager  

            Class<?> clazz = getClassLoader().loadClass("android.os.ServiceManager");  

            //通过反射得到当前的方法  

            Method method = clazz.getDeclaredMethod("getService", String.class);  

  

            IBinder iBinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);  

  

            ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);  

  

            iTelephony.endCall();  

  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

  

    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息