1 importandroid.app.Service;2 importandroid.content.Context;3 importandroid.content.Intent;4 importandroid.media.AudioManager;5 importandroid.os.Handler;6 importandroid.os.IBinder;7 importandroid.os.Message;8 importandroid.os.RemoteException;9 importandroid.telephony.PhoneStateListener;10 importandroid.telephony.SmsManager;11 importandroid.telephony.TelephonyManager;12 importandroid.text.TextUtils;13 importandroid.util.Log;14
15 importcom.android.internal.telephony.ITelephony;16
17 importjava.lang.reflect.InvocationTargetException;18 importjava.lang.reflect.Method;19 importjava.util.List;20
21 public class PhoneHangUpService extendsService {22 private static final String TAG = "PhoneHangUpService";23 private static final int MSG_DELETE_CALL_LOG = 1;24
25 privateMyPhoneStateListener mPhoneStateListener;26 privateTelephonyManager mTelephonyManager;27 privateContext context;28 publicAudioManager am ;29 private Handler mHandler = newHandler() {30 @Override31 public voiddispatchMessage(Message msg) {32 switch(msg.what) {33 caseMSG_DELETE_CALL_LOG:34 String number =(String) msg.obj;35 //
36 break;37 }38 }39
40 };41
42 @Override43 public voidonCreate() {44 super.onCreate();45 Log.i(TAG, "onCreate");46 context = this;47 //声明监听类,在监听类中实现具体处理
48 mPhoneStateListener = newMyPhoneStateListener();49 mTelephonyManager =(TelephonyManager) getSystemService(Service.TELEPHONY_SERVICE);50 mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);51
52 am =(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);53 }54
55 @Override56 public voidonDestroy() {57 super.onDestroy();58 mTelephonyManager.listen(mPhoneStateListener, 0);59 }60
61 @Override62 public int onStartCommand(Intent intent, int flags, intstartId) {63 return super.onStartCommand(intent, flags, startId);64 }65
66 @Override67 publicIBinder onBind(Intent intent) {68 return null;69 }70
71 //挂断电话方法
72 private booleanhangUp() {73 Class c = TelephonyManager.class;74 ITelephony iTelephony = null;75 Method getITelephonyMethod = null;76 try{77 getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);78 getITelephonyMethod.setAccessible(true);79 } catch(SecurityException e) {80 e.printStackTrace();81 } catch(NoSuchMethodException e) {82 e.printStackTrace();83 }84 try{85 iTelephony =(ITelephony)86 getITelephonyMethod.invoke(mTelephonyManager, (Object[]) null);87 } catch(IllegalArgumentException e) {88 e.printStackTrace();89 } catch(IllegalAccessException e) {90 e.printStackTrace();91 } catch(InvocationTargetException e) {92 e.printStackTrace();93 }94 if (iTelephony != null) {95 boolean isSuccess = false;96 try{97 isSuccess =iTelephony.endCall();98 am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//恢复会普通模式,恢复声音
99
100 } catch(RemoteException e) {101 e.printStackTrace();102 }103 returnisSuccess;104 }105 return true;106 }107
108 //监听类,监听来电
109 private final class MyPhoneStateListener extendsandroid.telephony.PhoneStateListener {110 @Override111 public void onCallStateChanged(intstate, String incomingNumber) {112 super.onCallStateChanged(state, incomingNumber);113 Log.i(TAG, "zjq Number:" +incomingNumber);114 if (TelephonyManager.CALL_STATE_RINGING ==state) {115 Log.i(TAG, "zhangjieqiong state:CALL_STATE_RINGING:" +incomingNumber);116 if (!TextUtils.isEmpty(incomingNumber) &&PhoneUtils.isPhoneNumber(incomingNumber)) {117 //拒接电话 当号码为135*****182时拒接
118 if ("135*****182".equals(incomingNumber)) {119 am.setRingerMode(AudioManager.RINGER_MODE_SILENT);//设置为静音模式,解决延迟导致的响铃问题
120 Log.i(TAG, "zjq:the number is endcallnumber:"+incomingNumber);121 if(hangUp()) {122 Log.i(TAG, "zjq end call success ");123 Message msg =mHandler.obtainMessage(MSG_DELETE_CALL_LOG);124 msg.obj =incomingNumber;125 mHandler.sendMessageDelayed(msg, 2000);126 //发送一条短信,提示拒接成功
127 handleSetSystemParamSms(incomingNumber, incomingNumber +" endcall success");128 }129 }130 }131 }else if(TelephonyManager.CALL_STATE_IDLE ==state){132 //挂断133 //挂断电话可以在这里处理
134 Log.i(TAG, "zjq state: hang up(endcall)");135 }else if(TelephonyManager.CALL_STATE_OFFHOOK ==state){136 //接听
137 Log.i(TAG, "zjq state: answer:"+incomingNumber);138 }139 }140
141 }142
143
144 //发送短信方法
145 private voidhandleSetSystemParamSms(String phone, String body) {146 Log.d(TAG, "user get location");147 String msg =body ;148 if (msg != null) {149 Log.d(TAG, "msgBody lenth = " +msg.length());150 SmsManager sms =SmsManager.getDefault();151 List texts =sms.divideMessage(msg);152 for(String text : texts) {153 Log.d(TAG, "zjq send sms to:" +phone);154 sms.sendTextMessage(phone, null, text, null, null);155 }156 }157 }158 }