安卓学习之接收、发送短信

短信接收

android中当手机接收到一条短信后,会发送android.provider.Telephony.SMS_RECEIVED 的广播,这条广播中携带有与短信相关的所有数据。每个应用程序都可以在广播接收器里对他监听。

简单的短信接收程序:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sender = (TextView) findViewById(R.id.sender);
        content = (TextView) findViewById(R.id.content);

        //设置过滤器
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");

        //获取MessageReceiver实例
        messageReceiver = new MessageReceiver();

        //注册广播
        registerReceiver(messageReceiver,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(messageReceiver);
    }

    //接收短信广播接收器
    class MessageReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {

            //使用 pdu 密钥来提取一个 SMS pdus 数组 ,其中每一个 pdu 都表示一条短信消息
            Object[] smsPdus = (Object[]) intent.getExtras().get("pdus");

            //用来储存消息
            SmsMessage[] smsMessage = new SmsMessage[smsPdus.length];

            /**
             * SmsMessage.createFromPdu((byte[]) smsPdus[i], format);
             * 第二个参数应该是短信的类型, GSM与CDMA短信的解码方式不同,所以应该传入这个参数
             * */
            String format = intent.getStringExtra("format");

            //将每一个 pdu 格式数组转换为 SmsMessage 对象
            for(int i = 0; i < smsMessage.length; i++){
                if(Build.VERSION.SDK_INT < 23) {
                    smsMessage[i] = SmsMessage.createFromPdu((byte[]) smsPdus[i]);
                } else {
                    smsMessage[i] = SmsMessage.createFromPdu((byte[]) smsPdus[i], format);
                }
            }

            //获取发送的号码
            String address = smsMessage[0].getOriginatingAddress();

            //将多段内容链接起来
            StringBuilder messageContent = new StringBuilder();
            for(SmsMessage message : smsMessage){
                messageContent.append(message.getMessageBody());
            }

            //设置视图内容
            sender.setText(address);
            content.setText(messageContent.toString());
        }
    }

在AndroidManifest.xml中添加

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

  由于收到短信系统会发送一条广播,那我们应该去监听这条广播,获取短信内容。 所以先要新建一个广播接收器类 MessageReceiver 继承自 Broadcast 。重写onReceiver()方法。

主要步骤:

   1.Intent.getExtras()方法获取一个Bundle对象,Bundle.get("pdus"); 获取短信内容; pdus是一个object类型的数组,每一个object都是一个byte[]字节数组,每一项为一条短信。

   2.将字节数组封装成SmsMessage类型,在android API 23以后 SmsMessage.createFromPdu((byte[]) ); 不在推荐使用,替代的是 SmsMessage.createFromPdu((byte[]) , format); 第二个参数代表手机制式;可以使用 intent.getStringExtra("format"); 获得。

   3.SmsMessage对象的getMessageBody()方法可以获得短信内容。getOriginatingAddress()可以获得发送方的号码。

  所以一旦接收到短信,系统发送 android.provider.Telephony.SMS_RECEIVED 广播,就会被动态注册的接收器接收,然后就会调用MessageReceiver的onReceiver()方法。

短信截断

  在android 4.4以后abortBroadcast()不能截断短信。

短信发送

  SmsManager对象有发送短信功能,可以调用SmsManager.getDefault()方法获取。

  SmsManager.sendTextMessage()方法有5个参数,第一个参数是目标号码,第三个参数是短信内容,第四个参数是一个PendingIntent对象。

  PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,0,Intent,0);该方法可以获取一个PendingIntent对象。

  现在来看一个例子:

SmsManager smsManager = SmsManager.getDefault();
Intent sendIntent = new Intent();
sendIntent.setAction("SENT_SMS_ACTION");
PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,0,sendIntent,0);

//发送短信/*
   sendTextMessage方法有5个参数,第一个参数指指定接收人的号码,第三个指定内容
*/
smsManager.sendTextMessage(to.getText().toString(),null,msgInput.getText().toString(),pi,null);

这里表示当发送短信时,我们自己写了一条广播,发出一条为 SENT_SMS_ACTION 的广播,由于在虚拟机上操作,我们可以来通过监听这个广播来观察短信发送是否成功。

到这里学习了基本的短信接收和发送功能。

时间: 2024-12-26 15:08:37

安卓学习之接收、发送短信的相关文章

Android学习--写一个发送短信的apk,注意布局文件的处理过程!!!

刚开始写Android程序如图发现使用了findViewById方法之后输出的话居然是null(空指针错误),也就是说这个方法没有成功.网上说这样写是在activity_main .xml去找这个ID所代表的控件,而现在使用的ADT在layout下除了activity_main .xml还多生成了一个fragment_main.xml.我就是把控件写在了后一个布局文件中.想请问下,使用什么样的方法是在fragment_main.xml去寻找控件呢? 回答:在PlaceHolderFragment

android: 接收和发送短信

8.2    接收和发送短信 收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这 项功能,而 Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持.每个 Android 手机都会内置一个短信应用程序,使用它就可以轻松地完成收发短信的操作,如 图 8.4 所示. 图   8.4 不过作为一名开发者,仅仅满足于此显然是不够的.你要知道,Android 还提供了一系 列的 API,使得我们甚至可以在自己的应用程序里接收和发送短信.也就是说,只要你有足 够的信

短信的接收,短信的发送

发送短信的几种方式: 第一种:直接发送一个隐式意图,访问android中自带的发送短消息 //1发送一个隐式意图用模拟器发送短消息  Intent intent = new Intent(Intent.ACTION_SENDTO);  Uri data = Uri.parse("smsto:"+"手机号码"); intent.setData(data);  intent.putExtra("sms_body", "短信内容&quo

Android接收和发送短信

每一部手机都具有短信接收和发送功能,下面我们通过代码来实现接收和发送短信功能. 一.接收短信 1.创建内部广播接收器类,接收系统发出的短信广播 2.从获得的内容中解析出短信发送者和短信内容 3.在Activity中注册广播 4.添加接收短信权限 下面放上具体的代码 activity_main.xml文件用于显示短信发送者号码和显示短信内容 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout

安卓笔记1——入门介绍及拨打电话和发送短信案例

现在开始接触安卓开发.以后后同步发出对应笔记.老规矩,用一张图来介绍今天的内容. 图片看不清的话可以右键新窗口打开. 一.开发工具 · Eclipse + ADT(Android Developer Tools) · Android Studio · SDK (软件开发环境, Android调试工具, 模拟等) 二.SDK目录介绍 · add-ons :(额外开发资料, google地图资源) · build-tools : 编译工具目录 · docs : 离线版开发文档 · extras : 

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

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

手机安全卫士------手机防盗页面之发送短信&amp;接收短信

功能需求: 接上一篇文章,如果sim卡变更,则发送一条报警短信给安全号码 接收从安全号码发来的短信,如果内容为报警指令,则根据相应的报警指令做出相应的操作 发送短信 1.创建一个SmsManager对象 SmsManager manager = SmsManager.getDefault(); 2.通过SharedPreferences获取安全号码 String number 3.创建短信内容: content 4.分割短信: 由于每条短信只能70个字,所以我们要把它分割一下:manager.d

java 学习第13课,android 实现发送短信的功能

1. 界面布局 界面代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView andro

Android软件开发之发送短信与系统短信库解析

今天我和同学们讨论一下Android平台下如何调用系统方法发送短信.接收短信.系统的短信库相关的问题.进入正题,我们先使用Eclipse工具模拟给自己的模拟器发送一条短信.在Eclipse下打开DDMS Incoming number: 这里须要填写的是发件人的手机号码,这里只能输入数字否则会无法发送. Message: 这里为发送的内容send: 上面两项都填写完毕点击发送键可以给模拟器发送短信. <ignore_js_op> 点击发送后,模拟器中就可以看到自己收到了一条消息 发件人的号码为