Android中监听电话接听拨打、收发短信的实例

电话短信黑名单所用到的代码片及扩展段记录

黑名单电话拦截功能

通过TelephonyManager实现监听电话的状态进行拦截操作
代码片段:
	private PhoneStateListener listener = new PhoneStateListener() {

		@Override
		public void onCallStateChanged(int state, final String incomingNumber) {
			super.onCallStateChanged(state, incomingNumber);
			//监听响铃状态
<span style="white-space:pre">			</span>//同时还可以监听到其他的状态
			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() 方法即可
所需权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
代码片段:
	//监听接收短信的广播接收器
	private class BlackListSMSReceiver extends BroadcastReceiver {

		private String number;
		private String content;

		@Override
		public 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);
					
				}
			}
			
		}
		
	}
注册广播的代码:
<span style="white-space:pre">		</span>bsr = new BlackListSMSReceiver();
<span style="white-space:pre">		</span>IntentFilter filter = new IntentFilter();
<span style="white-space:pre">		</span>//接收短信相应的action
		filter.addAction("android.provider.Telephony.SMS_RECEIVED");
<span style="white-space:pre">		</span>//设置广播的优先级为最高
		filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
		registerReceiver(bsr, filter);

扩展1:监听手机拨打电话

制作归属地显示功能所用到
所需权限:
<!-- 监听去电的权限 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
代码片段:
<pre name="code" class="java">	private class CallReceiver extends BroadcastReceiver {

		@Override
		public 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);
		}
	}
 
  
注册广播代码(采用动态注册):
<span style="white-space:pre">		</span>callReceiver = new CallReceiver();
		IntentFilter filter = new IntentFilter();
		//打电话的action
		filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
		registerReceiver(callReceiver, filter);

扩展2:手机发送短信功能

简单实现:
不适合较长的短信,长短信需要分段发送,具体参考 SmsManager的Api 
<span style="white-space:pre">				</span>//发送短信
				SmsManager sm = SmsManager.getDefault();
				sm.sendTextMessage(safe_num, null, "your Telephone ... ", null, null);











  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值