Android手机使用广播监听手机收到的短信

我们使用的Android手机在收到短信的时候会发出一条系统广播。该条广播中存放着接收到的短信的详细信息。本文将详细介绍如何通过动态注册广播来监听短信。

注册广播有两种方式,一种是动态注册,另一种是静态注册。动态注册,顾名思义就是在程序运行时注册的,需要用到广播的时候就注册,用完即销毁。静态注是在AndroidManifest.xml中注册的,在<application>中使用<receiver>标签注册。

那么如何创建一个监听短信的广播接收器呢,其实只需要新建一个类,让这个类继承BroadcastReceiver,并重写父类的onReceiver方法就可以了。当有广播来了,onReceiver()方法就会执行。

首先创建一个ListenerSMSBroadcast项目。然后在MainActivity中修改添加代码。现在在MainActivity中创建一个SMSBroadcastReceiver类并继承BroadcastReceiver,然后重写onReceiver方法。

 1 class SMSBroadcastReceiver  extends BroadcastReceiver{
 2
 3         @Override
 4         public void onReceive(Context arg0, Intent intent) {
 5              6             Object[] object=(Object[]) intent.getExtras().get("pdus");
 7             StringBuilder sb=new StringBuilder();
 8             for (Object pdus : object) {
 9                 byte[] pdusMsg=(byte[]) pdus;
10                 SmsMessage sms=SmsMessage.createFromPdu(pdusMsg);
11                 String mobile=sms.getOriginatingAddress();//发送短信的手机号
12                 String content=sms.getMessageBody();//短信内容
13                 //下面是获取短信的发送时间
14                 Date date=new Date(sms.getTimestampMillis());
15                 String date_time=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
16                 //追加到StringBuilder中
17                 sb.append("短信发送号码:"+mobile+"\n短信内容:"+content+"\n发送时间:"+date_time+"\n\n");
18         19             }
20             Message msg=new Message();
21             msg.what=RECEIVERED_MSG;
22             msg.obj=sb.toString();
23             handler.sendMessage(msg);
24         }
25
26     }

以上代码可以看到,SMSBroadcastReceiver类继承了BroadcastReceiver 而且重写了onReceive()方法。在onReceiver()方法中使用intent.getExtras().get("pdus")获取到了一个Object[]类型的数组,而且每一个Object都是byte类型的。然后使用for循环遍历数组,最后使用Handler将短信内容显示在activity中。

下面是动态注册广播。

private IntentFilter intentFilter;
    private SMSBroadcastReceiver smsBroadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_msg=(TextView) findViewById(R.id.tv_msg);
        intentFilter=new IntentFilter();
        intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
        smsBroadcastReceiver=new SMSBroadcastReceiver();
        //动态注册广播
        registerReceiver(smsBroadcastReceiver, intentFilter);
    }

在这段代码中声明了一个IntentFilter对象,并给它添加了一个值为android.provider.Telephony.SMS_RECEIVED的action。为什么要给它添加这个值呢?因为当手机收到短信的时候系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这正是要监听的广播。接着就创建了一个SMSBroadcastReceiver实例。然后调用registerReceiver()方法注册广播,这里讲SMSBroadcastReceiver实例和IntentFilter实例都传进去,这样SMSBroadcastReceiver就会收到系统收到短信时发送的广播了。

注意,这里面读取短信,所以需要添加读取短信权限的。只要在AndroidManifest.xml中添加一些权限:

1 <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

既然是动态注册广播接收器,一定要取消注册。取消注册需要调用unregisterReceiver()来实现。这里面是在onDestroy()方法中取消注册的。

1     protected void onDestroy() {
2         super.onDestroy();
3         //取消注册广播
4         unregisterReceiver(smsBroadcastReceiver);
5     }

本文用到了Handler来修改页面中TextView的text的属性值得。message.what来判断是否要修改text的值,message.obj中是修改的值。

1 private Handler handler=new Handler(){
2
3         public void handleMessage(android.os.Message msg) {
4             if(msg.what==RECEIVERED_MSG)
5             {
6                 tv_msg.setText("收到的信息:\n"+msg.obj);//\n表示换行
7             }
8         };
9     };
时间: 2024-10-12 16:49:15

Android手机使用广播监听手机收到的短信的相关文章

Android获取手机状态和监听手机来电状态

获取手机状态: import android.content.Context; import android.telephony.TelephonyManager; //获得相应的系统服务 TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); /** * 返回电话状态 * * CALL_STATE_IDLE 无任何状态时 * CALL_STATE_OFFHOOK 接起电话时 *

求助 利用广播监听 手机拨号 在虚拟机上能运行 真机没法应

部分代码 如下   求大神 解答 public class OutgoingCallReceiver extends BroadcastReceiver { @SuppressLint("ShowToast") @Override public void onReceive(Context context, Intent intent) { String phone = this.getResultData();//得到外拔电话 System.out.println("拨号&

Android studio之广播监听接收短信

一. 在清单文件中(AndroidManifest.xml)添加短信权限 这里我用的android studio版本是3.3的 <uses-permission android:name="android.permission.READ_SMS" /><uses-permission android:name="android.permission.RECEIVE_SMS" /><uses-permission android:name

广播监听手机中应用程序是否安装并卸载

public class PackageReceiver extends BroadcastReceiver { private static final int PACKAGE_NAME_INDEX = 8; @Override public void onReceive(Context context, Intent intent) { if (intent != null) { /**安装程序的ACTION为Intent.ACTION_PACKAGE_ADDED*/ if (intent.

(转)[Android实例] 关于使用ContentObserver监听不到删除短信会话的解决方案

最近做通讯录的项目,需要实时监听短信的删除,就用到了观察者ContentObserver,怪异的事情就此发生,当我删除一条短信的时候,可以监听到,但是,当我删除整条短信的时候,就无法监听到,查了很多资料,都没有一个好的解决方案,顺便吐糟一下:大家来eoe发问题,问题解决了,也不说把解决的方法给大家分享一下... OK,先看源码吧com.android.providers.telephony.MmsSmsProvider这个类的删除操作源码 @Override    public int dele

使用BroadcastReceiver监听系统接收的短信

import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsMessage;import android.widget.Toast; public class SmsReceiver extends BroadcastReceiver{ //当接收短

android动态注册广播监听服务demo

服务类,一定要在清单文件中注册 public class lightService extends Service { private boolean ifrun = false; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); System.

监听手机录音

需求分析: 记录通话过程中的录音,并保存到指定路径~ 知识点:1.手机开机发出广播,广播接受者收到通知,开启service服务 2.Service工作流程: 1.获取手机管理对象· 2.注冊监听器,对应手机状态 3.依据手机状态(振铃.通话.空暇),创建Mediaplay对象,暂停 这里监听手机状态,加入?权限 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 代码: Telephon

Android利用广播监听按下HOME和电源键

package cc.testhome; import cc.testhome.HomeKeyObserver.OnHomeKeyListener; import cc.testhome.PowerKeyObserver.OnPowerKeyListener; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 利用广播监听Home键的按下和长按Home键 * 利用广播监听电源键的按下(关闭屏幕) * *