Android短信功能分析
Android短信功能分析
短信发送对于手机来说是一项很重要的功能,那么分析和研究短信功能就显得很有必要的了。本篇文章主要总结分析了短信的单条发送、短信的群发及对短信的发送和接受的监听等为主导进行短信功能的分析和研究。
在这之前,我觉得很有必要先看一下下面的几个与短信功能相关的概念:
1、PendingIntent理解
Intent的意思是意图,一般用来承载数据和执行的动作的封装体,经常被用于在startActivity()、broadcastIntent()及startService()或者bindService()中传递数据,并执行特定的动作;而Pending的意思是延迟的,所以PendingIntent就代表即将要去做的事情了,可以被getActivity()、getService()及getBroadcast()等创建,返回的结果被交给其他的程序去延迟执行我们所需要的动作,即使执行的程序进程死掉了,也能通过存在pendingintent里的Context照样执行Intent。
Intent一般是用作Activity、Service、BroadcastReceiver之间传递数据,而Pendingintent,一般用在 Notification上,可以理解为延迟执行的intent,PendingIntent是对Intent一个包装,只不过增加了延迟执行机制而已。
2、SmsManager理解
管理短信业务,如发送数据,文本,和PDU短信。通过调用静态方法Smsmanager.getDefault()获得此对象。
在这个短信功能管理类中,提供了几个重要的方法,用来实现短信的发送操作,一般情况下,使用sendTextMessage(1,2,3,4,5)发送文本信息,其中的5个参数分别代表:收件人地址、发送地址、正文、发送服务及送达服务,其他的几个方法,可以根据需要查看API即可,他们的使用基本一致。
接下来,就使用android.telephony.gsm下的SmsManager来管理短信息的发送,使用PendingIntent来封装短信数据和延迟执行指定的动作。
单条短信发送:
private void singleSMS(String phoneNumber, final String message) {
String newMsg = "";
try {
SmsManager sms = SmsManager.getDefault();
byte[] bytes = message.getBytes();
newMsg = new String(bytes, "utf-8");
// 限定短信的字数不超过70个字符
if (newMsg.length() > 70) {
// 如果短信较大,那么将其分割为简短的短信组分批发送
List<String> msgs = sms.divideMessage(newMsg);
for (String msg : msgs) { // sentPI为发送端的标志
sms.sendTextMessage(phoneNumber,null,msg,sentPI, null);
}
}else
sms.sendTextMessage(phoneNumber,null,newMsg,sentPI,null);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
具体如上代码所示,细节的地方都已添加了注释。下面的群发短信的实现与上面单条发送原理是一样的,只不过需要获得多个要发送的联系人的电话号,并利用循环去反复执行单条发送的逻辑。
群发短信:
private void sendGroupSMS(List
message = msg;
for (int i = 0;i
MultipleSMS(numbers.get(i).getNumber(),message);
}
}
private void MultipleSMS(String phoneNumber, final String message) {
String newMsg = "";
try {
SmsManager sms = SmsManager.getDefault();
byte[] bytes = message.getBytes();
newMsg = new String(bytes, "utf-8");
// 限定短信的字数不超过70个字符
if (newMsg.length() > 70) {
// 如果短信较大,那么将其分割为简短的短信组分批发送
List<String> msgs = sms.divideMessage(newMsg);
for (String msg : msgs) {// sentPI为发送端的标志
sms.sendTextMessage(phoneNumber,null,msg,sentPI, null);
}
}else
sms.sendTextMessage(phoneNumber,null,newMsg,sentPI,null);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
至此,短信的发送和群发功能已经总结完了,看起来好像很简单,这主要是因为复杂的实现细节已经由Android为我们完成了,同时也对底层的实现做好了优化。
短信的监听:
Android中对短信的监听工作主要是使用广播机制来完成的。在这里,我们需要注册两个广播,分别针对发送短信监听和接收短信的监听,具体如下:
BroadcastReceiver send = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if("com.david.send".equals(intent.getAction()))
Toast.makeText(TelephonyDemo.this, "SMS send success!",
Toast.LENGTH_LONG).show();
// 处理逻辑
}
};
BroadcastReceiver delivery = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if("com.david.delivery".equals(intent.getAction()))
Toast.makeText(TelephonyDemo.this, "SMS delivery success!",
Toast.LENGTH_LONG).show();
// 处理逻辑
}
};
监视传入的SMS消息
需要权限:android.permission.RECEIVE_SMS
当设备收到SMS消息时,android会发出广播。该广播的action是android.provider.Telephony.SMS_RECEIVED
该action在文档上找不到,在源码的android.provider包下能找到Telephony类,其中有这么个action,同时有参数说明print?
1 /**
2 * Broadcast Action: A new text based SMS message has been received
3 * by the device. The intent will have the following extra
4 * values:
5 *
6 *
7 *
8 * that make up the message.
9 *
10 *
11 * The extra values can be extracted using
12 * {@link #getMessagesFromIntent(Intent)}.
13 *
14 * If a BroadcastReceiver encounters an error while processing
15 * this intent it should set the result code appropriately.
16 */
17 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
18 public static final String SMS_RECEIVED_ACTION =
19 "android.provider.Telephony.SMS_RECEIVED";
具体实现print?
20
21
22
23
24
25
26 public class SMSMonitor extends BroadcastReceiver {
27
28 private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
29
30 @Override
31 public void onReceive(Context context, Intent intent)
32 {
33 if(intent!=null && intent.getAction()!=null &&
34 ACTION.compareToIgnoreCase(intent.getAction())==0)
35 {
36 Object[] pdus = (Object[]) intent.getExtras().get("pdus");
37 SmsMessage[] messages = new SmsMessage[pdus.length];
38 for (int i = 0; i
39 messages[i] = SmsMessage.createFromPdu((byte[])pdus [i]);
40 Log.d("SMSMonitor", "From: " + messages[i].getOriginatingAddress());
41 Log.d("SMSMonitor", "Msg: " + messages[i].getMessageBody());
42 }
43 Log.d("SMSMonitor","SMS Message Received.");
44 }
45 }
46 }
访问SMS文件夹
需要权限 android.permission.READ_SMS
要读取SMS消息,必须对SMS收件箱进行查询。如下所示
1 public class SMSInboxDemo extends ListActivity {
2
3 private ListAdapter adapter;
4 private static final Uri SMS_INBOX = Uri.parse("content://sms/inbox");
5
6 @Override
7 public void onCreate(Bundle bundle) {
8 super.onCreate(bundle);
9 Cursor c = getContentResolver()
10 .query(SMS_INBOX, null, null, null, null);
11 startManagingCursor(c);
12 String[] columns = new String[] { "body" };
13 int[] names = new int[] { R.id.row };
14 adapter = new SimpleCursorAdapter(this, R.layout.sms_inbox, c, columns,
15 names);
16
17 setListAdapter(adapter);
18 }
19 }
以下是完整的SMS文件夹列表和每个文件夹的URI
所有文件夹 content://sms/all
收件箱 content://sms/inbox
已发送 content://sms/sent
草稿 content://sms/draft
发件箱 content://sms/outbox
发送失败 content://sms/failed
排队消息 content://sms/queued
未送达 content://sms/undelivered
对话 content://sms/conversations
另外,在SmsManager中还提供了几种短信发送的状态,具体可以参见如下代码:
class MyReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
ContentValues values = new ContentValues();
XGSMSManager mrg = XGSMSManager.instance();
List
for (XGSMS num : getcontactsList) {
values.put("address", num.getNumber().toString());
values.put("body", message);
}
getContentResolver().insert(Uri.parse("content://sms/sent"), values);
mUtils.showShort("邀请信息发送成功!");
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
mUtils.showShort("邀请信息发送失败!");
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
mUtils.showShort("当前没有可用的服务哦!");
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
mUtils.showShort("没有提供数据单元哦!");
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
mUtils.showShort("您的无线发送信号被关闭了,不能发送信息!!");
break;
}
}
}
当然,上面是我开发中用到的一个监听广播,但在这里的重点是上面的几种状态,这里我都进行了每种状态的文字说明。
好了,短信的功能部分就暂时分享到这里,如果分析不正确的地方,希望不吝赐教哦~!
技术交流群:179914858
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
