经过长时间的学习,完成了这个APP的第二个功能,自己手动添加黑名单,防止一些骚扰电话和短信。
完成效果图:
这个功能大致就是者四张效果图。
设计思路:
- 首先在APP的这个应用的data文件下建立一个数据库,数据库中存放着一张表(表名随便取,但是要保持一致,有三个字段,id phonenumber表示手机号 model表示拦截模式)
- 设计利用这个数据库的接口,利用增删改查来更新数据库
- 设计显示号码和拦截模式的界面
- 设置【添加】的后台逻辑
- 设置【删除】的后台逻辑
- 在广播中监听号码,执行相应的事件
第一步:建立数据库:
这个知识点还算是容易,就是基本的建库和写一些增删改查的操作。
建立一个数据库:
package com.example.yzg.safepeople.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by yzg on 2019/8/2.
*/
public class BlackNumberDBHelper extends SQLiteOpenHelper {
public BlackNumberDBHelper(Context context) {
super(context,"blacknumber.db",null,1);
}
/**
* 创建一个数据库表
* @param db
* 包含三个字段 id phonenumber model
* model 0 全部拦截 1 电话拦截 2 短信拦截
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table number1 (id Integer primary key AUTOINCREMENT,phonenumber varchar(20),model varchar(2) )");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
在构造方法中创建一个数据库,用的时候需要传入上下文参数
在onCreate方法中建立一张表,用来存放黑名单信息
注意点:
我在编写这一块代码的时候,自己在写id 的类型时,写的是int 结果一直报错,后来换成了Integer,这才成功了!
增删改查的操作没有和建库操作放在一起,而是单独在一个类中,我感觉这样写更加一目了然。
package com.example.yzg.safepeople.db.dao;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.example.yzg.safepeople.bean.BlackNumberInfo;
import com.example.yzg.safepeople.db.BlackNumberDBHelper;
import java.util.ArrayList;
import java.util.List;
/**
* Created by yzg on 2019/8/2.
* 黑名单数据的增删改查
*/
public class BlackNumberDao {
private BlackNumberDBHelper db;
private String tablename = "number1";
//写在构造器中 只要对象new 出来 数据库就会自动创建
public BlackNumberDao(Context context) {
db = new BlackNumberDBHelper(context);
}
public List<BlackNumberInfo> QueryAll(){
List <BlackNumberInfo> list = new ArrayList();
SQLiteDatabase readableDatabase = db.getReadableDatabase();
Cursor query = readableDatabase.query(tablename, null, null, null, null, null, null);
while (query.moveToNext()){
BlackNumberInfo blackNumberInfo = new BlackNumberInfo();
String phone = query.getString(1);
blackNumberInfo.setPhonenumber(phone);
String model = query.getString(2);
blackNumberInfo.setModel(model);
list.add(blackNumberInfo);
}
query.close();
readableDatabase.close();
return list;
}
/**
* 往数据库中添加数据
*
* @param phone 电话
* @param model 拦截模式
*/
public Boolean Add(String phone, String model) {
SQLiteDatabase writableDatabase = db.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("phonenumber", phone);
Log.d("测试", "Add: "+phone);
contentValues.put("model", model);
//如果insert的值位-1 则说明插入失败
long insert = writableDatabase.insert(tablename, null, contentValues);
writableDatabase.close();
//如果插入进数据库 则返回true
if (insert != -1) {
return true;
} else {
return false;
}
}
/**
* 删除数据库中的数据
*
* @param phone
* @return
*/
public Boolean Delete(String phone) {
SQLiteDatabase writableDatabase = db.getWritableDatabase();
//返回值为0 说明没有删除数据
int delete = writableDatabase.delete(tablename, "phonenumber=?", new String[]{phone});
writableDatabase.close();
if (delete != 0) {
return true;
} else {
return false;
}
}
/**
* 更改拦截模式
*
* @param phone
* @param model
* @return
*/
public Boolean Update(String phone, String model) {
SQLiteDatabase writableDatabase = db.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("model", model);
int update = writableDatabase.update(tablename, contentValues, "phonenumber=?",new String[]{phone});
writableDatabase.close();
if (update==0){
return false;
}else {
return true;
}
}
/**
* 查找数据的操作 主要是查找phone的model
* @param phone
* @return
*/
public String Query(String phone){
String model = null;
SQLiteDatabase readableDatabase = db.getReadableDatabase();
Cursor query = readableDatabase.query(tablename, new String[]{"model"}, "phonenumber=?", new String[]{phone}, null, null, null);
while (query.moveToNext()){
model = query.getString(0);
}
return model;
}
}
在构造方式中就会创建一个数据库的db,只要一创建BlackNumberDao这个类,就会获得数据库的访问,然后就可以对数据库表进行增删改查,只要记住相应的方式的使用即可!
注意点:利用方法的时候,参数的个数个位置一定要弄清楚,不要搞错;还有就是在查询的时候,一定要用对方法,比如我本来想用getString结果写成了getColumnName,结果找错找了半天,累死了!!!!
可以利用【SQLite Expert Personal 5 - 64bit】这个软件来查看从手机中导出的数据库文件,目的是查看自己创建的数据库是否正确,还有就是在没完成添加数据操作之前自己添加数据。
这些基本就把数据库部分给完成了,然后就是黑名单数据的展示。
第二步:展示数据
展示数据的界面简单,但是最难就是关于用LIstView来展示数据了,会用,但是不知道为什么,自己对于这一方面还是掌握不清。
这个图片就是代表下面的代码:(这是局部代码,有需要的可以留言)
class BlackAdapter extends BaseAdapter{
@Override
public int getCount() {
return blackNumberInfos.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = null;
ViewHolder viewHolder;
if (convertView == null){
viewHolder = new ViewHolder();
view = View.inflate(getApplicationContext(),R.layout.item_balcknumber_view,null);
viewHolder.tv_phone = view.findViewById(R.id.tv_phone);
viewHolder.tv_model = view.findViewById(R.id.tv_model);
viewHolder.iv_delete = view.findViewById(R.id.iv_delete);
view.setTag(viewHolder);
}else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.iv_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final AlertDialog.Builder builder = new AlertDialog.Builder(BlackActivity.this);
builder.setTitle("删除");
builder.setMessage("你确认删除吗?");
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
show1.dismiss();
}
});
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
BlackNumberDao blackNumberDao = new BlackNumberDao(getApplicationContext());
Log.d("测试", "onClick: 删除吗"+blackNumberInfos.get(position).getPhonenumber());
Boolean delete = blackNumberDao.Delete(blackNumberInfos.get(position).getPhonenumber());
if (delete){
blackNumberInfos.remove(position);
blackAdapter.notifyDataSetChanged();
show1.dismiss();
}else {
Toast.makeText(BlackActivity.this,"删除不成功!!!",Toast.LENGTH_SHORT).show();
}
}
});
show1 = builder.show();
}
});
BlackNumberInfo blackNumberInfo = blackNumberInfos.get(position);
viewHolder.tv_phone.setText(blackNumberInfo.getPhonenumber());
String model = blackNumberInfo.getModel();
switch (Integer.parseInt(model)){
case 0:
viewHolder.tv_model.setText("全部拦截");
break;
case 1:
viewHolder.tv_model.setText("电话拦截");
break;
case 2:
viewHolder.tv_model.setText("短信拦截");
break;
}
return view;
}
class ViewHolder{
TextView tv_phone;
TextView tv_model;
ImageView iv_delete;
}
}
在这个环节中,自己还是不太熟悉,需要仔细琢磨的地方很多,还得多想想为甚什么,多敲一敲代码。
第三步就是,增加和删除的逻辑
刚才删除的局部代码在第二步的代码中,添加的代码还是比较简单的。
private void initEvent() {
//添加黑名单按钮的逻辑代码
bt_black_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(BlackActivity.this);
View view = View.inflate(getApplicationContext(), R.layout.item_black_add, null);
final EditText black_phone = view.findViewById(R.id.black_phone);
Button btn_cancle = view.findViewById(R.id.btn_cancle);
Button btn_confirm = view.findViewById(R.id.btn_confirm);
final RadioGroup rg = view.findViewById(R.id.rg);
builder.setView(view);
final AlertDialog show = builder.show();
btn_cancle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.dismiss();
}
});
btn_confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phone = black_phone.getText().toString();
if(TextUtils.isEmpty(phone)){
Toast.makeText(BlackActivity.this,"号码不能为空!!!",Toast.LENGTH_SHORT).show();
}
else {
int checkedRadioButtonId = rg.getCheckedRadioButtonId();
String model = null;
switch (checkedRadioButtonId){
case R.id.rb_all:
model = "0";
break;
case R.id.rb_phone:
model = "1";
break;
case R.id.rb_sms:
model = "2";
break;
}
BlackNumberDao blackNumberDao = new BlackNumberDao(getApplicationContext());
Boolean add = blackNumberDao.Add(phone, model);
if (add){
BlackNumberInfo blackNumberInfo = new BlackNumberInfo();
blackNumberInfo.setPhonenumber(phone);
blackNumberInfo.setModel(model);
blackNumberInfos.add(0,blackNumberInfo);
blackAdapter.notifyDataSetChanged();
show.dismiss();
}else {
Toast.makeText(BlackActivity.this,"添加不成功!",Toast.LENGTH_SHORT).show();
}
}
}
});
}
});
}
点击添加之后,弹出一个自定义的对话框,在里面输入相应的内容,然后进行相应的判断。
注意点:在添加相应的数据之后,要对相应的列表进行增加,还得对相应的Adapter进行更新操作。
最后一步就是在广播中监听,具体的代码在我的《手机安全卫士(六)》中,有兴趣的可以看一看!!