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

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

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

摘要

前一段时间。由于项目的需要,采用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;
        }

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117070.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MAC 系统安装 Maven 及环境变量配置

    MAC 系统安装 Maven 及环境变量配置1、概述本文主要为在MAC苹果系统下安装Maven及环境变量配置Maven是Apache下的一个纯Java开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。Maven是一个项目管理工具,可以对Java项目进行构建、依赖管理。Maven也可被用于构建和管理各种项目,例如C#,Ruby,Scala和其他语言编写的项目。Maven曾是Jakarta项目的子项目,现为由Apache软件基金会主持

    2022年7月24日
    10
  • java线程池面试题有哪些?java线程池常见面试题「建议收藏」

    java线程池面试题有哪些?java线程池常见面试题「建议收藏」进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试题。1.了解过线程池的工作原理吗?当线程池中有任务需要执行时,线程池会判断如果线程数量没有超过核心数量就会新建线程池进行任务执行,如果线程池中的线程数量已经超过核心线程数,这时候任务就会被放入任务队列中排队等待执行;如果任务队列超过最大队列数,并且线程池没有达到最大线程数,就会新建线程来执行任务;如果超过了

    2022年5月26日
    39
  • 使用FileReader对象的readAsDataURL方法来读取图像文件

    使用FileReader对象的readAsDataURL方法来读取图像文件readAsDataURL方法会使用base-64进行编码,编码的资料由data字串开始,后面跟随的是MIMEtype,然后再加上base64字串,逗号之后就是编码过的图像文件的内容。data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAB0CAYAAABUmhYnAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAA……使用

    2025年7月30日
    3
  • MySQL 5.7中添加,弃用或删除了服务器和状态变量和选项「建议收藏」

    MySQL 5.7中添加,弃用或删除了服务器和状态变量和选项

    2022年2月10日
    46
  • js 生成二维码并点击下载软件_js生成二维码并保存

    js 生成二维码并点击下载软件_js生成二维码并保存html部分<h1>文字生成二维码及生成可下载的图片</h1><div><inputid=”input”value=”http://www.baidu.com”type=”text”><buttontype=”button”onclick=”refresh()”>生出来</button></div><divid=”output”><!–这里放canvas格式的二维

    2022年10月18日
    3
  • c++ 线程间通信方式「建议收藏」

    c++ 线程间通信方式「建议收藏」线程同步和线程互斥互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的,线程间不需要知道彼此的存在。同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问,线程间知道彼此的存在。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源线程…

    2022年10月7日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号