zoukankan      html  css  js  c++  java
  • [android] 手机卫士黑名单功能(短信拦截)

    前面我们把需要拦截的手机号都存储和展示出来了,接下来是使用广播接收者拦截短信了,这个广播接收者需要和一个服务绑定,服务开启的时候,接收者存在,服务停掉时,接收者关闭

    service包下定义一个类CallSmsSafeService继承系统的Service

    重写onCreate()方法

    获取BroadcastReceiver对象,new出来

    调用registerReceiver()方法,注册广播,参数:BroadcastReceiver对象,IntentFillter对象

    重写onDestory()方法

    调用unregisterReceiver()方法,参数:BroadcastReceiver对象

    BroadcastReceiver对象置为null

    定义一个内部类InnerSmsReceiver继承系统的BroadcastReceiver

    重写 onReceive()方法,传递进来参数:Context对象,Intent对象

    调用Intent对象的getExtras().get(“pdus”)方法,获取到Object[]数组

    for循环Object[]数组,每个是Object对象

    调用SmsMessage.createFromPdu()方法,获取到SmsMessage对象,参数:byte[]数组,强转Object对象

    调用SmsMessage对象的getOriginatingAddress()方法,得到String发件人

    调用Dao对象的查询数据库方法,查出这条短信的拦截模式

    判断拦截模式,如果是全部拦截3或者短信拦截2,就调用abortBroadcast()方法

    在设置中心对上面的服务进行配置,达到开启和关闭的功能

    查看这篇:http://www.cnblogs.com/taoshihan/p/5468523.html

     CallSmsSafeService.java

    package com.qingguow.mobilesafe.service;
    
    import android.app.Service;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.IBinder;
    import android.telephony.SmsMessage;
    
    import com.qingguow.mobilesafe.db.ado.BlackNumberAdo;
    /**
     * 短息电话拦截服务
     * @author taoshihan
     *
     */
    public class CallSmsSafeService extends Service {
        private InnerSmsReceiver receiver;
        private BlackNumberAdo ado;
        @Override
        public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            return null;
        }
        /**
         * 服务创建
         */
        @Override
        public void onCreate() {
            receiver=new InnerSmsReceiver();
            IntentFilter filter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
            ado=new BlackNumberAdo(getApplicationContext());
            registerReceiver(receiver, filter);
            super.onCreate();
        }
        /**
         * 接收广播
         * @author taoshihan
         *
         */
        private class InnerSmsReceiver extends BroadcastReceiver{
    
            @Override
            public void onReceive(Context context, Intent intent) {
                Object[] objs=(Object[]) intent.getExtras().get("pdus");
                for(Object obj:objs){
                    SmsMessage sms=SmsMessage.createFromPdu((byte[]) obj);
                    String sender=sms.getOriginatingAddress();
                    
                    String mode=ado.find(sender);
                    if(mode!=null){
                        if (mode.equals("2") || mode.equals("3")) {
                            System.out.println("拦截短信:" + sender);
                            abortBroadcast();
                        }
                    }
                    
                }
            }
            
        }
        @Override
        public void onDestroy() {
            unregisterReceiver(receiver);
            receiver=null;
            super.onDestroy();
        }
    }

    ado类

    package com.qingguow.mobilesafe.db.ado;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    
    import com.qingguow.mobilesafe.db.BlackNumberDBOpenHelper;
    
    public class BlackNumberAdo {
        private BlackNumberDBOpenHelper helper;
    
        public BlackNumberAdo(Context context) {
            helper = new BlackNumberDBOpenHelper(context);
        }
    
        /**
         * 插入数据
         * 
         * @param phone
         * @param mode
         */
        public void add(String phone, String mode) {
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put("phone", phone);
            values.put("mode", mode);
            db.insert("blacknumber", null, values);
            db.close();
        }
    
        /**
         * 查询全部
         * 
         * @return
         */
        public List<Map<String, String>> findAll() {
            SQLiteDatabase db = helper.getReadableDatabase();
            Cursor cursor = db.rawQuery(
                    "select phone,mode from blacknumber order by id desc", null);
            List<Map<String, String>> list = new ArrayList<Map<String, String>>();
            while (cursor.moveToNext()) {
                Map<String, String> info = new HashMap<String, String>();
                String phone = cursor.getString(0);
                String mode = cursor.getString(1);
                info.put("phone", phone);
                info.put("mode", mode);
                list.add(info);
            }
            cursor.close();
            db.close();
            return list;
        }
    
        /**
         * 修改数据
         * 
         * @param phone
         * @param mode
         */
        public void update(String phone, String mode) {
            SQLiteDatabase db = helper.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put("phone", phone);
            values.put("mode", mode);
            db.update("blacknumber", values, "phone=?", new String[] { phone });
            db.close();
        }
    
        /**
         * 删除数据
         * 
         * @param phone
         */
        public void delete(String phone) {
            SQLiteDatabase db = helper.getWritableDatabase();
            db.delete("blacknumber", "phone=?", new String[] { phone });
            db.close();
        }
    
        /**
         * 查找单条
         * 
         * @param phone
         */
        public String find(String phone) {
            SQLiteDatabase db = helper.getReadableDatabase();
            Cursor cursor = db.rawQuery(
                    "select mode from blacknumber where phone=?",
                    new String[] { phone });
            if (cursor.moveToNext()) {
                String mode = cursor.getString(0);
                return mode;
            }
    
            return null;
        }
    }
  • 相关阅读:
    【Android命令行】apktool参数详解
    【Android】ANR+OOM+FC
    如何创建低成本沙箱环境?推荐你使用API仿真!
    关于代码覆盖率,你不可不知的两大陷阱!
    如何借助自动创建单元测试来提高单元测试的投资回报率(ROI)?
    [实用指南]如何使您的旧代码库(遗留代码)符合MISRA C 2012编码规范?
    超实用的10个技巧!让您无论使用哪种静态分析工具都能轻松更新现有的静态分析实现
    主数据管理(MDM)的6大层级简述,你不可不知的数据治理参考!
    【收藏】关于元数据(Metadata)和元数据管理,这是我的见过最全的解读!
    机器学习 | 基于机器学习的供应链管理之销售库存优化分析(实操分享)
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5503597.html
Copyright © 2011-2022 走看看