学习手机卫士的功能,做了个短信电话拦截的功能。
<span style="font-size:12px;">public class CallSmsSafeService extends Service {
private InnerSmsReceiver receiver;
private String TAG = "CallSmsSafeService";
private BlackNumberDao dao;
private TelephonyManager tm;
private MyListener mListener;
@Override
public IBinder onBind(Intent intent) {
return null;
}
private class InnerSmsReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG,"有短信来了");
//检查发件人是否所黑名单号码
Object [] objs=(Object[]) intent.getExtras().get("pdus");
for(Object obj:objs){
SmsMessage sms=SmsMessage.createFromPdu((byte[]) obj);
String sender=sms.getOriginatingAddress();
String mode=dao.findMode(sender);
if ("2".equals(mode) || "3".equals(mode)) {
Log.i(TAG,"拦截短信");
abortBroadcast();//屏蔽广播
}
}
}
}
@Override
public void onCreate() {
dao= new BlackNumberDao(getApplicationContext());
receiver= new InnerSmsReceiver();
IntentFilter filter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
registerReceiver(receiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));
tm=(TelephonyManager) getSystemService(TELEPHONY_SERVICE);
mListener=new MyListener();
tm.listen(mListener, PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
@Override
public void onDestroy() {
unregisterReceiver(receiver);
receiver=null;
super.onDestroy();
}
private class MyListener extends PhoneStateListener{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING: //零响状态
String result=dao.findMode(incomingNumber);
if ("1".equals(result) || "3".equals(result)) {
endCall();
}
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}
/**
* 挂断电话
*/
private void endCall()
{
try
{
//加载service的字节码
Class cla=CallSmsSafeService.class.getClassLoader().loadClass("android.os.ServiceManager");
Method method = cla.getDeclaredMethod("getService", String.class);
IBinder iBinder=(IBinder) method.invoke(null, TELEPHONY_SERVICE);
ITelephony.Stub.asInterface(iBinder).endCall();
}
catch (Exception e)
{
e.printStackTrace();
// Log.e(TAG, "Fail to answer ring call.", e);
}
}
}
</span>
endCall自从1.1之后被谷歌隐藏,必须新建package:com.android.internal.telephony,新建文件ITelephony.aidl 在文件里添加
<span style="font-size:12px;">package com.android.internal.telephony;
interface ITelephony{
boolean endCall();
void answerRingingCall();
} </span>
在gen目录下会出现com.android.internal.telephony,里面有ITelephony.java最后拦截电话需要权限CALL_PHONE
还有service必须在清单文件中注册,不要忘记
调用此服务即可拦截