• 基于android 社会的app短信分享 发送回调事件的实现


    摘要

    前一段时间。由于项目的需要,采用ShareSDK该共享功能。其中包含 短信股吧。和呼叫系统,以分享要与成功处理服务器交互的消息后,(我不在乎在这里,收到。仅仅关心发出去了)。可是ShareSDk并不支持短信分享的回调功能,咨询了技术客服,也没有讨论出解决方式来。于是自己尝试粗略实现了一下。

    方法

    在调用系统短信发送后,通过内容观察者监听 短信发件箱的改变,假设监听到有内容改变的短信ID,那么获取当前的内容并检測当中是否含有某些关键字( 当然,这个关键字是我们自定义的。比如:“jarlen”);假设找到则说明已发送了(我这里不关心,对方是否能收到)。

    核心 Code

    
    /**
     * Created by jarlen on 2015/6/4.
     */
    public class SMSContentObserver extends ContentObserver {
        private Context mContext;
    
        private boolean isGoing = false;
        private Handler mHandler;
        private String targetAddress = null;
        private String observerContent = null;
    
        /**
         * 短信息发送监听者构造器
         *
         * @param context
         * @param handler 监听回调
         * @param address 监听的目标手机号
         * @param content 监听的内容关键字
         */
        public SMSContentObserver(Context context, Handler handler, String address, String content) {
            super(handler);
            this.mContext = context;
            this.mHandler = handler;
            if (address != null) {
                //去掉手机号中的所有空格
                this.targetAddress = address.replaceAll(" ", "");
            }
            this.observerContent = content;
        }
    
        Object obj = new Object();
    
        @Override
        public void onChange(boolean selfChange) {
    
            synchronized (obj) {
                if (!isGoing) {
                    isGoing = true;
                    Cursor cursor = mContext.getContentResolver().query(
                            Uri.parse("content://sms/outbox"), null, null, null,
                            null);
    
                    String address = null;
                    String smsContent = null;
                    // 遍历查询结果获取用户正在发送的短信
                    while (cursor.moveToNext()) {
                        StringBuffer sb = new StringBuffer();
                        // 获取短信的发送地址
                        address = cursor
                                .getString(cursor.getColumnIndex("address"));
                        smsContent = cursor
                                .getString(cursor.getColumnIndex("body"));
                    }
                    if (address != null && smsContent != null) {
                        // 找到一个正在发送的短信
                        Log.e("===", "找到一个正在发送的短信");
                        if (targetAddress != null) {
                            // 事先指定的收件人不为空
                            if (address.contains(targetAddress)
                                    && smsContent.contains(observerContent)) {
                                // 正好是事先指定的收件人,而且信息内容含有某种关键字
                                Log.e("===", "信息内容含有某种关键字");
                                Message msg = mHandler.obtainMessage();
                                msg.obj = address;
                                msg.what = 1;
                                msg.sendToTarget();
                            } else {
                                Message msg = mHandler.obtainMessage();
                                msg.what = 0;
                                msg.sendToTarget();
                            }
                        } else {
                            // 事先没有指定的收件人
                            if (smsContent.contains(observerContent)) {
                                // 信息内容含有某种关键字
                                Log.e("===", "信息内容含有某种关键字");
                                Message msg = mHandler.obtainMessage();
                                msg.obj = address;
                                msg.what = 1;
                                msg.sendToTarget();
                            } else {
                                Message msg = mHandler.obtainMessage();
                                msg.what = 0;
                                msg.sendToTarget();
                            }
                        }
                    }
                }
            }
        }
    }

    创建监听

    
        /**
         * 监听
         */
        private SMSContentObserver smsContentObserver;
    
        private boolean smsContentObserverFind = false;
    
        private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
    
                if (msg.what == 1 && !smsContentObserverFind) {
    
                    ........// 相关处理
    
                    smsContentObserverFind = true;
                }
            }
        };
    smsContentObserver = new SMSContentObserver(this, mHandler, usernumber,"某关键词");
    
    getContentResolver().registerContentObserver(
    Uri.parse("content://sms"), true, smsContentObserver);
    
    
    /**
    *监听解绑
    */
    if (smsContentObserver != null) {
                getContentResolver().unregisterContentObserver(smsContentObserver);
                smsContentObserver = null;
            }

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    Qt 模拟一个导航定位系统
    【编程之美】用C语言实现状态机(实用)
    代码面试之链表
    乾坤合一~Linux设备驱动之USB主机和设备驱动
    乾坤合一~Linux设备驱动之I2C核心、总线以及设备驱动
    乾坤合一~Linux设备驱动之终端设备驱动
    乾坤合一~Linux设备驱动之块设备驱动
    蜕变成蝶~Linux设备驱动之watchdog设备驱动
    蜕变成蝶~Linux设备驱动之按键设备驱动
    蜕变成蝶~Linux设备驱动之DMA
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4802937.html
Copyright © 2020-2023  润新知