屏蔽短信(广播)和电话(监听和反射)


1.开启服务后,自动监听短信和电话,查询黑名单数据库,如果需要拦截就拦截。

2.内部类,短信广播类和电话监听的类都是内部类

package com.example.mobilesafe.service;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


import com.android.internal.telephony.ITelephony;
import com.example.mobilesafe.db.dao.blackNumberDao;


import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.util.Log;


public class blackNumberService extends Service {


	private smsReceiver smsReceiver;
	private TelephonyManager tm;
	private myPhoneStateListener mpsl;


	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}


	@Override
	public void onCreate() {
		// 注册广播接受者,屏蔽短信
		IntentFilter ifr = new IntentFilter();
		ifr.addAction("android.provider.Telephony.SMS_RECEIVED");
		ifr.setPriority(1000);
		smsReceiver = new smsReceiver();
		registerReceiver(smsReceiver, ifr);


		// 屏蔽通话
		abordPhone();
		super.onCreate();
	}


	/**
	 * 屏蔽通话
	 */
	private void abordPhone() {
		// 得到电话管理者
		tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
		// 监听通话
		mpsl = new myPhoneStateListener();
		tm.listen(mpsl, PhoneStateListener.LISTEN_CALL_STATE);
	}


	private class myPhoneStateListener extends PhoneStateListener {
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			switch (state) {
			case TelephonyManager.CALL_STATE_IDLE:


				break;
			case TelephonyManager.CALL_STATE_OFFHOOK:


				break;
			case TelephonyManager.CALL_STATE_RINGING:
				blackNumberDao dao = blackNumberDao
						.getInstence(getApplicationContext());
				// 得到电话是否在黑名单中,不在返回0,在黑名单中,返回屏蔽类型
				int mode = dao.getMode(incomingNumber);
				Log.d("来电mode", "" + mode);
				// 判断是否需要屏蔽电话
				if (mode == 2 || mode == 3) {
					endCall();
				}
				break;


			default:
				break;
			}
			super.onCallStateChanged(state, incomingNumber);
		}
	}


	@Override
	public void onDestroy() {
		if (smsReceiver != null)
			unregisterReceiver(smsReceiver);
		super.onDestroy();
	}


	public void endCall() {
		// ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
		try {
			// 通过反射得到关闭通话的方法
			// 1,获取ServiceManager字节码文件
			Class<?> sm = Class.forName("android.os.ServiceManager");
			// 2,获取方法
			Method method = sm.getMethod("getService", String.class);
			// 3,反射调用此方法
			IBinder iBinder = (IBinder) method.invoke(null,
					Context.TELEPHONY_SERVICE);
			// 4,调用获取aidl文件对象方法
			ITelephony telephony = ITelephony.Stub.asInterface(iBinder);
			// 5,调用在aidl中隐藏的endCall方法
			telephony.endCall();


		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


	private class smsReceiver extends BroadcastReceiver {


		public void onReceive(Context context, Intent intent) {
			// 收到短信就会运行这个方法
			// 得到短信


			Object[] objects = (Object[]) intent.getExtras().get("pdus");


			for (Object pdu : objects) {


				SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);


				String body = smsMessage.getMessageBody();
				// 得到电话号码
				String address = smsMessage.getOriginatingAddress();


				blackNumberDao dao = blackNumberDao
						.getInstence(getApplicationContext());
				// 得到电话是否在黑名单中,不在返回0,在黑名单中,返回屏蔽类型
				int mode = dao.getMode(address);
				// 判断是屏蔽短信
				if (mode == 1 || mode == 3) {
					// 结束这个系统有序短信广播,屏蔽短信
					abortBroadcast();
				}


			}


		}


	}
}

猜你喜欢

转载自blog.csdn.net/sinat_40387150/article/details/80889116