小白馬衛士項目總結之通訊衛士

通訊衛士模塊

本模塊主要實現的是,對你要設置的電話號碼進行短信攔截與電話攔截!

首先進入的是設置界面,需要設置你要攔截的電話號碼:


設置是電話攔截還是短信攔截還是電話與短信都攔截!

完了之後點確定的話就會出現這個設置之後的界面:


如果設置有問題的話,可以長按選中的項,然後就可以修改與刪除了:


原理的贅述:

在我們對號碼進行設置的時候,它其實是把號碼保存到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這個類來完成的!


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