大家好,又见面了,我是全栈君。
摘要
前一段时间。由于项目的需要,采用ShareSDK该共享功能。其中包含 短信股吧。和呼叫系统,以分享要与成功处理服务器交互的消息后,(我不在乎在这里,收到。仅仅关心发出去了)。可是ShareSDk并不支持短信分享的回调功能,咨询了技术客服,也没有讨论出解决方式来。于是自己尝试粗略实现了一下。
方法
在调用系统短信发送后,通过内容观察者监听 短信发件箱的改变,假设监听到有内容改变的短信ID,那么获取当前的内容并检測当中是否含有某些关键字( 当然,这个关键字是我们自定义的。比如:“jarlen”);假设找到则说明已发送了(我这里不关心,对方是否能收到)。
核心 Code
代码语言:javascript复制/** * 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();
}
}
}
}
}
}
}
创建监听
代码语言:javascript复制 /** * 监听 */
private SMSContentObserver smsContentObserver;
private boolean smsContentObserverFind = false;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1 && !smsContentObserverFind) {
........// 相关处理
smsContentObserverFind = true;
}
}
};
代码语言:javascript复制smsContentObserver = new SMSContentObserver(this, mHandler, usernumber,"某关键词");
getContentResolver().registerContentObserver(
Uri.parse("content://sms"), true, smsContentObserver);
代码语言:javascript复制/** *监听解绑 */
if (smsContentObserver != null) {
getContentResolver().unregisterContentObserver(smsContentObserver);
smsContentObserver = null;
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117070.html原文链接:https://javaforall.cn