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,sentPInull);

}

}else

sms.sendTextMessage(phoneNumber,null,newMsg,sentPI,null);

catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

具体如上代码所示,细节的地方都已添加了注释。下面的群发短信的实现与上面单条发送原理是一样的,只不过需要获得多个要发送的联系人的电话号,并利用循环去反复执行单条发送的逻辑。

群发短信:

private void sendGroupSMS(List numbers,String msg) {

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,sentPInull);

}

}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?

/** 

* Broadcast Action: A new text based SMS message has been received 

* by the device. The intent will have the following extra 

* values:

 

     

  • pdus - An Object[] od byte[]s containing the PDUs 

    * that make up the message.

  •  

 

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; is.length; 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收件箱进行查询。如下所示

public class SMSInboxDemo extends ListActivity { 

private ListAdapter adapter; 

private static final Uri SMS_INBOX = Uri.parse("content://sms/inbox"); 

@Override 

public void onCreate(Bundle bundle) { 

super.onCreate(bundle); 

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 getcontactsList = mrg.getSendContactList();

            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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部