设为首页 加入收藏

TOP

Android短信监听实现,及Android4.4之后短信机制变更(一)
2023-07-25 21:43:45 】 浏览:73
Tags:Android Android4.4 后短信

Android短信监听实现,及Android4.4之后短信机制变更

 

前阵子公司有一个项目,简单的监听短信应用,功能只有如下两个:

1.监听短信并获取短信内容上传服务器;
2.从服务器获取短信内容,发送出去
   按照传统的思路,监听短信我们有两种方式;第一种是使用广播方式监听短信广播到来,第二种则是通过观察者,监听数据库数据变化。
    其中,指的注意的是Android4.4之后版本,新引入了默认短信应用的概念,系统可以设置由某个应用来处理短信;
本文我们将带人们分析以下几个问题:
   1.监听数据库变化方式监听短信
   2.通过广播监听短信内容
   3.Android 4.4以上版本短信权限问题
   4.Android4.4版本以上设置默认短信应用
 
 

1.监听数据库变化方式监听短信内容

既然是监听数据库变化 那我们就应该清楚短信的数据库表结构:
sms主要结构:
  _id:          短信序号,如100
  thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的
  address:  发件人地址,即手机号,如+86138138000
  person:   发件人,如果发件人在通讯录中则为具体姓名,陌生人为null
  date:       日期,long型,如1346988516,可以对日期显示格式进行设置
  protocol: 协议0SMS_RPOTO短信,1MMS_PROTO彩信
  read:      是否阅读0未读,1已读
  status:    短信状态-1接收,0complete,64pending,128failed
  type:       短信类型1是接收到的,2是已发出
  body:      短信具体内容
  service_center:短信服务中心号码编号,如+8613800755500 
 
既然需要操作数据库,便少不了使用ContentResolver,所以我们应该还需要了解,短信的content uri :
全部短信:content://sms/
收件箱:content://sms/inbox
发件箱:content://sms/sent
草稿箱:content://sms/draft
 
复制代码
private Uri SMS_INBOX = Uri.parse("content://sms/inbox");  
    public void getSmsFromPhone() {  
        ContentResolver cr = getContentResolver();  
        String[] projection = new String[] { "body","address" };//"_id", "address", "person",, "date", "type  
        String where = " date >  "  
                + (System.currentTimeMillis() - 10 * 60 * 1000);  
        Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc");  
        if (null == cur)  
            return;  
        if (cur.moveToFirst()) {  
            String number = cur.getString(cur.getColumnIndex("address"));//手机号  
            String body = cur.getString(cur.getColumnIndex("body"));  
            //TODO 这里是具体处理逻辑 
            
        }  
    }
复制代码

 

在这里我们只是写了一个方法查询数据库,但是还有一个问题就是我们应该在什么时候去查数据库,总不能起个线程去轮训,这样太耗费资源了,这里我们可以是用观察者模式;

 

复制代码
private SmsObserver smsObserver;  
  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.app_login);  
        smsObserver = new SmsObserver(this, smsHandler);  
        getContentResolver().registerContentObserver(SMS_INBOX, true,  
                smsObserver);  
  
    }  
    public Handler smsHandler = new Handler() {  
        //这里可以进行回调的操作  
        //TODO  
  
    };  
    class SmsObserver extends ContentObserver {  
  
        public SmsObserver(Context context, Handler handler) {  
            super(handler);  
        }  
  
        @Override  
        public void onChange(boolean selfChange) {  
            super.onChange(selfChange);  
            //每当有新短信到来时,使用我们获取短消息的方法  
            getSmsFromPhone();  
        }  
    }
复制代码

 

在这里我们注册了一个观察者,监听收件箱的变化,一旦收件箱变化,我们就查询数据库,去除最新的一条数据
相应的权限这里就不贴出来了
至此我们就实现了通过监听数据库的方式来监听短信内容
 
 

 2.通过广播监听短信内容

复制代码
public class SmsReceiver extends BroadcastReceiver {
    public static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private static final String TAG = "yjj";
    public SmsReceiver() {
        Log.i("yjj", "new SmsReceiver");
    }
    @Override
    public void onReceive(final Context context, Intent intent) {
        Log.i(TAG, "jie shou dao");
        Cursor cursor = null;
        try {
            if
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇day15-声明式事务 下一篇带你熟悉3种AQS的线程并发工具的..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目