手机安全卫士(七)----- 添加黑名单(防骚扰)

经过长时间的学习,完成了这个APP的第二个功能,自己手动添加黑名单,防止一些骚扰电话和短信。

完成效果图:

这个功能大致就是者四张效果图。

设计思路:

  1. 首先在APP的这个应用的data文件下建立一个数据库,数据库中存放着一张表(表名随便取,但是要保持一致,有三个字段,id   phonenumber表示手机号 model表示拦截模式)
  2. 设计利用这个数据库的接口,利用增删改查来更新数据库
  3. 设计显示号码和拦截模式的界面
  4. 设置【添加】的后台逻辑
  5. 设置【删除】的后台逻辑
  6. 在广播中监听号码,执行相应的事件

 第一步:建立数据库:

这个知识点还算是容易,就是基本的建库和写一些增删改查的操作。

建立一个数据库:

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进行更新操作。

 最后一步就是在广播中监听,具体的代码在我的《手机安全卫士(六)》中,有兴趣的可以看一看!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值