安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。
2017-10-22 09:55
627 查看
全栈工程师开发手册 (作者:栾鹏)
安卓教程全解
安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。
首先需要添加短信功能的权限
在使用SmsManager发送短信时,需要自定义短信发送广播接收事件、短信送达广播接收事件。另外要注意将短信按运营商的限制长度进行分割。
由于目前手机多存在双卡双待、网络短信,所以还需要选择发送的卡,这种自动发送的短信,没法选择发送模式,所以会存在发送失败的情况
1、首先在manifest中注册一个广播接收
2、自定义广播接收器,解析接收到的短信
安卓教程全解
安卓短信功能全解:调用系统短信功能发送短信、彩信,使用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); } } } }
相关文章推荐
- iOS-调用系统的短信和发送邮件功能,实现短信分享邮件分享
- 调用系统的短信和发送邮件功能,实现短信分享邮件分享
- iOS-调用系统的短信和发送邮件功能,实现短信分享邮件分享
- iOS - (调用系统本机发送短信功能)
- iOS-调用系统的短信和发送邮件功能,实现短信分享邮件分享
- android 使用广播 接收和拦截 android系统短信
- android 使用广播接收者监听短信和拦截外拨电话
- 详解Android短信的发送和广播接收实现短信的监听
- 小胖说事8------iOS 调用系统的短信和发送邮件功能,实现短信分享邮件分享
- iOS-调用系统的短信和发送邮件功能,实现短信分享邮件分享
- 安卓开发之使用Mob的短信接收验证码达到忘记密码找回密码功能*(自绘界面)
- 使用NowSMS Gateway来接收发送短信和彩信
- android广播监听接收和发送短信
- 调用系统的短信和邮件功能,实现发送指定内容等
- 调用系统发送短信、邮件等信息功能
- 使用广播接收者怎么只能监听收到的短信 ?为啥短信发送号码和时间为null
- 消息的创建,发送和接收 使用系统调用shmget(),sgmat(),smgdt(),shmctl()
- <ios>调用系统的短信和发送邮件功能,实现短信分享邮件分享
- Android调用系统短信发送界面并预设接收号码、短信内容
- iOS-调用系统的短信和发送邮件功能,实现短信分享邮件分享