小白马卫士项目总结之通讯卫士

通讯卫士模块

本模块主要实现的是,对你要设置的电话号码进行短信拦截与电话拦截!

首先进入的是设置界面,需要设置你要拦截的电话号码:


设置是电话拦截还是短信拦截还是电话与短信都拦截!

完了之后点确定的话就会出现这个设置之后的界面:


如果设置有问题的话,可以长按选中的项,然后就可以修改与删除了:


原理的赘述:

在我们对号码进行设置的时候,它其实是把号码保存到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这个类来完成的!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章