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的基本常用的短信操作的更多相关文章

  1. 【Android】Android解析短信操作

    目录结构: contents structure [-] 获取短信 发送短信 1.获取短信 在AndroidManifest.xml中,添加权限: <uses-permission androi ...

  2. Android手机上监听短信的两种方式

    Android手机上监听短信有两种方式: 1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. AndroidManifest.xml: ...

  3. 利用Android Lost通过互联网或短信远程控制安卓设备

    利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...

  4. Android安卓电话拦截及短信过滤

    package com.focus.manager; import java.lang.reflect.Method; import Android .app.Activity; import And ...

  5. 【Android学习】调用系统短信、电话

    今天全心投入Android学习已经有一段时间了,从起初的啥也不懂,到现在半知半解状态,随笔记录些简单且常用的系统功能代码. 调用Android系统短信,其实调用短信非常简单,一个方法就可以搞定.我们可 ...

  6. [android]ShareSDK——内容分享和短信验证

    前言 新版本号ShareSDK的分享和短信验证,按官网的文档,都须要加入一个<Activity></Activity>标签,而分享和短息验证的这个标签内容都一样.会冲突. 解决 ...

  7. android 中调用接口发送短信

    android中可以通过两种方式发送短信 第一:调用系统短信接口直接发送短信:主要代码如下: //直接调用短信接口发短信 SmsManager smsManager = SmsManager.getD ...

  8. Android Tips: 打电话和发短信

    利用Android打电话非常简单,直接调用Android内在的电话功能就可以了. btnDail.setOnClickListener(new OnClickListener(){ @Override ...

  9. Android 利用内容观察者实现短信窃听

    <Android 内容观察者的原理>中介绍了内容观察者的一些基本原理,并做了简单的实战,本文接着进一步做一个小项目实战 package com.wuyudong.smslistener; ...

随机推荐

  1. information_schema Introduction

    information_schema介绍 information_schema数据库是MySQL自带的,里面的“表”保存着服务器当前的实时信息.它提供了访问数据库元数据的方式.元数据是关于数据的数据, ...

  2. **PHP foreach 如何判断为数组最后一个最高效?

    http://www.zhihu.com/question/20158667 其他方法: $list = array('a', 'b', 'c'); foreach($list as $k=>$ ...

  3. maven:missing artifact jdk.tools:jar:1.7

    http://stackoverflow.com/questions/11118070/buiding-hadoop-with-eclipse-maven-missing-artifact-jdk-t ...

  4. ASP.NET Web API 2:创建API帮助页面

         当你新建了一个web API服务之后,再建一个API帮助页面是很有好处的,这样其他开发人员就会很清楚地知道如何调用你的API接口.你可以选择自己手工建立,但是如果能自动生成岂不是更好.为了简 ...

  5. vuejs、eggjs、mqtt全栈式开发设备管理系统

    vuejs.eggjs.mqtt全栈式开发简单设备管理系统 业余时间用eggjs.vuejs开发了一个设备管理系统,通过mqtt协议上传设备数据至web端实时展现,包含设备参数分析.发送设备报警等模块 ...

  6. tp5总结(一)

    https://github.com/ABCDdouyaer/tp5-1 1.下载composer 安装框架 也可以安装包或者git安装 composer create-project topthin ...

  7. thinkphp中导入和使用阿里云OSSsdk

    照做绝对行,在ThinkPHP中,第三方库都放在ThinkPHP/Library/Vendor/路径下. 1.下载OSS PHP SDK:https://help.aliyun.com/documen ...

  8. 理解 Python 中的元类

    本文编程环境:Jupyter NoteBook python3 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在 Python 中这一点仍然成立: class Objec ...

  9. 跟厂长学PHP7内核(一):发展史

    PHP1 1994年,一位名叫Rasmus lerdorf的兄台为了在网上展示自己的履历和网页流量的统计,用Perl开发了一套脚本,后来因与日俱增的需求无法得到满足,lerdorf便使用c语言进行了重 ...

  10. CSUOJ 1895 Apache is late again

    Description Apache is a student of CSU. There is a math class every Sunday morning, but he is a very ...