Android的基本常用的短信操作
1、调用系统发送短信界面(传入手机号码+短信内容)
2、隐藏发送短信(指定号码指定内容)(这里隐藏只是没有反写入数据库)
3、获得收件箱接收到的短信
4、Android屏蔽新短信通知提示信息:(ContentObserver)
4、删除刚接收到的短信:
A)、带提示删除
B)、无新短信通知=删除短信
所用到的相关数据类:
Intent、SmsManager、BroadcastReceiver、ContentObserver、Bundle
涉及动作(Action):
android.provider.Telephony.SMS_RECEIVED
涉及权限:
<!-- 短信 -->
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SMS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
1、调用系统发送短信界面(传入手机号码+短信内容)
(直接使用Intent 意图执行系统的sms即可--同理这里可以使用该方式调用手机发送邮件等)源码如下:
public void SendSMS( String aContent ){
// 新建smsto意图
Intent iIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:158********"));//传入要发送的地址
// 设置短信内容
iIntent.putExtra("sms_body", aContent);//设置传递的信息内容
// 启动短信服务内容
aContent.startActivity(iIntent);//直接打开意图即可
}
2、隐藏发送短信(指定号码指定内容)(这里隐藏只是没有反写入数据库)
创建发送自己的短信需要用到短信管理类SmsManager,使用它的sendTextMessage方法即可实现程序发送:
public void SendSMSHide(String aPhoneNUM, String aContent){
// 创建一个默认的SmsManager。
SmsManager aSmsManager = SmsManager.getDefault();
// 发送信息的intent参数。
String aSent = "SMS_SENT";
// 信息反馈的intent参数。
String aDelivered = "SMS_DELIVERED";
// 创建发送新信息的PendingIntent对象
PendingIntent aSentPI = PendingIntent.getBroadcast(this, 0, new Intent(aSent), 0);
// 信息反馈的PendingIntent。
PendingIntent aDeliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(aDelivered), 0);
aSmsManager .sendTextMessage(aPhoneNUM, null, aContent, aSentPI, aDeliveredPI);//发送短信(还可以发送彩信等)
//debuge
if(BOOL_ISDEBUGE){
Toast.makeText(aContent,"短信送出成功!!",Toast.LENGTH_SHORT ).show();
}
}
3、获得收件箱接收到的短信
A)、方法一:
通过继承BroadcastReceiver服务,处理onReceive函数,判断接收到的动作为SMS_RECEIVED
我将其封装在ReceiveSMS(aContext, aIntent);函数中只需要在onReceive()函数中调用即可!
public void ReceiveSMS(Context aContext, Intent aIntent) {
if (aIntent.getAction().equals(SSTR_SMSACTION)) { // 监听SMS_RECEIVED消息
Bundle iBundle = aIntent.getExtras(); // 获取Intent数据
if (iBundle != null) {
Object[] iObject = (Object[]) iBundle.get("pdus"); // 获取pdus对象
SmsMessage iMsg = SmsMessage.createFromPdu((byte[]) iObject[0]); // 初始化信息对象
m_strSMSAddress = iMsg.getDisplayOriginatingAddress(); // 获取信息发送人
m_strSMSText = iMsg.getDisplayMessageBody(); // 获取信息内容
//to do your things
Toast.makeText(aContext, "Address = "+m_strSMSAddress+"\nCountent = "+m_strSMSText, Toast.LENGTH_LONG).show();
}
}
}
B)、方法二:继承ContentObserver类在onChange中调用(注册监听sms即可)
this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content);
4、Android屏蔽新短信通知提示信息:(ContentObserver)
大致思路先从收件箱获得指定未读短信,在执行通知前更改为已读,执行SQL的updata即可
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//读取收件箱中指定号码的短信
cursor = managedQuery(Uri.parse("content://sms/inbox"),
new String[]{"_id", "address", "read"},
"read = 0", null,
"date desc");
cursor.moveToFirst();
for(int i =0;i<cursor.getCount();++i)
{
Log.i("address","address = "+cursor.getLong(1));
if(cursor.getString(1).indexOf("136******")>=0)
{//这里运用indexof方式查找,并没有用比较因为系统会有国际号码
ContentValues values = new ContentValues();
values.put("read", "1"); //修改短信为已读模式
getContentResolver().update(Uri.parse("content://sms/inbox"), values, "
_id=?", new String[]{""+cursor.getInt(0)});
break;//这里如果跳出就只能更改一条(刚收到的可以这样实现而且手机上方将不再有短信提示)
}
cursor.moveToNext();
}
}
5、删除刚接收到的短信:
A)、带提示删除(这样不知到有什么用。呵呵。写出来分享)
短信能删除但是当手机接收到短信时还会在手机通知里面显示给用户
继承BroadcastReceiver类,首先获得会话id在执行数据库删除即可
I、获得会话id:
(思路这样还可以简洁的-网上找的大家也可以用上面的managedQuery方法)
private long getThreadId(Context aContext) {
long threadId = 0;
String SMS_READ_COLUMN = "read";
String WHERE_CONDITION = SMS_READ_COLUMN + " = 0";
String SORT_ORDER = "date DESC";
int count = 0;
Cursor cursor = aContext.getContentResolver().query(
Uri.parse("content://sms/inbox"),new String[] { "_id", "thread_id", "address", "person", "date",
"body" },WHERE_CONDITION,null,SORT_ORDER);
if (cursor != null) {try {count = cursor.getCount();
if (count > 0) {
cursor.moveToFirst();
threadId = cursor.getLong(1);}
} finally {cursor.close();}}
Log.i("threadId", String.valueOf(threadId));
return threadId;}
II、执行删除:
这里我们可以在BroadcastReceiver的onReceive函数里面直接调用删除方法如下:
long id = getThreadId(aContext);
Uri mUri=Uri.parse("content://sms/conversations/" + id);
//无条件删除id所有会话,第二个参数可以添加条件
aContext.getContentResolver().delete(mUri, null, null);
但
是这里你会发现你删除的并不是你刚才发送的信息,而是你上一次发送的信息的所有,这里是为什么呢,原因是我们刚刚监听的收件箱的时候当前会话是还没有来得
及创建的,所以删除会话也是删除的以前的,所以这里我们需要时间。可以用如下方式来实现:这样就会成功了。但是这种方式短信通知依然存在
new Thread(){
public void run(){
try {sleep(600);//等待一段时间删除
} catch (InterruptedException e) {
e.printStackTrace();}
long id = getThreadId(aContext);
Uri mUri=Uri.parse("content://sms/conversations/" + id);
aContext.getContentResolver().delete(mUri, null, null);
}}.start();
Android的基本常用的短信操作的更多相关文章
- 【Android】Android解析短信操作
目录结构: contents structure [-] 获取短信 发送短信 1.获取短信 在AndroidManifest.xml中,添加权限: <uses-permission androi ...
- Android手机上监听短信的两种方式
Android手机上监听短信有两种方式: 1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. AndroidManifest.xml: ...
- 利用Android Lost通过互联网或短信远程控制安卓设备
利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...
- Android安卓电话拦截及短信过滤
package com.focus.manager; import java.lang.reflect.Method; import Android .app.Activity; import And ...
- 【Android学习】调用系统短信、电话
今天全心投入Android学习已经有一段时间了,从起初的啥也不懂,到现在半知半解状态,随笔记录些简单且常用的系统功能代码. 调用Android系统短信,其实调用短信非常简单,一个方法就可以搞定.我们可 ...
- [android]ShareSDK——内容分享和短信验证
前言 新版本号ShareSDK的分享和短信验证,按官网的文档,都须要加入一个<Activity></Activity>标签,而分享和短息验证的这个标签内容都一样.会冲突. 解决 ...
- android 中调用接口发送短信
android中可以通过两种方式发送短信 第一:调用系统短信接口直接发送短信:主要代码如下: //直接调用短信接口发短信 SmsManager smsManager = SmsManager.getD ...
- Android Tips: 打电话和发短信
利用Android打电话非常简单,直接调用Android内在的电话功能就可以了. btnDail.setOnClickListener(new OnClickListener(){ @Override ...
- Android 利用内容观察者实现短信窃听
<Android 内容观察者的原理>中介绍了内容观察者的一些基本原理,并做了简单的实战,本文接着进一步做一个小项目实战 package com.wuyudong.smslistener; ...
随机推荐
- SQL行列转换的另一种方法
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)insert into tb values('张三' , '语文' , 74)inse ...
- PHP性能调优---php-fpm中启用慢日志配置(用于检测执行较慢的PHP脚本)
虽然通过nginx accesslog可以记录用户访问某个接口或者网页所消耗的时间,但是不能清晰地追踪到具体哪个位置或者说函数慢,所以通过php-fpm慢日志,slowlog设置可以让我们很好的看见哪 ...
- SSIS 学习之旅 第一个SSIS 示例(二)
这一章还是继上一章例子 进行一些小的知识扩展.主要是为了让大家更快的上手SSIS. 概要设计: 1.按用户组生成CSV文件到Pending目录下, 2.移动Pending目录下的CSV文件 ...
- 关于ARM指令那些你必须知道的东西
1.32位ARM指令每一位都有其作用,具体如下: 低12为第二操作数, 12~15位为目的寄存器, 16~19位为第一操作数, 20~27就是操作码, 28~31就是条件域. 2.多寄存器load和s ...
- 通过okhttp3下载文件实现APP版本更新
原文:https://blog.csdn.net/qq_34261214/article/details/77124729 概况 思路是这样的,首先在服务器上把已经签名打包的apk放上去,还有一份TX ...
- 【LOJ】#2538. 「PKUWC2018」Slay the Spire
题解 由于强化卡都是大于1的,我们分析一下就会发现,尽可能多的用强化卡,至少用一张攻击卡,一定是每组卡牌的最优选择 所以我们把攻击卡和强化卡从大到小排序 我们设\(g[i][j]\)表示前i张卡牌里选 ...
- (转)最短路算法--Dijkstra算法
转自:http://blog.51cto.com/ahalei/1387799 上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...
- SQL_异化
select a.pk_accasoa from bd_accasoa a; --下级科目原来主键: 0001Z0100000000001A2 --执行该语句后下级科目异化了(替换的意思) , '@@ ...
- [ 原创 ]学习笔记-三种向ListView中填充简单文本的方法
Android 中ListView是很重要的一块内容 掌握ListView的基本用法 对学习安卓起着举足轻重的作用 今天就介绍一下三种向ListView 填充简单文本的方法 填充其他数据类型的用法之后 ...
- centOS7.4服务器 yum安装 搭建lamp环境
// 红色加粗是linux命令 安装gcc和gcc-c++ yum -y install gcc gcc-c++ yum list httpd* 安装apche yum -y install http ...