启动程序时启动一个service,在service里注册接收短信的广播,当手机收到短信里,打印出短信内容跟电话号码。

package com.lmy.SmsListener;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView; public class SmsListenerActivity extends Activity { @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main);
TextView tv = new TextView(this);
tv.setText("Hello. I started!");
setContentView(tv);
Intent service = new Intent(this, MyService.class);
this.startService(service);
}
}

当service被kill后,我们可以在开机时自动启动service。

开机自动启动一个service,在service里注册接收短信的广播,当手机收到短信里,打印出短信内容跟电话号码。

开机启动后系统会发出一个Standard Broadcast Action,名字叫android.intent.action.BOOT_COMPLETED,这个Action只会发出一次。

创建一个类继承BroadcastReceiver,在onReceive(Context context, Intent intent)里面启动service。

package com.lmy.SmsListener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; public class MyBrocast extends BroadcastReceiver { static final String ACTION = "android.intent.action.BOOT_COMPLETED"; @Override
public void onReceive(Context context, Intent intent) {
Log.v("dimos", "MyBrocast");
if (intent.getAction().equals(ACTION)) {
Intent service = new Intent(context, MyService.class);
context.startService(service);
}
} }

在service中注册一个接收短信的广播:

package com.lmy.SmsListener;

import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log; public class MyService extends Service { @Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
super.onCreate();
IntentFilter localIntentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
localIntentFilter.setPriority(2147483647);
SmsRecevier localMessageReceiver = new SmsRecevier();
Log.v("dimos", "MyService");
registerReceiver(localMessageReceiver, localIntentFilter);
} }

广播接收到短信:

package com.lmy.SmsListener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; public class SmsRecevier extends BroadcastReceiver { public SmsRecevier() {
super();
Log.v("dimos", "SmsRecevier create");
} @Override
public void onReceive(Context context, Intent intent) { String dString = SmsHelper.getSmsBody(intent);
String address = SmsHelper.getSmsAddress(intent);
Log.i("dimos", dString+","+address);
//阻止广播继续传递,如果该receiver比系统的级别高,
//那么系统就不会收到短信通知了 abortBroadcast();
}
}

获得短信内容跟短信地址:

package com.lmy.SmsListener;

import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage; public class SmsHelper {
/**
* 获得短信内容
* */
public static String getSmsBody(Intent intent) { String tempString = "";
Bundle bundle = intent.getExtras();
Object messages[] = (Object[]) bundle.get("pdus");
SmsMessage[] smsMessage = new SmsMessage[messages.length];
for (int n = 0; n < messages.length; n++) {
smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
// 短信有可能因为使用了回车而导致分为多条,所以要加起来接受
tempString += smsMessage[n].getDisplayMessageBody();
}
return tempString; } /**
* 获得短信地址
* */
public static String getSmsAddress(Intent intent) { Bundle bundle = intent.getExtras();
Object messages[] = (Object[]) bundle.get("pdus");
return SmsMessage.createFromPdu((byte[]) messages[0])
.getDisplayOriginatingAddress();
}
}

在AndroidManifest.xml里声明并加权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lmy.SmsListener"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="7" /> <application
android:icon="@drawable/icon"
android:label="@string/app_name">
<activity
android:name=".SmsListenerActivity"
android:label="@string/app_name">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <receiver
android:name="MyBrocast"
android:enabled="true">
<intent-filter>
<action
android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter> </receiver>
<service android:name="MyService"></service> </application>
<uses-permission
android:name="android.permission.RECEIVE_SMS" /><!-- 接收短信权限 -->
<!-- 添加接收系统启动消息(用于开机启动)权限 -->
<uses-permission
android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
</manifest>

这样就可以获得接收到的短信了,赶快试下吧!

Android 接收短信的更多相关文章

  1. android接收短信——framework处理流程(android 5.1)

    modem层不懂,所以直接从RIL.java开始.以电信卡接收短信为例 modem通知RIL.java中的 RILReceiver处理接收信息 class RILReceiver implements ...

  2. Android接收短信

    Android收到短信时会广播android.provider.Telephony.SMS_RECEIVED消息,因此只要定义一个Receiver,收听该消息,就能接收短信. <receiver ...

  3. android拦截短信并屏蔽系统的Notification

    拦截短信有几个关键点: 1.android接收短信时是以广播的方式 2.程序只要在自己的Manifest.xml里加有"接收"SMS的权限 <uses-permission  ...

  4. android 发送短信的两种方式,以及接收报告和发送报告

               android发送短信,以及接收报告和发送报告          android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下:    一.调起系统发短信功能    ...

  5. android基础---->发送和接收短信

    收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这项功能,而Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持.今天我们开始自己创建一个简单的发送和接收短 ...

  6. android学习十四(android的接收短信)

    收发短信是每一个手机主要的操作,android手机当然也能够接收短信了. android系统提供了一系列的API,使得我们能够在自己的应用程序里接收和发送短信. 事实上接收短信主要是利用我们前面学过的 ...

  7. Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容

    在上一篇文章 Android简单实现BroadCastReceiver广播机制 中简单的实现了一个广播机制,这里利用BroadCarstRecevier实现一个接收短信并显示内容的案例,当然至于接收到 ...

  8. android发送短信验证码并自动获取验证码填充文本框

    android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框. 一.接入短信平台 首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com) ...

  9. android手机短信获取

    关于Android中对短信的一些相关操.我看到一个文章下面我就从标题中的三个方面来对Android系统中的短信操作进行一个简单地学习. 短信发送: 由于Android中对短信发送方法的优良封装,之后对 ...

随机推荐

  1. 判断微信内置浏览器的UserAgent

    要区分用户是通过"微信内置浏览器"还是"原生浏览器"打开的WebApp, 可以通过navigator.userAgent来进行判断. 以下是对各种平台上微信内置 ...

  2. Ember.js demo3

    <!DOCTYPE html> <html> <head> <script src="http://code.jquery.com/jquery.j ...

  3. C# ASP.NET FILEUPLOAD详解

    显示一个文本框控件和一个浏览按钮,使用户可以选择要上载到服务器的文件. 命名空间: System.Web.UI.WebControls 程序集: System.Web(在 system.web.dll ...

  4. FORM - 实现某数据项自动按记录序号加一操作

    ---- 设块名为VO,要操作的数据项为VO_ID,在该块中建立块级触发子WHEN-CREATE- RECORD,每当生成新记录时VO_ID就会自动加一了,加入如下代码: :VO_ID:=:Syste ...

  5. NOI2010航空管制

    2008: [Noi2010]航空管制 Time Limit: 10 Sec  Memory Limit: 552 MBSubmit: 31  Solved: 0[Submit][Status] De ...

  6. [转] KMP算法详解

    转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的K ...

  7. redis 用setbit(bitmap)统计活跃用户

    getspool.com的重要统计数据是实时计算的.Redis的bitmap让我们可以实时的进行类似的统计,并且极其节省空间.在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的 ...

  8. nodejs调试工具node-inspector入门随笔

    最近打算玩玩node. 众所周知,在前端,调试代码有一众天然好工具——浏览器!特别是 chrome,使得 jser 们如鱼得水,玩得风生水起.但是到了node,情况就不一样了,js 代码不再运行在单纯 ...

  9. bzoj 3926 [Zjoi2015]诸神眷顾的幻想乡(SAM)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3926   [题意]   给定一棵树,每个节点都有相应的颜色,且保证叶子数不超过20,问 ...

  10. HW2.14

    import java.util.Scanner; public class Solution { public static void main(String[] args) { final dou ...