摘要

前一段时间。由于项目的需要,采用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. emeditor只显示特定类型的文件

    emeditor过滤文件类型,右侧资源管理器中只显示特定类型的文件,如只显示java,xml,txt,properties等文件,而不显示doc,jpg,xls等emeditor不能打开的文件. 右击 ...

  2. linux--文件夹下批量改动IP

    sed -i 's/10.11/10.22/g' `grep ir 10.11 *| grep -E'.xml:|.cfg:|.ini:|.wsdl|.properties:' |awk -F:'{p ...

  3. Java学习文件夹

    每天进步一点点,先研究一门语言深入研究下去.

  4. 在spring MVC的controller中获取ServletConfig

    在使用SmartUpload进行文件上传时,须要用到srevletConfig: 假设是在servlet中写当然是非常easy实现的: private ServletConfig config; // ...

  5. a标签中调用js的几种方法

    1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而且javascript:协议 ...

  6. DIV 居中对齐

    <div style="text-align:center;margin-right:auto;margin-left:auto">

  7. UVa 103 - Stacking Boxes (LIS,打印路径)

    链接:UVa 103 题意:给n维图形,它们的边长是{d1,d2,d3...dn},  对于两个n维图形,求满足当中一个的全部边长 依照随意顺序都一一相应小于还有一个的边长,这种最长序列的个数,而且打 ...

  8. Java EE (8) -- Java EE Patterns

    Java EE 模式目录由以下三个层组成: –     整合层(4) –     业务层(9) –     表示层(8) 涉及 Java EE 平台代码与其它类型应用程序或遗留系统的集成: 服务激活器 ...

  9. Android四个存储数据的SharedPreferences

    除了SQLite外部数据库.SharedPreferences它是一个轻量级的数据存储,其本质是基于XML文件存储key-value键值数据,通过定期用它来存储一些简单的配置信息.它的存储位置/dat ...

  10. CodeBlocks暴力恢复默认设置

    昨天,我不知道怎么去CodeBlocks干净的界面使自己都不知道怎么走.然后找到默认设置恢复方法,找不到.然后,我用了一个恢复方法暴力,卸载重装,有一点须要注意.卸载后CodeBlocks的配置文件还 ...