摘要

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

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

基于android 社会的app短信分享 发送回调事件的实现的更多相关文章

  1. Android学习笔记之短信验证码的获取和读取

    PS:最近很多事情都拖拖拉拉的..都什么办事效率啊!!! 还得吐槽一下移动运营商,验证码超过五次的时候,直接把我的手机号封闭.真是受够了. 学习笔记: 1.Android之如何获取短信验证码. 2.如 ...

  2. 解决:People下面选择分享可见联系人,选择多个联系人后通过短信分享,短信中只显示一个联系人

    问题描述: [操作步骤]:People下导入导出中选择分享可见联系人,选择多个联系人后通过短信分享 [测试结果]:短信中只能显示一个联系人 [预期结果]:可以显示多个联系人 经过代码分析,从compo ...

  3. android 4.4删除短信

    android 4.4之后非默认的短信应用已经没有办法删除短信了.像以前那样用如下方法是不会没法删除短信的(即使在xml中配置了短信的读写权限),同时也不会有报错或其他提示. public void ...

  4. Android 节日短信送祝福(UI篇:3-选择短信与发送短信的Activity的实现)

    一.ChooseMsgActivity的实现 1.布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/ ...

  5. Android监听系统短信数据库变化-提取短信内容

    由于监听系统短信广播受到权限的限制,所以很多手机可能使用这种方式没法监听广播,从而没办法获取到系统短信,所以又重新开辟一条路. Android监听系统短信数据库内容变化使用场景: 1.监听短信数据库的 ...

  6. supersr--打电话/短信分享/邮件分享

    //  Created by apple on 15/6/17. //  Copyright (c) 2015年 Super All rights reserved. // #import " ...

  7. iOS 短信分享 邮件分享

    本地调用短信分享. #import "shareViewController.h" @interface shareViewController (){ UIAlertView * ...

  8. android打电话、发短信实现

    打电话: Intent intent = newIntent(Intent.ACTION_CALL,Uri.parse("tel:"+"156666666666" ...

  9. Android下调用收发短信邮件等

    Android下调用收发短信邮件等 1,调web浏览器Uri myBlogUri = Uri.parse("http://xxxxx.com");returnIt = new In ...

随机推荐

  1. SetCookies, cookie规范注册表和cookie存储将会优先于设置在HTTP客户端级别中默认的那些

    遇到下面问题解决方法: Hey? 404 抱歉,你输入的网址可能不正确,或者该网页不存在. 7 秒后返回首页 使用独立的本地执行上下文来实现对每个用户(或每个线程)状态的管理. 定义在本地内容中的co ...

  2. Android - 通过Intent启动Activity

    通过Intent启动Activity 本文地址: http://blog.csdn.net/caroline_wendy 为了动态关联Activity界面,使用Intent启动.能够灵活绑定. 在In ...

  3. 《Android内核剖析》读书笔记 第13章 View工作原理【View重绘过程】

    计算视图大小的过程(Measure) 视图大小,准确的来说应该是指视图的布局大小:我们在layout.xml中为每个UI控件设置的layout_width/layout_height两个属性被用来设置 ...

  4. Nginx将请求分发到各web应用

    介绍了VMWare12虚拟机.Linux(CentOS7)系统安装.部署Nginx1.6.3代理服务做负载均衡.接下来介绍通过Nginx将请求分发到各web应用处理服务. 一.Web应用开发 1.as ...

  5. 【Unity3D自学记录】利用代码改动图片属性(Inspector)

    这段时间一直都在打包资源,然后每次导入都要改图片的属性.真是麻烦,所以一直在寻找一键改动而且打包的方法. 最终让我找到了,太坑人了. 依据自己的需求改代码哦,相信大家都能看明确. 核心部分: Text ...

  6. bestcoder Round#52 1001(最短路+状压dp)

    求从1点出发,走遍所有的点,然后回到1点的最小代价. 每个点可以走若干遍. 如果每个点只能走一遍,那么设dp[i][s]为走完s状态个点(s是状态压缩),现在位于i的最小花费. 然后枚举从哪个点回到原 ...

  7. [转]C#自定义开关按钮控件--附带第一个私活项目截图

    原文地址:http://www.cnblogs.com/feiyangqingyun/archive/2013/06/15/3137597.html 进入智能手机时代以来,各种各样的APP大行其道,手 ...

  8. Unity3D 游戏开发架构篇 ——性格一流的设计和持久性

    在游戏开发.游戏人物占了非常大的空间.所有内容都是由主角可以说游戏驱动. 下面来介绍一下一流的设计和持久性的作用. 一.应用场景 游戏中的角色类型不一而足,有不同的技能.有不同的属性等等.有些一个玩家 ...

  9. Java实现字符全阵列阵列

    import org.junit.Test; public class AllSort { public void permutation(char[] buf, int start, int end ...

  10. hdu 2074 堆放篮 好开心图纸标题

    堆放篮 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...