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

来源:互联网 发布:python 使用相对路径 编辑:程序博客网 时间:2024/06/06 00:14

效果图:

拨打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;// 短信送达状态广播,下面定义这个广播@Overrideprotected 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上。 */@Overridepublic 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 {// 定义短信发送状态广播@Overridepublic void onReceive(Context arg0, Intent arg1) {// TODO Auto-generated method stubif (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 {// 定义短信送达状态广播@Overridepublic void onReceive(Context arg0, Intent arg1) {// TODO Auto-generated method stubToast.makeText(getBaseContext(), to.getText().toString() + "已接收短信",Toast.LENGTH_SHORT).show();}}@Overrideprotected void onDestroy() {// 解绑广播super.onDestroy();unregisterReceiver(messageReceiver);unregisterReceiver(sendstatusReceiver);unregisterReceiver(deliveryReceiver);}@SuppressWarnings("deprecation")@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (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>




原创粉丝点击