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

Android学习(1)——接收和发送短信

2015-10-24 21:05 507 查看
Android手机都会内置一个短信应用程序,使用它就可以轻松地完成收发短信的操作。同时Android还提供了一系列的API,使得我们可以在自己的应用程序里接收和发送短信。

当手机接收到一条短信的时候,系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这条广播里携带着与短信相关的所有数据。每个应用程序都可以在广播接收器里对它进行监听,收到广播时再从中解析出短信的内容即可。

举个例子吧,新建一个SMSTest项目,首先修改activity_main.xml中的代码,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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="50dp" >

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

<TextView
android:id="@+id/content"
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="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>


这里是MainActivity文件,注意点已经都写在了程序里面,自己看吧。。。

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 {

// 收到的发送方号码
private TextView sender;

// 收到的短信内容
private TextView content;

// 要发送的号码
private EditText to;

// 要发送的内容
private EditText msgInput;

// 点击发送
private Button send;

// 注册MessageReceiver接收器
private IntentFilter receiveFilter;

// MessageReceiver接收对象
private MessageReceiver messageReceiver;

// 注册SendStatusReceiver接收器
private IntentFilter sendFilter;

// SendStatusReceiver接收对象
private SendStatusReceiver sendStatusReceiver;

@Override
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);
to = (EditText) findViewById(R.id.to);
msgInput = (EditText) findViewById(R.id.msg_input);
send = (Button) findViewById(R.id.send);

/**
* 动态注册广播技术,短信接收
* */
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);

send.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 获取SmsManager实例
SmsManager smsManager = SmsManager.getDefault();
// 这个里面传递的SENT_SMS_ACTION和上面动态注册时的一样,所以能够与那个广播联系在一起。
Intent sentIntent = new Intent("SENT_SMS_ACTION");
// 获取一个PendingIntent对象,
PendingIntent pi = PendingIntent.getBroadcast(
MainActivity.this, 0, sentIntent, 0);
// 发送短信
// 第一个参数是目的号码,第三个参数是短信内容,第四个参数pi用来对短信的发送状态进行监控
smsManager.sendTextMessage(to.getText().toString(), null,
msgInput.getText().toString(), pi, null);
}
});
}

@Override
protected void onDestroy() {
super.onDestroy();
/**
* 取消动态注册的广播接收器
* */
unregisterReceiver(messageReceiver);
unregisterReceiver(sendStatusReceiver);
}

/**
* 创建一个广播接收器来接收系统发出的短信广播
* */
class MessageReceiver extends BroadcastReceiver {

/**
* 编写获取短信数据的逻辑
* */
@Override
public void onReceive(Context context, Intent intent) {
// 首先从Intent参数中取出一个Bundle对象
Bundle bundle = intent.getExtras();
// 然后使用pdu密钥来提取一个SMS pdus数组,其中每一个pdu都表示一个字节数据(这里和原文有差异)
Object[] pdus = (Object[]) bundle.get("pdus");
// 接着使用SmsMessage的createFromPdu()方法将每一个pdu字节数组转换为SmsMessage对象
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < messages.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
// 调用这个对象的getOriginatingAddress()方法就可以获取到短信的发送方号码
String address = messages[0].getOriginatingAddress();
// 调用getMessageBody()方法就可以获取到短信的内容,并将它们拼接起来,组成完整的短信内容。
String fullMessage = "";
for (SmsMessage message : messages) {
fullMessage += message.getMessageBody();
}
// 然后将发送方号码和短信内容显示在TextView上。
sender.setText(address);
content.setText(fullMessage);
// 终止掉广播的继续传递,但这个功能要慎用。
abortBroadcast();
}

}

/**
* 用于监听短信发送状态
* */
class SendStatusReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
if (getResultCode() == RESULT_OK) {
Toast.makeText(context, "Send succeeded", Toast.LENGTH_LONG)
.show();
} else {
Toast.makeText(context, "Send failed", Toast.LENGTH_LONG)
.show();
}
}

}

}


该有的权限还是要加上才行的:
<?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="14"
android:targetSdkVersion="17" />

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

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