您的位置:首页 > 移动开发 > Android开发

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

2017-06-29 14:22 477 查看
效果图:




拨打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");
receive
4000
Filter.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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: