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; ...
随机推荐
- 宝塔Linux常用命令
https://www.bt.cn/bbs/thread-1186-1-1.html 2017年3月8日发布全新架构的宝塔Linux 面板3.1Beta版,到现在的5.2.0正式版,历经100多天打磨 ...
- 浅谈C#中的值类型和引用类型
在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个 ...
- Pytest里,mark装饰器的使用,双引号,没引号,这种差别很重要
按最新版的pytest测试框架. 如果只是单一的mark,不要加任何引号. 如果是要作and ,not之类的先把,一定要是双引号! 这个要记清楚,好像和以前版本的书上介绍的不一样,切记! import ...
- tocmat远程调试
有时候使用tomcat进行远程调试,下面贴出远程调试用的startup.bat脚本 rem Licensed to the Apache Software Foundation (ASF) under ...
- iconfont 在项目中的简单使用
font-class引用 font-class是unicode使用方式的一种变种,主要是解决unicode书写不直观,语意不明确的问题. 与unicode使用方式相比,具有如下特点: 兼容性良好,支持 ...
- 7-1 FireTruck 消防车 uva208
题意: 输入一个n <=20 个结点的无向图以及某个结点k 按照字典序从小到大顺序输出从结点1到结点k的所有路径 要求结点不能重复经过 标准回溯法 要实现从小到大字典序 现在数组中排序好即 ...
- CODEVS 4655 序列终结者-splay(区间更新、区间翻转、区间最值)
4655 序列终结者 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 网上有许多题,就是给定一个序列,要 ...
- Keystone几种token生成的方式分析
从Keystone的配置文件中,我们可见,Token的提供者目前支持四种. Token Provider:UUID, PKI, PKIZ, or Fernet 结合源码及官方文档,我们用一个表格来阐述 ...
- 防止sql注入的几种方法
一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...
- Linux嵌入式文件系统(网络文件系统)
<文件系统定义> 怎么将文件和文件目录加载到linux内核中,这一种加载的方式就叫做文件系统 <建立根文件系统目录和文件> <创建目录> 1)在linux系统中使用 ...