问题描述,如题写一个发送与接收短信的程序。最终界面如下:
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_weight="1"
android:layout_gravity="center_vertical"/>
</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>
首先是这个界面的布局文件,布局文件不用过多解释:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="
http://schemas.android.com/apk/res/android"
因为是接收和发送短信的应用,所以需要在配置文件中添加相应的权限,如下:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
下面就是具体的程序,我会在代码中给出相应的注释(包名引入忽略,如需代码可以ctrl+shift+o进行导入包):
public class ThirdActivity extends Activity{
private TextView sender;
private TextView content;
private IntentFilter receiveFilter; //
知识点1
private MessageReceiver messageReceiver; //
实例化
广播接收器,在下面创建
private EditText to;
private EditText msgInput;
private Button send;
private IntentFilter sendFilter;
private SendStatusReceiver sendStatusReceiver; //
另外建一个
广播接收器 SendStatusReceiver,监听 短信发送状态
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sender = (TextView) findViewById(R.id.sender);
content = (TextView) findViewById(R.id.content);
receiveFilter = new IntentFilter(); //
动态注册过滤器,知识点2.
receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
//
有序广播的传递是可以截断的, 而系统发出的短信广播正是一条有序广播,设置优先权,先于系统接收,然后 在onReceive()方法中调用 abortBroadcast()方法,中止掉广播的继续传递。
receiveFilter.setPriority(100);
messageReceiver = new MessageReceiver();
registerReceiver(messageReceiver, receiveFilter); //
动态对MessageReceiver 的实例进行注册,才能让它接收到短信广播,注意所需参数。在 onCreate()方
法中对 MessageReceiver 进行注册,在 onDestroy()方法中再对它取消注册。
to = (EditText) findViewById(R.id.to);
msgInput = (EditText) findViewById(R.id.msg_input);
sendFilter = new IntentFilter();
sendFilter.addAction("SENT_SMS_ACTION");
sendStatusReceiver = new SendStatusReceiver();
registerReceiver(sendStatusReceiver, sendFilter); //
注册了一个新的广播接收器 SendStatusReceiver,这个广播接收器就是专门用于监听 短信发送状态.
send = (Button) findViewById(R.id.send);
send.setOnClickListener(new OnClickListener() {
//
当 Send 按钮被点击时,会先调用 SmsManager 的 getDefault()方法获取到 SmsManager 的实例,然后再调用它的 sendTextMessage()方法就可以去发送短信了。sendTextMessage()方法接收五个参数。
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
SmsManager smsManager = SmsManager.getDefault();
Intent sentIntent = new Intent("SENT_SMS_ACTION");
PendingIntent pi = PendingIntent.getBroadcast(ThirdActivity.this, 0, sentIntent, 0);
//
发送短信的方法,注意参数。
smsManager.sendTextMessage(to.getText().toString(), null, msgInput.getText().toString(), pi, null);
}
});
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(messageReceiver); //
取消接收信息广播的注册。
unregisterReceiver(sendStatusReceiver);
}
class MessageReceiver extends BroadcastReceiver{ //
创建一个广播接收器来接收系统发出的短信广播
/*
首先我们从 Intent 参数中取出了一个 Bundle对象,然后使用 pdu 密钥来提取
一个 SMS pdus 数组,其中每一个 pdu 都表示一条短信消息。接着使用 SmsMessage 的
createFromPdu()方法将每一个 pdu 字节数组转换为 SmsMessage 对象,调用这个对象的
getOriginatingAddress()方法就可以获取到短信的发送方号码,调用 getMessageBody()方法就
可以获取到短信的内容,然后将每一个 SmsMessage 对象中的短信内容拼接起来,就组成了
一条完整的短信。最后将获取到的发送方号码和短信内容显示在 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){
fullMessage += message.getMessageBody(); //获取短信内容
}
sender.setText(address);
content.setText(fullMessage);
abortBroadcast(); //
中止
掉广播的继续传递
}
}
class SendStatusReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(getResultCode()==RESULT_OK){ //
getResultCode()的值等于 RESULT_OK就会提示发送成功
//短信发送成功
Toast.makeText(context, "Send succeeded", Toast.LENGTH_LONG).show();
}else{
//短信发送失败
Toast.makeText(context, "Send failed", Toast.LENGTH_LONG).show();
}
}
}
}
学到的知识点:
知识点1:
IntentFilter类表示Intent过滤器,
一般来说,,IntentFilter应该在
Android
Manifest.xml文件中定义。
intent最多只能定义1个action, 而filter可以定义1个或多个action。
如果filter没有定义action, 则这个filter将阻塞所有intent。如果intent没有定义action, 那么只要filter定义了action就可以通过action测试。本程序是动态注册。
知识点2:动态注册广播接收器和过滤器,淡紫色的四行代码。
知识点3:发送短信的具体代码,以及各个参数,onReceive()方法中具体有体现。
到这里,一个接收发送短信的应用就创建完成了。