您的位置:首页 > 其它

安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。

2017-10-22 09:55 627 查看
全栈工程师开发手册 (作者:栾鹏)

安卓教程全解

安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。

首先需要添加短信功能的权限

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


调用系统短信功能发送短信

注意:由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,因此这里只会启动系统短信发送界面,还没有自动发送

调用发送函数
send_message("12345678911","这是代码发送的一条短信");

短信发送函数
private void send_message(String number,String message) {
//使用系统短信服务栈发送短信
Intent smsintent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+number));
smsintent.putExtra("sms_body",message);
startActivity(smsintent);  //由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,因此这里只会启动系统短信发送界面,还没有自动发送
}


调用系统彩信功能发送媒体信息(彩信,邮件)

调用发送函数
send_mulmessage("12345678911","这是代码发送的一条彩信");

彩信发送函数
private void send_mulmessage(String number,String message) {
//获得要附加的一个媒体的uri
Uri attached_Uri=Uri.parse("content://media/external/images/media/1");
//创建一个新的MMS intent
Intent mmsIntent=new Intent(Intent.ACTION_SEND,attached_Uri);
mmsIntent.putExtra("sms_body", message);
mmsIntent.putExtra("address", number);
mmsIntent.putExtra(Intent.EXTRA_STREAM, attached_Uri);
mmsIntent.setType("image/jpeg");
startActivity(mmsIntent);
}


使用SmsManager 发送sms短信信息

使用SmsManager短信管理器发送短信,不会启动系统短信发送界面,但是由于短信在发送成功、失败、接收者接收成功、失败、是否已读等消息,安卓系统都会通过广播形式向系统所有app进行广播,所以仍然会在系统自带短信功能中留下痕迹。

在使用SmsManager发送短信时,需要自定义短信发送广播接收事件、短信送达广播接收事件。另外要注意将短信按运营商的限制长度进行分割。

由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,这种自动发送的短信,没法选择发送模式,所以会存在发送失败的情况

调用发送函数
sendsms("12345678911","这是代码发送的一条短信");

短信发送函数
private void sendsms(String number,String message) {
//获取短信管理器
android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault();

String sent_sms_action = "com.lp.app.send_sms_action";   //短信发送成功(只是一个名称)
String delivered_sms_action ="com.lp.app.delivered_sms_action";  //短信送达成功(只是一个名称)

//创建sentintent参数
Intent sentIntent = new Intent(sent_sms_action);
PendingIntent sendpi =PendingIntent.getBroadcast(getApplicationContext(), 0, sentIntent, PendingIntent.FLAG_UPDATE_CURRENT);

//创建deliveryintent参数
Intent deliveryIntent=new Intent(delivered_sms_action);
PendingIntent deliverpi = PendingIntent.getBroadcast(getApplicationContext(), 0, deliveryIntent, PendingIntent.FLAG_UPDATE_CURRENT);

//注册broadcast receiver,用于在消息发生成功或者失败时触发
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String resulttext = "unknown";
switch (getResultCode()) {
case Activity.RESULT_OK:resulttext="发送成功";break;
case android.telephony.SmsManager.RESULT_ERROR_GENERIC_FAILURE:resulttext="发送失败";break;
case android.telephony.SmsManager.RESULT_ERROR_RADIO_OFF:resulttext="发送失败,无线处于关闭状态";break;
case android.telephony.SmsManager.RESULT_ERROR_NULL_PDU:resulttext="发送失败,没有指定的PDU";break;
case android.telephony.SmsManager.RESULT_ERROR_NO_SERVICE:resulttext="发送失败,无服务";break;
default:break;
}
Log.v("发送的短信", resulttext);
}
}, new IntentFilter(sent_sms_action));  //用指定名称的事件来触发这个接收机

//注册broadcast receiver,用于仅在接收人接收到sms消息后触发
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String resulttext = "unknown";
switch (getResultCode()) {
case android.telephony.SmsManager.STATUS_ON_ICC_FREE:resulttext="自由空间";break;
case android.telephony.SmsManager.STATUS_ON_ICC_READ:resulttext="接收且已读";break;
case android.telephony.SmsManager.STATUS_ON_ICC_SENT:resulttext="存储且已发送";break;
case android.telephony.SmsManager.STATUS_ON_ICC_UNREAD:resulttext="接收但未读";break;
case android.telephony.SmsManager.STATUS_ON_ICC_UNSENT:resulttext="存储但未发送";break;
default:break;
}
Log.v("发送的短信", resulttext);
}

},  new IntentFilter(delivered_sms_action)); //用指定名称的事件来触发这个接收机

//拆分短信内容(手机短信长度限制)
List<String> divideContents = smsManager.divideMessage(message);
for (String text : divideContents) {
//由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,这种自动发送的短信,没法选择发送模式,所以会存在发送失败的情况
smsManager.sendTextMessage(number, null, text, sendpi, deliverpi);    //参数:接收人,所有用的SMS服务中心,消息内容,跟踪传输的intent,消息成功递送的intent
//smsManager.sendDataMessage(destinationAddress, scAddress, destinationPort, data, sentIntent, deliveryIntent);  //发送byte[]
//smsManager.sendMultipartTextMessage(destinationAddress, scAddress, parts, sentIntents, deliveryIntents);  //发送多部分字符串内容
}


广播监听接收到的短信

在系统接收到短信后,系统会全局广播一个事件,事件中附加了短信的全部内容信息,我们可以通过注册广播接收来获取短信内容和相关信息。

1、首先在manifest中注册一个广播接收

<!-- 短信接收监视-->
<receiver android:name="com.lp.app.advice.SMSReceiver" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>


2、自定义广播接收器,解析接收到的短信

import android.content.Intent;
import android.os.Bundle;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.util.Log;

//使用intent receiver监视接收的短信
public class SMSReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle=intent.getExtras();
if (bundle!=null) {
Object[] pdus = (Object[])bundle.get("pdus"); //pdus是一个object类型的数组,每一个object都是一个byte[]字节数组,每一项为一条短信。
android.telephony.SmsMessage[] messages = new android.telephony.SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++)
messages[i]=android.telephony.SmsMessage.createFromPdu((byte[])pdus[i]);
for(android.telephony.SmsMessage message: messages){
String msg = message.getMessageBody();   //获取消息内容
long when = message.getTimestampMillis();  //获取消息时间戳
String from =message.getOriginatingAddress();  //获取消息来源
Log.v("接收到的短息", "消息:"+msg);
Log.v("接收到的短息", "时间:"+when);
Log.v("接收到的短息", "发件人:"+from);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: