电话短信黑名单所用到的代码片及扩展段记录
黑名单电话拦截功能
通过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);