基于Android系统手机卫士的设计与开发 - 图文(6)

2020-05-13 08:24

河北科技学院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页


基于Android系统手机卫士的设计与开发 - 图文(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:第六讲 离散时间跨时套利定价理论

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: