通讯卫士模块
本模块主要实现的是,对你要设置的电话号码进行短信拦截与电话拦截!
首先进入的是设置界面,需要设置你要拦截的电话号码:
设置是电话拦截还是短信拦截还是电话与短信都拦截!
完了之后点确定的话就会出现这个设置之后的界面:
如果设置有问题的话,可以长按选中的项,然后就可以修改与删除了:
原理的赘述:
在我们对号码进行设置的时候,它其实是把号码保存到android的数据库中的!
当我们再次进入的时候它是从数据库里面取数据的;
在创建数据库的时候我们需要继承SQLiteOpenHelper这个类:
package com.example.safemobile_test.database;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DataBaseOpenHelper extends SQLiteOpenHelper {
public DataBaseOpenHelper(Context context) {
super(context, "blacknumber.db", null, 1); //创建数据库
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
//创建一个表
/**
* phone 拦截的电话号码
* mode 拦截模式
*/
db.execSQL("create table blacknumber (id integer primary key autoincrement ,phone varchar(11),mode integer)");
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
}
接下来的话,就需要多数据库进行增删改查的操作了:
package com.example.safemobile_test.dao;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.safemobile_test.daomain.BlackNumber;
import com.example.safemobile_test.database.DataBaseOpenHelper;
public class BlackNumberDao {
private DataBaseOpenHelper helper; //这个类是数据库的创建类
public BlackNumberDao(Context context)
{
helper = new DataBaseOpenHelper(context);
}
public void update(BlackNumber blackNumber) //这个是信息的更新操作
{
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("phone", blackNumber.getPhone());
values.put("mode", blackNumber.getMode());
db.update("blacknumber", values,"id=?", new String[]{String.valueOf(blackNumber.getId())});
db.close();
}
public int getInsertCurrentId() //这个是获得当前 号码的id通过她来就可以进行更新
{
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select id from blacknumber order by id desc", null);
if(cursor.moveToFirst())
{
return cursor.getInt(cursor.getColumnIndex("id"));
}
return 0;
}
public void save(BlackNumber blackNumber) //这个事保存拦截号码的方法
{
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("phone", blackNumber.getPhone());
values.put("mode", blackNumber.getMode());
db.insert("blacknumber", "phone", values);
db.close();
}
public void delete(int id) //删除拦截号码的方法
{
SQLiteDatabase db = helper.getWritableDatabase();
db.delete("blacknumber", "id=?", new String[]{String.valueOf(id)});
db.close();
}
public List<BlackNumber> query() //查询拦截号码的方法
{
List<BlackNumber> list = new ArrayList<BlackNumber>();
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.query("blacknumber", null, null, null, null, null, null);
while(cursor.moveToNext())
{
int id = cursor.getInt(cursor.getColumnIndex("id"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
int mode = cursor.getInt(cursor.getColumnIndex("mode"));
BlackNumber blackNumber = new BlackNumber(id, phone, mode);
if(list != null)
{
list.add(blackNumber);
}
db.close();
}
return list;
}
public int findBtMode(String number) //从数据库找出号码的拦截模式
{
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("blacknumber", new String[]{"mode"}, "phone=?", new String[]{number}, null, null, null);
if(cursor.moveToFirst())
{
return cursor.getInt(cursor.getColumnIndex("mode"));
}
return 0;
}
}
然后就是加载界面操作的类:
package com.example.safemobile_test;
import java.util.List;
import com.example.safemobile_test.adapter.BlackNumberAdapter;
import com.example.safemobile_test.dao.BlackNumberDao;
import com.example.safemobile_test.daomain.BlackNumber;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;
public class BlackNumberActivity extends Activity{
private EditText et_add_black_number;
private CheckBox cb_block_phone;
private CheckBox cb_block_sms;
private AlertDialog dialog ;
private ListView lv_blacknumber;
private List<BlackNumber> data;
private BlackNumberDao blackNumberDao;
private Handler handler;
private BlackNumberAdapter adapter;
private BlackNumber blackNumber;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_blacknumber);
lv_blacknumber = (ListView) this.findViewById(R.id.lv_blacknumber);
this.registerForContextMenu(lv_blacknumber); //给listView注册上下文
handler = new Handler(){ //这里是主线程接收消息的,主要是用来设置适配器的!
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
adapter = new BlackNumberAdapter(BlackNumberActivity.this, data);
lv_blacknumber.setAdapter(adapter);
}
};
blackNumberDao = new BlackNumberDao(this); //实例化这个类,这个类的里面的方法就是保存数据到数据库的
this.getData(); //调用这个方法运行子线程里面的程序,这个子线程是用来查询数据库里面的数据的也就是要拦截的信息
//如果有对它进行设置的话,那listview上面就会显示你设置的内容!
}
private void getData() {
// TODO Auto-generated method stub
new Thread(){
public void run()
{
data = blackNumberDao.query(); //这个是查询要拦截的信息的,并把它放在结合里面
Message msg = Message.obtain();
msg.what = 1;
handler.sendMessage(msg); //向主线程发送消息
}
}.start();
}
/**
* 上下文菜单的删除功能
* @param position //要删除的数据的id
*/
public void delete(int position)
{
int id = data.get(position).getId();
blackNumberDao.delete(id);
data.remove(position);
adapter.notifyDataSetChanged();
}
/**
* 复写这个方法进行上下文的创建
*/
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.blacknumber_set_menu, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
/**
* 复写这个方法,这个方法是当点击上下文的菜单的时候就会调用
*/
@Override
public boolean onContextItemSelected(MenuItem item) {
// 获取内容的信息
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
int position = (int) info.id; //获取选择菜单项的id
switch(item.getItemId())
{
case R.id.delete: //如果选择是删除的话就调用删除的方法
delete(position);
return true;
case R.id.update: //如果选择的是修改的话就调用修改的方法
update(position);
return true;
default:
return true;
}
}
/**
* 这里是修改的方法
* @param position //指定修改数据的id因为它是通过id进行修改的
*/
public void update(int position)
{
blackNumber=data.get(position);
AlertDialog.Builder builder = new Builder(this); //对话框的创建
View view = View.inflate(this, R.layout.layout_addblacknumber, null);
dialog = builder.create();
dialog.setView(view, 0, 0, 0, 0);
dialog.show();
/***********************************************************************/
et_add_black_number = (EditText) view.findViewById(R.id.et_add_black_number);
cb_block_phone = (CheckBox) view.findViewById(R.id.cb_block_phone);
cb_block_sms = (CheckBox) view.findViewById(R.id.cb_block_sms);
Log.i("=========>", blackNumber + "");
et_add_black_number.setText(blackNumber.getPhone()); //获取电话号码
if(blackNumber.getMode() == 3) //获取拦截的模式
{
cb_block_phone.setChecked(true);
cb_block_sms.setChecked(false);
}else if(blackNumber.getMode() == 2)
{
cb_block_sms.setChecked(true);
}else
{
cb_block_phone.setChecked(true);
}
Button bt_add_ok = (Button) view.findViewById(R.id.bt_add_ok);
Button bt_add_cancel = (Button) view.findViewById(R.id.bt_add_cancle);
bt_add_ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String phone = et_add_black_number.getText().toString().trim();
if(TextUtils.isEmpty(phone))
{
Toast.makeText(BlackNumberActivity.this, "拦截的电话不能够为空", Toast.LENGTH_LONG).show();
return ;
}else if(!cb_block_phone.isChecked() && !cb_block_sms.isChecked())
{
Toast.makeText(BlackNumberActivity.this, "拦截模式不能为空", Toast.LENGTH_LONG).show();
return;
}else
{
int mode = 0;
if(cb_block_phone.isChecked() && cb_block_sms.isChecked())
{
mode = 3;
}else if(cb_block_phone.isChecked())
{
mode = 1;
}else if(cb_block_sms.isChecked())
{
mode = 2;
}
//mode 1 表示电话 2表示短信 3表示电话和短信
blackNumber.setPhone(phone); //设置电话号码
blackNumber.setMode(mode); //设置拦截模式
//实例化增删改查的类
BlackNumberDao blackNumberDao = new BlackNumberDao(BlackNumberActivity.this);
BlackNumberActivity.this.blackNumberDao.update(blackNumber); //调用修改的方法
adapter.notifyDataSetChanged(); //通知适配器数据发生变化,重新加载集合中的数据
dialog.dismiss();
}
}
});
bt_add_cancel.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
dialog.dismiss();
}
});
builder.show();
}
/**
* 这个方法就是设置要拦截的号码的,包括他的类型!
* @param v
*/
public void addBlackNumber(View v)
{
AlertDialog.Builder builder = new Builder(this);
View view = View.inflate(this, R.layout.layout_addblacknumber, null);
dialog = builder.create();
dialog.setView(view, 0, 0, 0, 0);
dialog.show();
et_add_black_number = (EditText) view.findViewById(R.id.et_add_black_number);
cb_block_phone = (CheckBox) view.findViewById(R.id.cb_block_phone);
cb_block_sms = (CheckBox) view.findViewById(R.id.cb_block_sms);
Button bt_add_ok = (Button) view.findViewById(R.id.bt_add_ok);
Button bt_add_cancel = (Button) view.findViewById(R.id.bt_add_cancle);
bt_add_ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String phone = et_add_black_number.getText().toString().trim();
if(TextUtils.isEmpty(phone))
{
Toast.makeText(BlackNumberActivity.this, "拦截的电话不能够为空", Toast.LENGTH_LONG).show();
return ;
}else if(!cb_block_phone.isChecked() && !cb_block_sms.isChecked())
{
Toast.makeText(BlackNumberActivity.this, "拦截模式不能为空", Toast.LENGTH_LONG).show();
}else
{
int mode = 0;
if(cb_block_phone.isChecked() && cb_block_sms.isChecked())
{
mode = 3;
}else if(cb_block_phone.isChecked())
{
mode = 1;
}else if(cb_block_sms.isChecked())
{
mode = 2;
}
//mode 1 表示电话 2表示短信 3表示电话和短信
BlackNumber blackNumber = new BlackNumber(phone,mode);
BlackNumberDao blackNumberDao = new BlackNumberDao(BlackNumberActivity.this);
blackNumberDao.save(blackNumber);
blackNumber.setId(blackNumberDao.getInsertCurrentId());
data.add(blackNumber); //保存当前集合
adapter.notifyDataSetChanged(); //这个是对数据进行刷新操作的
dialog.dismiss();
}
}
});
bt_add_cancel.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
dialog.dismiss();
}
});
}
}
注意:这个里面的话,还需要一个适配器:adapter,我就不再赘述代码了!我想这个得话都会把!我用的是继承BaseAdapter这个类来完成的!