河北科技学院13届本科生毕业论文(设计)
} }
abortBroadcast(); }
5.2 通信卫士功能的实现
5.2.1 添加及删除黑名单号码 1、关键代码
// 添加黑名单号码的方法
public void addBlackNumber(View view) {
AlertDialog.Builder builder = new Builder(CallSmsSafeActivity.this); View contentView = View.inflate(CallSmsSafeActivity.this, R.layout.call_sms_add, null); builder.setView(contentView); // 获取显示界面中的相关元素
et_add_number = (EditText) contentView
.findViewById(R.id.et_call_sms_add_number); cb_add_phone = (CheckBox) contentView
.findViewById(R.id.cb_call_sms_add_phone); cb_add_sms = (CheckBox) contentView
.findViewById(R.id.cb_call_sms_add_sms);
bt_ok = (Button) contentView.findViewById(R.id.bt_call_sms_add_ok); bt_cancel = (Button) contentView
.findViewById(R.id.bt_call_sms_add_cancel); // 获取对话框勾选的状态码
// 为确定按钮添加点击事件
bt_ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// 获取用户在文本编辑框中输入的黑名单的号码
blackNumber = et_add_number.getText().toString().trim(); // 首先先判断用户是否已经输入黑名单号码 if (TextUtils.isEmpty(blackNumber)) {
Toast.makeText(CallSmsSafeActivity.this, \号码不能为空!\ .show(); } else {
// 如果用户选择拦截电话,mode的值为0 if (cb_add_phone.isChecked()) { mode = 0; }
// 如果用户选择拦截短信,mode的值为1 if (cb_add_sms.isChecked()) { mode = 1; }
if (cb_add_phone.isChecked() && cb_add_sms.isChecked()) { mode = 2; }
// 如果用户没有选择勾选状态,提示用户勾选
if (!cb_add_phone.isChecked() && !cb_add_sms.isChecked()) {
Toast.makeText(CallSmsSafeActivity.this, \请选择拦截模式\ .show(); }
// 判断是否已经设置好模式
第26 页,共41页
河北科技学院13届本科生毕业论文(设计)
else {
// 向数据库中写入数据
dao.add(blackNumber, mode + \ // 关闭对话框 dialog.dismiss(); // 通知主线程更新界面
new UpdateBlackNumberData().start(); }
} } });
// 设置要显示的界面
dialog = builder.create(); dialog.show(); }
// 根据得到的拦截模式设置mode的值
public int getblackNumberMode(String numberMode) { int mode = 10;
// 根据相关模式设置相应的值
if (numberMode.equals(\电话拦截\ mode = 0; }
if (numberMode.equals(\短信拦截\ mode = 1; }
if (numberMode.equals(\全部拦截\ mode = 2; }
return mode; }
5.2.2 黑名单短信拦截 1、关键代码
public class SmsReceiver extends BroadcastReceiver { private static final String TAG = \ private SharedPreferences sp;// 配置文件 private BlackNumberDao dao;
@Override
public void onReceive(Context context, Intent intent) { Log.i(TAG, \短信到来了\
dao = new BlackNumberDao(context); // 获取到保存的配置文件
sp = context.getSharedPreferences(\ // 获取到保存的安全手机号码
String safeNumber = sp.getString(\
// 获取短信中的内容。系统接收到一个信息广播时,会将接收到的信息存放到pdus数组中 Object[] objs = (Object[]) intent.getExtras().get(\ // 获取手机设备管理器
DevicePolicyManager dm = (DevicePolicyManager) context .getSystemService(Context.DEVICE_POLICY_SERVICE); // 创建一个与MyAdmin相关联的组件
ComponentName mAdminName = new ComponentName(context, MyAdmin.class);
第27 页,共41页
河北科技学院13届本科生毕业论文(设计)
// 遍历出信息中的所有内容 for (Object object : objs) {
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) object); // 获取发信人的地址
String sender = smsMessage.getOriginatingAddress(); // 判断发信人的手机号是否包含+86 if (sender.charAt(0) == '+') { // 进行手机号码的截取
sender = sender.substring(3); }
// 判断短信号码是否是黑名单号码与短信拦截 int result = dao.findNumberMode(sender);
if (result == 1 || result == 2) {// 判断该黑名单号码是否需要拦截短信 Log.i(TAG, \拦截黑名单短信\ abortBroadcast(); }
5.2.3 黑名单电话拦截 1、关键代码
// 挂断电话,需要复制aid1文件
public void endcall(String incomingNumber) { // 使用反射获取系统的service方法 try {
Method method = Class.forName(\ .getMethod(\ IBinder binder = (IBinder) method.invoke(null, new Object[] { TELEPHONY_SERVICE }); // 通过aidl实现方法介绍的调用
ITelephony telephony = ITelephony.Stub.asInterface(binder); // 该方法是一个异步方法,会开启一个线程将呼入的号码存入数据库中 telephony.endCall();
// deleteCallLog(incomingNumber);
// 注册一个内容观察者,观察uri数据的变化
getContentResolver().registerContentObserver( CallLog.Calls.CONTENT_URI, true,
new MyObserver(new Handler(), incomingNumber)); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace();
} catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace();
} catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace();
} catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace();
} catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block e.printStackTrace(); } }
// 删除呼叫记录
private void deleteCallLog(String incomingNumber) { // 呼叫记录内容提供者对应的uri
Uri uri = Uri.parse(\
Cursor cursor = getContentResolver().query(uri, new String[] { \
第28 页,共41页
河北科技学院13届本科生毕业论文(设计)
}
}
\while (cursor.moveToNext()) {
String id = cursor.getString(0);
getContentResolver().delete(uri, \}
cursor.close();
5.3 高级工具功能的实现
5.3.1 号码归属地查询 1、关键代码
public class NumberQueryActivity extends Activity {
private EditText et_number_query;// 输入要查询的号码 private TextView tv_number_address;// 显示号码归属地位置 String address = null;
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.number_query);// 加载界面 // 获取界面的相关组件
et_number_query = (EditText) findViewById(R.id.et_number_query); tv_number_address = (TextView) findViewById(R.id.tv_number_address); // button1 = (Button) findViewById(R.id.button1); // 为文本框添加文本改变时的监听事件
et_number_query.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
if (TextUtils.isEmpty(et_number_query.getText().toString() .trim())) {
tv_number_address.setText(\ address = \
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { //query(); }
// 文本改变后 @Override
public void afterTextChanged(Editable arg0) {
if (TextUtils.isEmpty(address)) { query(); } } });
// 为文本框添加按键监听事件
et_number_query.setOnKeyListener(new OnKeyListener() {
第29 页,共41页
河北科技学院13届本科生毕业论文(设计)
空
@Override
public boolean onKey(View arg0, int arg1, KeyEvent arg2) { //query();
// 获取删除后的字符
String number = et_number_query.getText().toString().trim(); if (number.length() > 0) {// 如果号码长度大于0
if (number.charAt(0) != '0') {// 当首个数字不为0时代表手机号
if (number.length() < 7) {// 当长度小于7时无法查询,将结果改为
tv_number_address.setText(\ address = \ }
} else {// 当首个数字为0时代表是固定电话
if (number.length() <= 4) {// 当删除后的号码长度小于等于4时 // 如果查不到归属地(代表区号为3位)
if (NumberAddressDao.getAddress(number).equals(\ // 就在删除后清空文本框 if (number.length() < 4) {
tv_number_address.setText(\ address = \ }
} else {// 如果查到归属地(代表区号为4位) if (number.length() < 3) { address = \
tv_number_address.setText(\ }
}
} }
} });
}
return false;
5.3.2 常用号码查询 1、关键代码
public class CommonNumActivity extends Activity {
protected static final String TAG = \
private ExpandableListView elv_common_num;// 可扩展的ListView
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.common_num);
elv_common_num = (ExpandableListView) findViewById(R.id.elv_common_num); // 为ExpandableListView设置适配器对象
elv_common_num.setAdapter(new CommonNumberAdapter()); // 为分组中的每个孩子注册一个监听器
elv_common_num.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { TextView tv = (TextView) v;
String number = tv.getText().toString().split(\ // 使用隐式意图来激活手机系统中的拨号器
第30 页,共41页