Android短信监听实现,及Android4.4之后短信机制变更
前阵子公司有一个项目,简单的监听短信应用,功能只有如下两个:
1.监听数据库变化方式监听短信内容
_id: 短信序号,如100
thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的
address: 发件人地址,即手机号,如+86138138000
person: 发件人,如果发件人在通讯录中则为具体姓名,陌生人为null
date: 日期,long型,如1346988516,可以对日期显示格式进行设置
protocol: 协议0SMS_RPOTO短信,1MMS_PROTO彩信
read: 是否阅读0未读,1已读
status: 短信状态-1接收,0complete,64pending,128failed
type: 短信类型1是接收到的,2是已发出
body: 短信具体内容
service_center:短信服务中心号码编号,如+8613800755500
收件箱:content://sms/inbox
private Uri SMS_INBOX = Uri.parse("content://sms/inbox");
public void getSmsFromPhone() {
ContentResolver cr = getContentResolver();
String[] projection = new String[] { "body","address" };//"_id", "address", "person",, "date", "type
String where = " date > "
+ (System.currentTimeMillis() - 10 * 60 * 1000);
Cursor cur = cr.query(SMS_INBOX, projection, where, null, "date desc");
if (null == cur)
return;
if (cur.moveToFirst()) {
String number = cur.getString(cur.getColumnIndex("address"));//手机号
String body = cur.getString(cur.getColumnIndex("body"));
//TODO 这里是具体处理逻辑
}
}
在这里我们只是写了一个方法查询数据库,但是还有一个问题就是我们应该在什么时候去查数据库,总不能起个线程去轮训,这样太耗费资源了,这里我们可以是用观察者模式;
private SmsObserver smsObserver;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app_login);
smsObserver = new SmsObserver(this, smsHandler);
getContentResolver().registerContentObserver(SMS_INBOX, true,
smsObserver);
}
public Handler smsHandler = new Handler() {
//这里可以进行回调的操作
//TODO
};
class SmsObserver extends ContentObserver {
public SmsObserver(Context context, Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//每当有新短信到来时,使用我们获取短消息的方法
getSmsFromPhone();
}
}
2.通过广播监听短信内容
public class SmsReceiver extends BroadcastReceiver {
public static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
private static final String TAG = "yjj";
public SmsReceiver() {
Log.i("yjj", "new SmsReceiver");
}
@Override
public void onReceive(final Context context, Intent intent) {
Log.i(TAG, "jie shou dao");
Cursor cursor = null;
try {
if (SMS_RECEIVED.equals(intent.getAction())) {
Log.d(TAG, "sms received!");
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
final SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
if (messages.length > 0) {
String content = messages[0].getMessageBody();
String sender = messages[0].getOriginatingAddress();
long msgDate = messages[0].getTimestampMillis();
String smsToast = "New SMS received from : "
+ sender + "\n'"
+ content + "'";
Toast.makeText(context, smsToast, Toast.LENGTH_LONG)
.show();
Log.d(TAG, "message from: " + sender + ", message body: " + content
+ ", message date: " + msgDate);
//自己的逻辑
}
}
cursor = context.getContentResolver().query(Uri.parse("content://sms"), new String[] { "_id", "address", "read", "body", "date" }, "read = ? ", new String[] { "0" }, "date desc");
if (null == cursor){
return;
}
Log.i(TAG,"m cursor count is "+cursor.getCount());
Log.i(TAG,"m first is "+cursor.moveToFirst());
}
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "Exception : " + e);
} finally {
if (cursor != null) {
cursor.close();
cursor = null;
}
}
}
}
这个很简单就是定义一个广播接收者,并且在清单文件中注册(注册有两种方式,这里就不展开了)
<receiver android:name=".message.SmsReceiver" android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_DELIVER" />
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
3.Android 4.4以上版本短信权限问题

4.Android4.4版本以上设置默认短信应用
<!-- BroadcastReceiver that listens for incoming MMS messages -->
<receiver android:name=".message.MmsReceiver"
android:permission="android.permission.BROADCAST_WAP_PUSH">
<intent-filter>
<action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
<data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>
</receiver>
<!-- Activity that allows the user to send new SMS/MMS messages -->
<activity android:name=".message.ComposeSmsActivity" >
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="sms" />
<data android:scheme="smsto" />
<data android:scheme="mms" />
<data android:scheme="mmsto" />
</intent-filter>
</activity>
<!-- Service that delivers messages from the phone "quick response" -->
<service android:name=".message.HeadlessSmsSendService"
android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="sms" />
<data android:scheme="smsto" />
<data android:scheme="mms" />
<data android:scheme="mmsto" />
</intent-filter>
</service>
public class MmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
ComposeSmsActivity.java
public class ComposeSmsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
}
HeadlessSmsSendService.java
public class HeadlessSmsSendService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
通过以上步骤,我们所写的应用就可以被设置为默认短信应用了
最后别忘了添加相应的权限:
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
这里贴出的是我整个项目的权限,世纪应该只需要SMS相关的权限,这里就不做区分了
Android短信监听实现,及Android4.4之后短信机制变更的更多相关文章
- wemall app商城源码Android短信监听接收器
wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...
- Android短信监听软件
本案例是在android手机中运行,是一个没有界面的短信监听软件.主要是用BroadcastReceiver来接受短信广播,当接收到短信后就跳转到service中来转发短信.哈哈,不是用来干坏事的.这 ...
- Android手机上监听短信的两种方式
Android手机上监听短信有两种方式: 1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. AndroidManifest.xml: ...
- Android短信监听(二)——利用ContentObserver实现短信监听
MainActivity例如以下: package cc.testsmslistener; import cc.testsmslistener.SMSContentObserver.MessageLi ...
- Android实战简易教程-第四十枪(窃听风云之短信监听)
近期在做监听验证码短信自己主动填入的功能,无意间想到了一个短信监听的办法. 免责声明:短信监听本身是一种违法行为,这里仅仅是技术描写叙述.请大家学习技术就可以.(哈哈) 本实例是基于bmob提供的后台 ...
- Android 编程下短信监听在小米手机中失效的解决办法
相信很多人写的短信监听应用在小米手机上是拦截不到短信的,这是因为小米对短信的处置权优先分给了系统.我们可以在短信的[设置]→[高级设置]→[系统短信优先]中发现短信的优先处理权默认是分给系统的,只要关 ...
- Android 手势水平监听判断
package com.zihao.ui; import com.zihao.R; import android.os.Bundle; import android.app.Activity; imp ...
- Android中如何监听GPS开启和关闭
转自 chenming 原文 Android中如何监听GPS开启和关闭 摘要: 本文简单总结了如何监听GPS开关的小技巧 有时需要监听GPS的开关(这种需求并不多见).实现的思路是监听代表 GPS ...
- android的电话监听
android的电话监听 新建一个项目,结构图如下: PhoneService: package com.demo.tingdianhua; import android.app.Service; i ...
- Android零基础入门第34节:Android中基于监听的事件处理
原文:Android零基础入门第34节:Android中基于监听的事件处理 上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本 ...
随机推荐
- Java 8新特性----Lambda
Lambda 一.如何辨别Lambda表达式 Runnable noArguments = () -> System.out.println("Hello World"); ...
- 本地搭建Wordpress博客网站(Windows)
最近在写一些web功能测试的一个主题分享,里边有一个分类是数据库测试,那么数据库测试有几个点的方法,其中有一个是学会看数据库的日志.由于公司内部的数据库日志我们测试人员暂时不开放查看,所以打算自己在本 ...
- js实现文字超出部分用省略号代替实例代码
关于超出一定字数用省略号显示的问题,这种要求在我们日常开发的时候经常见到,我们之前基本都是用CSS来完成的,今天给大家分享个Javascript实现这个功能的示例代码,有需要的可以参考借鉴. 话不多说 ...
- Redis简单延时队列
Redis实现简单延队列, 利用zset有序的数据结构, score设置为延时的时间戳. 实现思路: 1.使用命令 [zrangebyscore keyName socreMin socreMax] ...
- mongodb.mongoose维护内嵌数组元素
运行环境: - Nodejs - MongoDB 文档实例名: ProjectJob 文档格式如下: { "_id" : ObjectId("5bc69eb0b298b3 ...
- 使用OClint进行iOS项目的静态代码扫描
使用OClint进行iOS项目的静态代码扫描 原文链接:http://blog.yourtion.com/static-code-analysis-ios-using-oclint.html 最近需要 ...
- AngularJS中使用Karma单元测试初体验
■ 搭建karma测试环境 → 创建app和test文件夹→npm install karma --save-dev→npm install karma-jasmine --save-dev→npm ...
- AngularJS中使用$parse或$eval在运行时对Scope变量赋值
在"AngularJS中自定义有关一个表格的Directive"中自定义了一个有关表格的Direcitve,其表格的表现方式是这样的: <table-helper datas ...
- 删除weblogic应用缓存,weblogic 缓存的删除方法
security (注意:security目录下为安全认证文件,切不可删除!) 正常情况下只需删除tmp目录下缓存文件(不同的工程在tmp下面有不同的路径,如果不清楚的话可以一起删除). 个别情况下会 ...
- 04-树5 Root of AVL Tree + AVL树操作集
平衡二叉树-课程视频 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the tw ...