通訊衛士模塊
本模塊主要實現的是,對你要設置的電話號碼進行短信攔截與電話攔截!
首先進入的是設置界面,需要設置你要攔截的電話號碼:
設置是電話攔截還是短信攔截還是電話與短信都攔截!
完了之後點確定的話就會出現這個設置之後的界面:
如果設置有問題的話,可以長按選中的項,然後就可以修改與刪除了:
原理的贅述:
在我們對號碼進行設置的時候,它其實是把號碼保存到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這個類來完成的!