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. MySQL学习笔记:date_add

    date_add函数 作用:date_add()函数向日期添加指定的时间间隔 语法: date_add(date,INTERVAL expr type) date:日期表达式 type:时间间隔,da ...

  2. 【读书笔记】Android的Ashmem机制学习

    Ashmem是安卓在linux基础上添加的驱动模块,就是说安卓有linux没有的功能. Ashmem模块在内核层面上实现,在运行时库和应用程序框架层提供了访问接口.在运行时库层提供的是C++接口,在应 ...

  3. 拥抱 Android Studio 之一:从 ADT 到 Android Studio

    http://kvh.io/cn/embrace-android-studio-migration.html 1. 拥抱变化,拥抱新事物 Android Studio(IntelliJ IDEA)vs ...

  4. CCF CSP 201509-4 高速公路

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201509-4 高速公路 问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在 ...

  5. day7 socket网络编程基础

    Socket Socket是什么? 下面来看一下网络的传输过程: 上面图片显示了网络传输的基本过程,传输是通过底层实现的,有很多底层,我们写传输过程的时候,要知道所有的过程那就太复杂了,socket为 ...

  6. linux 101 hacks 第一章cd命令

    本系列来源于<linux 101 hacks>,作者还写了其他101 hacks教程,读了几章,觉得技巧都还不错,很实用,做个总结收藏. cdpath 设置基目录 [ramesh@dev- ...

  7. USACO 4.4 Pollutant Control (网络流求最小割割集)

    Pollutant ControlHal Burch It's your first day in Quality Control at Merry Milk Makers, and already ...

  8. Codeforces Round #248 (Div. 1) C - Tachibana Kanade's Tofu AC自动机

    C - Tachibana Kanade's Tofu 思路:把 n 个串丢进AC自动机中,然后dp就好啦. 我的代码居然是在CF上跑最快的.. #include<bits/stdc++.h&g ...

  9. 修改linux系统编码

    方法1: vi   /etc/sysconfig/i18n 默认为: LANG="en_US.UTF-8"SYSFONT="latarcyrheb-sun16" ...

  10. Ionic Js六:切换开关操作

    以下实例中,通过切换不同开关 checked 显示不同的值,true 为打开,false 为关闭. HTML 代码 <ion-header-bar class="bar-positiv ...