本人是Android新手,最近做了一个关于监听手机短信功能的应用,我在网上看资料了解到广播分为有序广播和无序广播,有序广播;无序广播又称普通广播,其中的利弊我也一时没搞清楚,我用的是有序广播实现的,具体思路如下

1、定义一个接收短信的广播

2、当系统接收到短信时,拦截短信,获取短信内容

3、将指定的短信内容转发到服务器

下面是我的实现方法

1、添加一个短消息接收类

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast; public class MessageBroadcastReceiver extends BroadcastReceiver {
private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
String uri="http://127.0.0.1:8080/Home/SmsHandler"; @Override
public void onReceive(Context context, Intent intent) {
//监听短信广播
if (intent != null && intent.getAction() != null
&& ACTION.compareToIgnoreCase(intent.getAction()) == ) {
Object[] pduArray = (Object[]) intent.getExtras().get("pdus");
SmsMessage[] messages = new SmsMessage[pduArray.length];
//SmsManager sms=SmsManager.getDefault();
String localTelPhoneNumber=getPhoneNumber(context); for (int i = ; i < pduArray.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i]);
if(messages[i].getDisplayMessageBody().contains("测试数据")) //制定短信转发过滤条件
{
String filterSms=messages[i].getDisplayMessageBody();
Map<String, String> params=new HashMap<String, String>();
params.put("phoneNumber", localTelPhoneNumber);
params.put("smsContent", filterSms);
try {
sendHttpClientPOSTRequest(uri,params,"UTF-8");
Toast.makeText(context,
"短信验证码已转发!",
Toast.LENGTH_LONG).show();
// show first message
} catch (Exception e) {
Toast.makeText(context,
e.toString(),
Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
}
Log.d("ConvertToMsg", "SMS Message Received.");
}
} /**
* 通过HttpClient发送Post请求
* @param path 请求路径
* @param params 请求参数
* @param ecoding 请求编码
* @return 请求是否成功
*/
private boolean sendHttpClientPOSTRequest(String path,
Map<String, String> params, String ecoding) throws Exception { List<NameValuePair> pair=new ArrayList<NameValuePair>();//存放请求参数 if(params!=null && !params.isEmpty()){
for (Map.Entry<String, String> entry : params.entrySet()) {
pair.add(new BasicNameValuePair(entry.getKey(),entry.getValue()));
}
} UrlEncodedFormEntity enFormEntity=new UrlEncodedFormEntity(pair,ecoding);
HttpPost httpPost=new HttpPost(path);
httpPost.setEntity(enFormEntity);
DefaultHttpClient client=new DefaultHttpClient();
HttpResponse response=client.execute(httpPost);
if(response.getStatusLine().getStatusCode()==){
return true;
} return false;
} /* getPhoneNumber方法返回当前手机的电话号码,
* 同时必须在androidmanifest.xml中
* 加入 android.permission.READ_PHONE_STATE 这个权限
*/
private String getPhoneNumber(Context context){
TelephonyManager mTelephonyMgr;
mTelephonyMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return mTelephonyMgr.getLine1Number();
}
}

短信接收广播

 import com.example.testdemo.MessageBroadcastReceiver;
import com.example.testdemo.R;
import android.os.Bundle;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.telephony.TelephonyManager;
import android.view.KeyEvent;
import android.view.Menu;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); String phoneNumber = getPhoneNumber(this); if(phoneNumber == ""){
Toast.makeText(this,
"程序错误!",
Toast.LENGTH_LONG).show();
return;
}else{
Toast.makeText(this,
phoneNumber,
Toast.LENGTH_LONG).show();
} //注册短信广播
final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
IntentFilter filter = new IntentFilter(SMS_RECEIVED);
BroadcastReceiver receiver = new MessageBroadcastReceiver();
registerReceiver(receiver, filter);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
protected void onDestroy() {
super.onDestroy();
} /*重写Home键盘事件,使程序后台运行*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
PackageManager pm = getPackageManager();
ResolveInfo homeInfo =
pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), );
if (keyCode == KeyEvent.KEYCODE_BACK) {
ActivityInfo ai = homeInfo.activityInfo;
Intent startIntent = new Intent(Intent.ACTION_MAIN);
startIntent.addCategory(Intent.CATEGORY_LAUNCHER);
startIntent.setComponent(new ComponentName(ai.packageName, ai.name));
startActivitySafely(startIntent);
return true;
} else
return super.onKeyDown(keyCode, event);
} private void startActivitySafely(Intent intent) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(this, "null",
Toast.LENGTH_SHORT).show();
} catch (SecurityException e) {
Toast.makeText(this, "null",
Toast.LENGTH_SHORT).show();
}
} /**
* 1. getPhoneNumber方法返回当前手机的电话号码,
* 同时必须在androidmanifest.xml中
* 加入 android.permission.READ_PHONE_STATE 这个权限
*/
private String getPhoneNumber(Context context){
TelephonyManager mTelephonyMgr;
mTelephonyMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
return mTelephonyMgr.getLine1Number().trim();
}
}

在MainActivity中调用广播

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testdemo"
android:versionCode=""
android:versionName="1.0" > <uses-sdk
android:minSdkVersion=""
android:targetSdkVersion="" />
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
<!-- <uses-permission android:protectionLevel="normal" android:name="android.permission.SEND_SMS"></uses-permission> -->
<!-- Http权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 开机启动完成权限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.testdemo.MainActivity"
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=".BootStartBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>

在MainFest.xml添加权限

好了,配置好之后就可以编译你的项目了,在手机上安装测试可以正常运行,但是有一些问题,就是在某些手机上短信广播接收不到,例如小米和以前的某些牌子的老款智能手机,我在网上查了查,有认说是广播优先级问题,同是短信应用软件,先安装的优先级高,还有一种情况,是软件本身的优先级高,但是都没有提出具体的解决方案,还有一个原因就是系统本身的安全机制,由于某些设置导致短信应用软件不能正常使用,例如小米手机,在短信设置里面好像有一项和短信接收有关的设置,调整之后就可以接收了,但其他手机还没有解决,如果有哪个大牛有好的解决方案,给小弟指点迷津,感激不尽。

Android 短信广播接收相关问题的更多相关文章

  1. android短信的接收和发送处理

    一 初始化 手机开机初始化调用GSMPhone 构造函数. GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifie ...

  2. Android短信收到,语音播报

    发送短信功能界面 /** * 发送短信Demo * * @description: * @author ldm * @date 2016-4-22 上午9:07:53 */ public class ...

  3. Android之发送短信和接收验证码

      最近项目需求需要发送短信和接收验证码并将验证码显示在输入框中 以下是我的记录    前提---权限     <uses-permission android:name="andro ...

  4. BroadcastReceiver 接收系统短信广播

    BroadcastReceiver 接收系统短信广播 /* 注册广播:    * |--静态注册  (在AndroidManifest .xml 中注册)  * <receiver androi ...

  5. Android 短信监听及用途分析

    监听系统短信这个只能作为一个技术点来研究下,读者可能在工作中可能不会哦涉及到,一般的应用软件也不会有这个需求 但是作为程序员呢,多了解一下也是好的. Android 监听系统短信有什么用? 1.对系统 ...

  6. Android短信监听实现,及Android4.4之后短信机制变更

    前阵子公司有一个项目,简单的监听短信应用,功能只有如下两个: 1.监听短信并获取短信内容上传服务器: 2.从服务器获取短信内容,发送出去    按照传统的思路,监听短信我们有两种方式:第一种是使用广播 ...

  7. Android 短信拦截及用途分析

    监听系统短信这个只能作为一个技术点来研究下,读者可能在工作中可能不会哦涉及到,一般的应用软件也不会有这个需求 但是作为程序员呢,多了解一下也是好的. Android 监听系统短信有什么用? 1.对系统 ...

  8. Android短信监听软件

    本案例是在android手机中运行,是一个没有界面的短信监听软件.主要是用BroadcastReceiver来接受短信广播,当接收到短信后就跳转到service中来转发短信.哈哈,不是用来干坏事的.这 ...

  9. 【mob】Android短信验证+源码

    在很多的应用当中,都涉及到了短信验证的功能,比如在注册或者找回密码的时候,那么我们如何通过第三方的平台来完成这个功能呢? 本面博文就实现短信验证,来做一个小的栗子. 第一步-下载开发包 第二步-将SD ...

随机推荐

  1. 《实时控制软件设计》第一周作业 欧梓峰 U201317662 (更新)

    CNC 插补计算程序分析 前言:插补(Interpolation),即机床数控系统依照一定方法确定刀具运动轨迹的过程.一般是已知起点坐标.终点坐标和轨迹,由数控插补计算程序实时的算出各个中间的坐标来拟 ...

  2. 怎样解决Myeclipse中运行jsp乱码问题,亲测有效(虽然是个小问题但是为了大家不被网络上的一些乱七八糟的回答坑)不是改什么windows-propories-...............

    方法: 在jsp页面中pageEncoding属性值改为UTF-8,指定用UTF-8编码.gbk或者gb18030编码都无效.不是改什么windows-propories-.............. ...

  3. 阿里云服务器Linux CentOS安装配置(七)域名解析

    阿里云服务器Linux CentOS安装配置(七)域名解析 1.购买域名 登录阿里云,左侧菜单点击[域名],然后[域名注册],完成域名购买.(一般首年45元) 2.添加域名解析 在域名列表里点击你的域 ...

  4. SSH配置中出现问题

    问题1:org.springframework.beans.factory.NoSuchBeanDefinitionException: org.springframework.beans.facto ...

  5. Sony Z1 flashtool 刷机笔记

    第一次硬刷,(相较于recovery的卡刷)差点变成无限重启..记录一些关键步骤: 1 unlock bootloader http://developer.sonymobile.com/unlock ...

  6. JQuery中的选择器的总结

    JQuery的选择器十分的强大,但是我平常经常用到的却十分的有限,趁现在有时间我感觉有必要总结一下. 基本选择器 $("#ID") 选择ID所对应的标签元素 返回一个标签元素$(& ...

  7. mysql临时禁用触发器

    mysql支持设定session变量,并且有带入到触发器中使用的能力,故可以间接的设置触发器失效 思路是: 在执行前设定一个session变量,执行过程中判断该变量的值(没有设定该变量的值时该变量默认 ...

  8. laravel5 使用model 表名总是多个s

      正常,如果不要s,请在model 指定表名. class user extend Model{ public $table='user';//这样寻找的就是没s的表 }

  9. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

  10. 在使用Intelligencia.UrlRewriter过程中 中文乱码问题

    由于业务需求,最近将项目部分模块修改为伪静态,使用到了Intelligencia.UrlRewriter.dll组件. 网上对使用Intelligencia.UrlRewriter.dll的配置讲解很 ...