Android学习--多媒体功能:接收和发送短信

本文展示了如何在Android应用中实现短信的接收和发送功能。通过代码示例,详细解释了如何配置权限、监听短信到达并展示通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

效果图如下:

拨打1008611后会有短信过来

          

几秒钟后,Toast出消息,短信送达,对方已接收

同一时间,这边用于测试的手机收到短信

 

代码如下:

MainActivity.java

package com.example.smstest;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

	private TextView sender;
	private TextView content;
	private EditText to;// 接收人号码
	private EditText msgInput;// 短信内容
	private Button send;// 发送按钮

	private IntentFilter receiveFilter, sendFilter, deliveryFilter;// 过滤器
	private MessageReceiver messageReceiver;// 短信接收广播接收器,下面自定义这个广播
	private SendStatusReceiver sendstatusReceiver;// 发送状态广播接收器,下面自定义这个广播
	private DeliveryReceiver deliveryReceiver;// 短信送达状态广播,下面定义这个广播

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

		receiveFilter = new IntentFilter();
		receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
		receiveFilter.setPriority(100);// 设置优先级,不设置则接收不到,我也不知道为什么
		messageReceiver = new MessageReceiver();
		registerReceiver(messageReceiver, receiveFilter);// 注册短信接收广播

		sendFilter = new IntentFilter();
		sendFilter.addAction("SENT_SMS_ACTION");
		sendstatusReceiver = new SendStatusReceiver();
		registerReceiver(sendstatusReceiver, sendFilter);// 注册发送状态广播

		deliveryFilter = new IntentFilter();
		deliveryFilter.addAction("SENT_SMS_ACTION");
		deliveryReceiver = new DeliveryReceiver();
		registerReceiver(deliveryReceiver, deliveryFilter);// 注册送达状态广播

		sender = (TextView) findViewById(R.id.sender);
		content = (TextView) findViewById(R.id.content);
		to = (EditText) findViewById(R.id.to);
		msgInput = (EditText) findViewById(R.id.msg_input);
		send = (Button) findViewById(R.id.send);
		send.setOnClickListener(this);// 按钮事件在最下方写出,这里设置监听
	}

	class MessageReceiver extends BroadcastReceiver {// 定义短信接收广播
		/*
		 * 首先从Intent参数中取出一个Bundle对象,然后使用pdu密钥来提取一个SMS pdus数组,其中
		 * 每一个pdu都表示一条短信消息。接着使用SmsMessage的createFromPdu()方法将每一个
		 * pdu字节数组转换为SmsMessage对象,调用这个对象的getOriginatingAddress()方法
		 * 就可以获取到发送短信的发送方号码,调用getMessageBody()方法就可以获取到短信的内容,然后
		 * 将获取到的发送方号码和短信内容显示在TextView上。
		 */
		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub\

			Bundle bundle = intent.getExtras();
			Object[] pdus = (Object[]) bundle.get("pdus");// 提取短信消息
			SmsMessage[] messages = new SmsMessage[pdus.length];
			for (int i = 0; i < messages.length; i++) {
				messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
				String address = messages[0].getOriginatingAddress();// 获取发送方号码
				String fullMessage = "";
				for (SmsMessage message : messages) {
					if (message != null) {// 1008611来的短信前面会留白,使头几个字节为空,所以在此做一个判断,空格不是空字节。
						fullMessage += message.getMessageBody();// 获取短信内容
					}
				}
				// 如果号码前面带有+86,那么字符串从第四个开始取,即删除“+86”
				if (address.contains("+86")) {
					address = address.substring(3);
				}
				sender.setText(address);
				content.setText(fullMessage);
				// Toast.makeText(context,"接收到了短信",
				// Toast.LENGTH_SHORT).show();//定义优先级之前用于检测广播是否接收
				this.abortBroadcast();
				// 部分手机比如小米手机略屌,有个变态设定防止应用更改系统通知,
				// 要修改进入小米短信应用,按菜单键,选择设置选项,拉倒最下面一行的高级设置选中打开,有个系统短信优先开关,把这个关闭,就能使用abortBroadcast方法拦截短信了。
			}
		}
	}

	class SendStatusReceiver extends BroadcastReceiver {// 定义短信发送状态广播
		@Override
		public void onReceive(Context arg0, Intent arg1) {
			// TODO Auto-generated method stub
			if (getResultCode() == RESULT_OK) {
				// 短信发送成功
				Toast.makeText(getBaseContext(), "send succeeded",
						Toast.LENGTH_SHORT).show();
			} else {
				// 发送失败
				Toast.makeText(getBaseContext(), "send failed",
						Toast.LENGTH_SHORT).show();
			}
		}
	}

	class DeliveryReceiver extends BroadcastReceiver {// 定义短信送达状态广播

		@Override
		public void onReceive(Context arg0, Intent arg1) {
			// TODO Auto-generated method stub
			Toast.makeText(getBaseContext(), to.getText().toString() + "已接收短信",
					Toast.LENGTH_SHORT).show();
		}

	}

	@Override
	protected void onDestroy() {// 解绑广播
		super.onDestroy();
		unregisterReceiver(messageReceiver);
		unregisterReceiver(sendstatusReceiver);
		unregisterReceiver(deliveryReceiver);
	}

	@SuppressWarnings("deprecation")
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.send:
			String name = to.getText().toString();// 要发送的人
			String content = msgInput.getText().toString();// 短信内容
			if (name.equals("") || content.equals("")) {
				// Toast.makeText(getBaseContext(),"短信内容不可为空",Toast.LENGTH_SHORT).show();
			} else {
				@SuppressWarnings("deprecation")
				SmsManager smsManager = SmsManager.getDefault();
				Intent sentIntent = new Intent("SENT_SMS_ACTION");
				PendingIntent spi = PendingIntent.getBroadcast(
						MainActivity.this, 0, sentIntent, 0);

				Intent deliveryIntent = new Intent("DELIVERY_SMS_ACTION");
				PendingIntent dpi = PendingIntent.getBroadcast(
						MainActivity.this, 0, deliveryIntent, 0);
				
				smsManager.sendTextMessage(name, null, content, spi, dpi);
				msgInput.setText("");// 发送后清空短信内容框
				/*
				 * public void sendTextMessage(String destinationAddress, String
				 * scAddress, String text,PendingIntent sentIntent,
				 * PendingIntent deliveryIntent)
				 * destinationAddress:目的地,也就是对方的手机号 scAddress:
				 * 服务中心地址,为空的话就是默认的SMSC text: 发送消息的具体内容
				 * sentIntent:当消息成功或者失败发送时,就发起这个广播 deliveryIntent:
				 * 当消息到达目的地时,就发起这个广播
				 */}
		}
	}
}

 

 

 

布局,activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:padding="10dp"
            android:text="From:" />

        <TextView
            android:id="@+id/sender"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="200dp" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="top"
            android:padding="10dp"
            android:text="Content:" />

        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <TextView
                android:id="@+id/content"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical" />
        </ScrollView>
    </LinearLayout>
    
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:padding="10dp"
            android:text="To:"/>
        
        <EditText 
            android:id="@+id/to"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"/>
    </LinearLayout>
    
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="50dp"
        >
        
        <EditText 
            android:id="@+id/msg_input"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"/>
        <Button 
            android:id="@+id/send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="send"/>
        
    </LinearLayout>

</LinearLayout>

 

 

在AndroidManifest.xml中配置两条权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.smstest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
     <!--增加接收短信权限  --> 
    <uses-permission android:name="android.permission.RECEIVE_SMS" >
    </uses-permission>
    <!--增加发送短信权限  --> 
    <uses-permission android:name="android.permission.SEND_SMS" >
    </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.smstest.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>
    </application>

</manifest>

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值