Android 接收短信
启动程序时启动一个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 接收短信的更多相关文章
- android接收短信——framework处理流程(android 5.1)
modem层不懂,所以直接从RIL.java开始.以电信卡接收短信为例 modem通知RIL.java中的 RILReceiver处理接收信息 class RILReceiver implements ...
- Android接收短信
Android收到短信时会广播android.provider.Telephony.SMS_RECEIVED消息,因此只要定义一个Receiver,收听该消息,就能接收短信. <receiver ...
- android拦截短信并屏蔽系统的Notification
拦截短信有几个关键点: 1.android接收短信时是以广播的方式 2.程序只要在自己的Manifest.xml里加有"接收"SMS的权限 <uses-permission ...
- android 发送短信的两种方式,以及接收报告和发送报告
android发送短信,以及接收报告和发送报告 android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下: 一.调起系统发短信功能 ...
- android基础---->发送和接收短信
收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这项功能,而Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持.今天我们开始自己创建一个简单的发送和接收短 ...
- android学习十四(android的接收短信)
收发短信是每一个手机主要的操作,android手机当然也能够接收短信了. android系统提供了一系列的API,使得我们能够在自己的应用程序里接收和发送短信. 事实上接收短信主要是利用我们前面学过的 ...
- Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容
在上一篇文章 Android简单实现BroadCastReceiver广播机制 中简单的实现了一个广播机制,这里利用BroadCarstRecevier实现一个接收短信并显示内容的案例,当然至于接收到 ...
- android发送短信验证码并自动获取验证码填充文本框
android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框. 一.接入短信平台 首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com) ...
- android手机短信获取
关于Android中对短信的一些相关操.我看到一个文章下面我就从标题中的三个方面来对Android系统中的短信操作进行一个简单地学习. 短信发送: 由于Android中对短信发送方法的优良封装,之后对 ...
随机推荐
- 关于mIdleHandlers 空闲消息
模拟情况说明 创建一个handler对象 该handler持有的是主线程 1.先发送一个延时20秒的message what=35;2.紧接着又发送一个延时10秒的Runnable3.在该Runnab ...
- 阿里云数加平台——BI报表使用概述和总结
先声明一点,本人写此文章初衷只为对前段时间的工作做些总结,并做个记录,以备日后查用,此外也顺便与他人分享一下.当然间接上也为阿里云的大数据平台做了个免费广告.以下开始正文. 首先进入数加服务的控制面板 ...
- BZOJ_3282_Tree_(LCT)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3282 给出n个点以及权值,四种操作: 0.求x,y路径上的点权值的异或和. 1.连接x,y. ...
- VS2012启用SQLite的Data Provider
VS 2012默认是不带的SQLite的Data Provider,所以无法直接在VS 2012里管理SQLite的数据库,自然也不能在VS里像SQL Server那样直接生成Entity Frame ...
- POJ2236 Wireless Network 并查集
水题 #include<cstdio> #include<cstring> #include<queue> #include<set> #include ...
- bootstrap -- 一个标签中,同时有 col-xs , col-sm , col-md , col-lg
.col-xs- 超小屏幕 手机 (<768px) .col-sm- 小屏幕 平板 (≥768px) .col-md- 中等屏幕 桌面显示器 (≥992px) .col-lg- 大屏幕 大桌面显 ...
- 远程连接centos
yum install tigervnc yum install tigervnc-server Windows 7下载客户端 tigervnc-1.2.0.exe,在http://sourcef ...
- wuzhicms后台菜单的添加
红色部分都是从菜单管理处添加而来.只有少数是自定义的. 开发一个模块,首先就是菜单的管理.而,不需要的功能也可以在在菜单管理处隐藏或删除. 添加菜单:
- vijosP1413 Valentine’s Present
vijosP1413 Valentine’s Present 链接:https://vijos.org/p/1413 [思路] 组合公式. 由题目知:每个箱子中的蛋糕要么与箱子颜色相同,要么指向一个蛋 ...
- Java 并发之线程安全
写线程安全的代码,说白了就是管理一个类的共享的.可变的状态.只要有多于 1 个线程对类的状态进行写入,那么就必须用同步来协调这多个线程对状态的访问.对于一个没有状态的类来说(简单的理解就是只有方法没有 ...