鱼C论坛

 找回密码
 立即注册
查看: 2014|回复: 2

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

[复制链接]
发表于 2015-1-6 13:48:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 青玄 于 2015-1-6 14:15 编辑

通讯卫士模块
本模块主要实现的是,对你要设置的电话号码进行短信拦截与电话拦截!
原理的赘述:
在我们对号码进行设置的时候,它其实是把号码保存到android的数据库中的!
当我们再次进入的时候它是从数据库里面取数据的;
在创建数据库的时候我们需要继承SQLiteOpenHelper这个类:


  1. [align=left]package cn.cbd.mobilesafe.activity.db;[/align][align=left]import android.content.Context;
  2. import android.database.sqlite.SQLiteDatabase;
  3. import android.database.sqlite.SQLiteDatabase.CursorFactory;
  4. import android.database.sqlite.SQLiteOpenHelper;[/align][align=left]public class BlackNumberOpenHelper extends SQLiteOpenHelper {[/align][align=left] public BlackNumberOpenHelper(Context context)
  5. {
  6.   /**
  7.    * 1、context  上下文
  8.    * 2、"blackNumber.db"  需要创建的数据库
  9.    * 3、null  -->CursorFactory
  10.    * 4、版本号
  11.    */
  12.   super(context, "blackNumber.db", null, 1);
  13. }[/align][align=left] @Override
  14. public void onCreate(SQLiteDatabase db)
  15. {

  16.           db.execSQL("create table blackNumber (id  integer primary key autoincrement," +
  17.             "number varchar(20),mode varchar(20))");
  18. }[/align][align=left] @Override
  19. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  20. [/align][align=left] }[/align][align=left]}
  21. [/align]
复制代码

数据库增删改查的实现类:
  1. package cn.cbd.mobilesafe.activity.db.dao;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. import android.content.Context;
  5. import android.database.Cursor;
  6. import android.database.sqlite.SQLiteDatabase;
  7. import cn.cbd.mobilesafe.activity.bean.BlackNumber;
  8. import cn.cbd.mobilesafe.activity.db.BlackNumberOpenHelper;

  9. public class BlackNumberDao {

  10.         private BlackNumberOpenHelper blackNumberOpenHelper;
  11.         
  12.         public  BlackNumberDao(Context context)
  13.         {
  14.                 this.blackNumberOpenHelper=new BlackNumberOpenHelper(context);
  15.         }
  16.         
  17.         

  18.         /**
  19.          * 往黑名单中添加数据
  20.          * @param number 电话号码
  21.          * @param mode   all表示电话+短信,phone电话,sms表示短信
  22.          */
  23.         public void save(String number,String mode)
  24.         {
  25.                 SQLiteDatabase db=blackNumberOpenHelper.getWritableDatabase();
  26.                 db.execSQL("insert into blackNumber (number,mode) values(?,?)",new Object[]{number,mode});
  27.         
  28.                 db.close();
  29.         }
  30.         
  31.         /**
  32.          * 根据电话号码从黑名单中找到对应的记录
  33.          * @param number 手机号码
  34.          * @return  找到该记录,返回true,否则返回false
  35.          */
  36.         public boolean find(String number)
  37.         {
  38.                 boolean result=false;
  39.                 SQLiteDatabase db=blackNumberOpenHelper.getReadableDatabase();
  40.                 Cursor cursor=db.rawQuery("select * from blackNumber where number=?", new String[]{number});
  41.                 if(cursor.moveToFirst())
  42.                 {
  43.                         result=true;
  44.                 }
  45.                 cursor.close();
  46.                 db.close();
  47.                 return result;
  48.                
  49.         }
  50.         
  51.         /**
  52.          * 查找一个某个号是否在数据库中
  53.          * @param number 电话号码
  54.          * @return -1 表示不在数据库中,0 表示电话拦截,1 短信拦截,2表示全部拦截
  55.          */
  56.         public int findByMode(String number)
  57.         {
  58.                 int code=-1;
  59.                 SQLiteDatabase db=blackNumberOpenHelper.getReadableDatabase();
  60.                 Cursor cursor=db.rawQuery("select mode from blackNumber where number=?", new String[]{number});
  61.                 if(cursor.moveToFirst())
  62.                 {
  63.                         String mode=cursor.getString(0);
  64.                         if("phone".equals(mode))
  65.                         {
  66.                                 code=0;
  67.                         }else if("sms".equals(mode)){
  68.                                 code=1;
  69.                         }else if("all".equals(mode)){
  70.                                 code=2;
  71.                         }
  72.                                 
  73.                 }
  74.                 cursor.close();
  75.                 db.close();
  76.                 return code;
  77.                
  78.         }
  79.         
  80.         /**
  81.          * 根据电话号码更新黑名单中指定记录的mode
  82.          * @param number 电话号码
  83.          * @param mode   all表示电话+短信,phone电话,sms表示短信
  84.          */
  85.         public void update(String number,String mode)
  86.         {
  87.                
  88.                 SQLiteDatabase db=blackNumberOpenHelper.getWritableDatabase();
  89.                 db.execSQL("update blackNumber set mode=? where number=?", new Object[]{mode,number});
  90.                
  91.                 db.close();               
  92.         }
  93.         
  94.         /**
  95.          * 根据电话号码删除黑名单中对应的记录
  96.          * @param number 电话号码
  97.          */
  98.         public void delete(String number)
  99.         {
  100.                
  101.                 SQLiteDatabase db=blackNumberOpenHelper.getWritableDatabase();
  102.                 db.execSQL("delete from blackNumber where number=?", new Object[]{number});
  103.                 db.close();
  104.         }
  105.         
  106.         /**
  107.          * 找出黑名单中所有的记录
  108.          * @return List集合
  109.          */
  110.         public List<BlackNumber> findAll()
  111.         {
  112.                 List<BlackNumber> blackNumberList=new ArrayList<BlackNumber>();
  113.                 BlackNumber blackNumber=null;
  114.                 SQLiteDatabase db=blackNumberOpenHelper.getWritableDatabase();
  115.                 Cursor cursor=db.rawQuery("select * from blackNumber", null);
  116.                 while(cursor.moveToNext())
  117.                 {
  118.                         blackNumber=new BlackNumber();
  119.                         blackNumber.setId(cursor.getInt(cursor.getColumnIndex("id")));
  120.                         blackNumber.setNumber(cursor.getString(cursor.getColumnIndex("number")));
  121.                         blackNumber.setMode(cursor.getString(cursor.getColumnIndex("mode")));
  122.                         blackNumberList.add(blackNumber);
  123.                         
  124.                 }
  125.                 db.close();
  126.                 return blackNumberList;
  127.         }
  128.         
  129.         /**
  130.          * 分页找出黑名单中所有的记录
  131.          * @return List集合
  132.          */
  133.         public List<BlackNumber> findByPage(int page)
  134.         {
  135.                 int pageIndex=page*30;
  136.                 List<BlackNumber> blackNumberList=new ArrayList<BlackNumber>();
  137.                 BlackNumber blackNumber=null;
  138.                 SQLiteDatabase db=blackNumberOpenHelper.getWritableDatabase();
  139.                 Cursor cursor=db.rawQuery("select * from blackNumber limit 30 offset ?", new String[]{pageIndex+""});
  140.                 while(cursor.moveToNext())
  141.                 {
  142.                         blackNumber=new BlackNumber();
  143.                         blackNumber.setId(cursor.getInt(cursor.getColumnIndex("id")));
  144.                         blackNumber.setNumber(cursor.getString(cursor.getColumnI
  145. ndex("number")));
  146.                         blackNumber.setMode(cursor.getString(cursor.getColumnIndex("mode")));
  147.                         blackNumberList.add(blackNumber);
  148.                         
  149.                 }
  150.                 db.close();
  151.                 return blackNumberList;
  152.         }
  153.         
  154.         
  155. }
复制代码

然后写一个广播接受者进行拦截短信:

package cn.cbd.mobilesafe.activity.receiver;


import cn.cbd.mobilesafe.activity.db.dao.BlackNumberDao;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;

public class BlackNumberSmsReceiver extends BroadcastReceiver {

private static final String TAG="BlackNumberSmsReceiver";

@Override
public void onReceive(Context context, Intent intent) {
BlackNumberDao blackNumberDao=new BlackNumberDao(context);
Object[] obj=(Object[]) intent.getExtras().get("pdus");
for(Object o : obj)
{
SmsMessage smsMessage=SmsMessage.createFromPdu((byte[])o);
//发信
的后机号,应该在此判断发信人的手机号是否与安全号码匹配
String number=smsMessage.getOriginatingAddress();
int  code=blackNumberDao.findByMode(number);
if(code==1 || code==2)
{
abortBroadcast();

}
}
}
}


然后就是主程序模块的类:


package cn.cbd.mobilesafe.activity;

import java.util.List;

import cn.cbd.mobilesafe.activity.bean.BlackNumber;
import cn.cbd.mobilesafe.activity.db.dao.BlackNumberDao;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.os.AsyncTask;
import android.os.Bundle;
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.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;



public class BlackNumberActivity extends Activity implements OnClickListener {
       
        private ListView lv_blacknumber;
        private BlackNumberDao blackNumberDao;
        private List<BlackNumber> blackNumberList;
        private LinearLayout ll_loading;
        private BlackNumberAdapter adapter;
        private int pageNumber;
        private boolean loading;
        private AlertDialog dialog;
        private EditText et_add;
        private CheckBox cb_phone;
        private CheckBox cb_sms;
        private int position;
       
        private static final String TAG="BlackNumberActivity";
        @Override
        protected void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_add_blacknumber);



                ll_loading = (LinearLayout) findViewById(R.id.ll_loading);
                lv_blacknumber=(ListView) findViewById(R.id.lv_blacknumber);

                //第一步:  给ListView注册一个上下文菜单
registerForContextMenu(lv_blacknumber);


                //为listView添加一个滚动监听事件
lv_blacknumber.setOnScrollListener(new OnScrollListener()
                {

                        @Override
                        public void onScrollStateChanged(AbsListView view, int scrollState) {

                                switch(scrollState)
                                {
                                    //静止状态
    case OnScrollListener.SCROLL_STATE_IDLE :
                                             int position=lv_blacknumber.getLastVisiblePosition(); //从零开始计算
   int size=blackNumberList.size();
                                             if(loading)
                                             {
                                                     //如果数据正在加载,则返回
   Log.i(TAG,"数据正在加载,请稍后......");
                                                     return;
                                             }
                                             if((position+1)==size)
                                             {
                                                     Log.i(TAG,"数据到达列表尾部,请加载数据.");
                                                     pageNumber=pageNumber+1;
                                                     fillData();
                                             }
                                             break;
                                             
                                             //滑行状态
    case OnScrollListener.SCROLL_STATE_FLING :
                                             break;
                                             //手指触模滑动
    case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL :
                                             break;
                                }
                        }

                        @Override
                        public void onScroll(AbsListView view, int firstVisibleItem,
                                        int visibleItemCount, int totalItemCount) {
                                // TODO Auto-generated method stub

                        }

                });
                blackNumberDao=new BlackNumberDao(this);

                 fillData();
        }
       
        private void fillData() {
                new AsyncTask<Void, Void, Void>() {

                        @Override
                        protected Void doInBackground(Void... params) {

                                if(blackNumberList==null)
                                {
                                        blackNumberList=blackNumberDao.findByPage(pageNumber);
                                }
                                else
                                {
                                        List<BlackNumber> blackNumberList2=blackNumberDao.findByPage(pageNumber);
                                        for(BlackNumber bn : blackNumberList2)
                                        {
                                                blackNumberList.add(bn);
                                        }
                                }       

                                return null;
                        }

                        @Override
                        protected void onPreExecute() {
                                loading=true;
                                ll_loading.setVisibility(View.VISIBLE);
                                super.onPreExecute();
                        }

                        @Override
                        protected void onPostExecute(Void result) {

                                ll_loading.setVisibility(View.INVISIBLE);
                                if(adapter==null)
                                {
                                        adapter=new BlackNumberAdapter();
                                        lv_blacknumber.setAdapter(adapter);
                                }
                                else
                                {
                                        adapter.notifyDataSetChanged();//通知界面数据的适配器的数据更新了

}       
loading=false;
                                super.onPostExecute(result);
                        }



                }.execute();
        }
        private final class BlackNumberAdapter extends BaseAdapter
        {

                @Override
                public int getCount() {

                        return blackNumberList.size();
                }

                @Override
                public Object getItem(int position) {

                        return blackNumberList.get(position);
                }

                @Override
                public long getItemId(int position) {

                        return position;
                }

                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                        View view=null;
                        ViewHolder holder;
                        if(convertView==null)
                        {
                                view=View.inflate(getApplicationContext(), R.layout.blacknumber_item, null);
                                holder=new ViewHolder();
                                holder.tv_number=(TextView) view.findViewById(R.id.blacknumber_item_number);
                            holder.tv_mode=(TextView) view.findViewById(R.id.blacknumber_item_mode);
                            view.setTag(holder);
                        }
                        else
                        {
                                view=convertView;
                                holder=(ViewHolder) view.getTag();
                        }
                        BlackNumber blackNumber=blackNumberList.get(position);
                        holder.tv_number.setText(blackNumber.getNumber());

                        String mode=blackNumber.getMode();
                        if("all".equals(mode))
                        {
                                holder.tv_mode.setText("电话+短信拦截");
                        }else if("phone".equals(mode)){
                                holder.tv_mode.setText("电话拦截");
                        }else if("sms".equals(mode)){
                                holder.tv_mode.setText("短信拦截");
                        }

return view;
                }




        }
       
        static class ViewHolder
        {
                TextView tv_mode;
                TextView tv_number;
        }
       
       
        public void addBlackNumber(View v)
        {
                showBlackNumberDialog(1,-1);

        }

        /**
         * 根据type值判断是增加黑名单号码还是更新黑名单号码
* @param type 1 表示增加,2表示更新
* @param index 表示要修改的对象在集合中的位置,如果不需要请设置为-1
         */
        private void showBlackNumberDialog(int type,int index) {
                AlertDialog.Builder builder=new Builder(this);
            dialog=builder.create();
                View view=View.inflate(this,R.layout.layout_addblacknumber, null);

                if(type==2)
                {
                        TextView tv_title=(TextView) view.findViewById(R.id.tv_dialog_title);
                        tv_title.setText("修改黑名单号码的模式");
                }
et_add=(EditText) view.findViewById(R.id.et_add_black_number);

                if(index>=0) //表示更新
{
position=index;
                         BlackNumber blackNumber =(BlackNumber) lv_blacknumber.getItemAtPosition(index);
                         et_add.setText(blackNumber.getNumber());
                         et_add.setEnabled(false);



                }
                cb_phone= (CheckBox) view.findViewById(R.id.cb_block_phone);
                cb_sms= (CheckBox) view.findViewById(R.id.cb_block_sms);

                Button bt_add_ok=(Button) view.findViewById(R.id.bt_add_ok);
                bt_add_ok.setTag(type);//往button中添加一个值,用于判断是添加还是更新
Button bt_add_cancle=(Button) view.findViewById(R.id.bt_add_cancle);

                bt_add_ok.setOnClickListener(this);
                bt_add_cancle.setOnClickListener(this);
                dialog.setView(view, 0, 0, 0, 0);
                dialog.show();
        }

        @Override
        public void onClick(View v) {

                switch(v.getId())
                {
                   case R.id.bt_add_cancle :
                            dialog.dismiss();
                            break;
                            
                   case R.id.bt_add_ok :
                            String number=et_add.getText().toString().trim();
                            
                            if(TextUtils.isEmpty(number))
                            {
                                    Toast.makeText(this, "电话号码不为能为空", Toast.LENGTH_SHORT).show();
                                    return;
                            }
                            
                            int type= (Integer) v.getTag();
                            if(type==1)
                            {
                                    if(cb_phone.isChecked() && cb_sms.isChecked())
                                    {
                                            blackNumberDao.save(number, "all");
                                    }else if(cb_phone.isChecked()){
                                           
                                            blackNumberDao.save(number, "phone");
                                    }else if(cb_sms.isChecked()){
                                           
                                            blackNumberDao.save(number, "sms");
                                    }else{
                                           
                                            Toast.makeText(this, "拦截模式不能为空,请选择拦截模式", Toast.LENGTH_SHORT).show();
                                            return;
                                    }
                                           
                                  
                            }
                            else
                            {
                                    BlackNumber blackNumber=blackNumberList.get(position);
                                    if(cb_phone.isChecked() && cb_sms.isChecked())
                                    {
                                            blackNumberDao.update(number, "all");
                                            blackNumber.setMode("all");
                                            blackNumberList.set(position, blackNumber);
                                           
                                    }else if(cb_phone.isChecked()){
                                           
                                            blackNumberDao.update(number, "phone");
                                            blackNumber.setMode("phone");
                                            blackNumberList.set(position, blackNumber);
                                    }else if(cb_sms.isChecked()){
                                           
                                            blackNumberDao.update(number, "sms");
                                            blackNumber.setMode("sms");
                                            blackNumberList.set(position, blackNumber);
                                    }else{
                                           
                                            Toast.makeText(this, "拦截模式不能为空,请选择拦截模式", Toast.LENGTH_SHORT).show();
                                            return;
                                    }       
                                    adapter.notifyDataSetChanged();
                            }
                            
                            dialog.dismiss();
                            break;
                }

        }

       
        //第二步:  上下文菜单弹出时,调用该方法
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {

                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;//此position为ListView中选择条目的position的位置

switch(item.getItemId())
                {
                    case R.id.item_blacknumber_delete:
                             delete(position);
                             return true;
                             
                    case R.id.item_blacknumber_update:
                             update(position);
                             return true;
                             
                    default :
                             return true;
                }

        }

        /**
         * 更新ListView中的position位置的条目内容
* @param position 位置
*/
        private void update(int position) {

                showBlackNumberDialog(2,position);
        }

        /**
         * 删除ListView中的position位置的条目内容
* @param position 位置
*/
        private void delete(int position) {

                //根据位置从ListView中获取该对象
BlackNumber blackNumber=(BlackNumber) lv_blacknumber.getItemAtPosition(position);
                //从集合中删除该数据
blackNumberList.remove(position);
                //从数据库中删除该记录
blackNumberDao.delete(blackNumber.getNumber());
                //通知界面更新
adapter.notifyDataSetChanged();

        }

}


效果:

QQ截图20150106133742.jpg


复制代码



本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-6 14:21:35 | 显示全部楼层
极客首选之Python
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-6 17:59:47 | 显示全部楼层
玄玄太厉害了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 05:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表