Android中监听电话接听拨打、收发短信的实例
电话短信黑名单所用到的代码片及扩展段记录
黑名单电话拦截功能
通过TelephonyManager实现监听电话的状态进行拦截操作代码片段:
private PhoneStateListener listener = new PhoneStateListener() {@Overridepublic void onCallStateChanged(int state, final String incomingNumber) {super.onCallStateChanged(state, incomingNumber);//监听响铃状态 //同时还可以监听到其他的状态if(TelephonyManager.CALL_STATE_RINGING == state) {int type = dao.getType(incomingNumber);//如果判断是拦截状态if(type == BlackListConstant.TYPE_ALL || type == BlackListConstant.TYPE_NUMBER) {Log.i("tag", "拦截电话"); //拦截电话并挂断 挂断电话的方法被隐藏了 需要通过aidl调用
// private ITelephony getITelephony() {
// return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
// }//通过反射加载ServiceManager类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 asInterface = ITelephony.Stub.asInterface(iBinder);//挂断电话asInterface.endCall();//添加到拦截数据库中BlackListSmsItem item = new BlackListSmsItem();item.number = incomingNumber;String format = new SimpleDateFormat("yy年MM日dd hh:mm:ss").format(new Date());item.date = format;new BlackListDao(BlackListReceiveService.this).setSmsRecord(item);} catch (Exception e) {e.printStackTrace();}final ContentResolver contentResolver = getContentResolver();final Uri url = CallLog.Calls.CONTENT_URI;//注册一个内容观察者//参数二:true,如果当前URL是content://call_log/calls/xxx/xxx,也进行一个观察//参数二:false ,只对content://call_log/calls这个uri进行观察contentResolver.registerContentObserver(url, true, new ContentObserver(new Handler()) {//只要对应的数据修改了,那该方法就会被回调public void onChange(boolean selfChange) {String where = CallLog.Calls.NUMBER + " = ?";String[] selectionArgs = new String []{incomingNumber};contentResolver.delete(url, where, selectionArgs);};});}}}};获取TelephonyManager及注册监听
tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); 黑名单短信拦截功能
通过Broadcast及相应的action可以监听到手机接收到短信的状态,该功能若有开关应当在Service中动态注册广播,开关时只需要执行Service的start()、stop() 方法即可 所需权限:代码片段: //监听接收短信的广播接收器private class BlackListSMSReceiver extends BroadcastReceiver {private String number;private String content;@Overridepublic void onReceive(Context context, Intent intent) {Bundle extras = intent.getExtras();Object[] object = (Object[])extras.get("pdus");for(Object obj : object) {SmsMessage sms = SmsMessage.createFromPdu((byte[])obj);number = sms.getOriginatingAddress();content = sms.getMessageBody();//通过数据库查询该手机的拦截类型int type = dao.getType(number);//如果是拦截的号码进行拦截if(type == BlackListConstant.TYPE_ALL || type == BlackListConstant.TYPE_MESSAGE) {//广播中断abortBroadcast();//添加到拦截数据库中BlackListSmsItem item = new BlackListSmsItem();item.number = number;item.content = content;String format = new SimpleDateFormat("yy年MM日dd hh:mm:ss").format(new Date());item.date = format;new BlackListDao(context).setSmsRecord(item);}}}}注册广播的代码: bsr = new BlackListSMSReceiver();
IntentFilter filter = new IntentFilter(); //接收短信相应的actionfilter.addAction("android.provider.Telephony.SMS_RECEIVED"); //设置广播的优先级为最高filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);registerReceiver(bsr, filter); 扩展1:监听手机拨打电话
制作归属地显示功能所用到 所需权限:
代码片段: private class CallReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.i("tag", "拦截成功");//获取拨打电话的手机号码String phone_number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);String location = LocationDao.getLocation(LocationService.this, phone_number);Log.i("tag",location);//弹出吐司//Toast.makeText(LocationService.this, location, Toast.LENGTH_SHORT).show();locationToast.show(location);}} 注册广播代码(采用动态注册): callReceiver = new CallReceiver();IntentFilter filter = new IntentFilter();//打电话的actionfilter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);registerReceiver(callReceiver, filter); 扩展2:手机发送短信功能
简单实现: 不适合较长的短信,长短信需要分段发送,具体参考 SmsManager的Api //发送短信SmsManager sm = SmsManager.getDefault();sm.sendTextMessage(safe_num, null, "your Telephone ... ", null, null); 本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
