android 几种发送短信的方法

android中发送短信很简单,

首先要在Mainfest.xml中加入所需要的权限:

1 <uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
2 <uses-permission android:name="android.permission.READ_SMS"></uses-permission>
3 <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

为了后面测试方便,干脆把SMS的所有权限加上。

方法1:

01 public class testSms extends Activity {
02  
03 ...
04  
05     private void send1(String phone, String message){
06  
07         PendingIntent pi = PendingIntent.getActivity(this0new Intent(this, testSms.class), 0);
08  
09         SmsManager sms = SmsManager.getDefault();
10  
11         sms.sendTextMessage(phone, null, message, pi, null);
12  
13     }
14  
15 }

方法2:

如果想知道短信发送后的状态,需要两个Receiver来实现

01 private void send2(String number, String message){
02     String SENT = "sms_sent";
03     String DELIVERED = "sms_delivered";
04     
05     PendingIntent sentPI = PendingIntent.getActivity(this0new Intent(SENT),0);
06     PendingIntent deliveredPI = PendingIntent.getActivity(this0newIntent(DELIVERED), 0);
07     
08     registerReceiver(new BroadcastReceiver(){
09  
10             @Override
11             public void onReceive(Context context, Intent intent) {
12                 switch(getResultCode())
13                 {
14                     case Activity.RESULT_OK:
15                         Log.i("====>""Activity.RESULT_OK");
16                         break;
17                     case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
18                         Log.i("====>""RESULT_ERROR_GENERIC_FAILURE");
19                         break;
20                     case SmsManager.RESULT_ERROR_NO_SERVICE:
21                         Log.i("====>""RESULT_ERROR_NO_SERVICE");
22                         break;
23                     case SmsManager.RESULT_ERROR_NULL_PDU:
24                         Log.i("====>""RESULT_ERROR_NULL_PDU");
25                         break;
26                     case SmsManager.RESULT_ERROR_RADIO_OFF:
27                         Log.i("====>""RESULT_ERROR_RADIO_OFF");
28                         break;
29                 }
30             }
31     }, new IntentFilter(SENT));
32     
33     registerReceiver(new BroadcastReceiver(){
34         @Override
35         public void onReceive(Context context, Intent intent){
36             switch(getResultCode())
37             {
38                 case Activity.RESULT_OK:
39                     Log.i("====>""RESULT_OK");
40                     break;
41                 case Activity.RESULT_CANCELED:
42                     Log.i("=====>""RESULT_CANCELED");
43                     break;
44             }
45         }
46     }, new IntentFilter(DELIVERED));
47     
48         SmsManager smsm = SmsManager.getDefault();
49         smsm.sendTextMessage(number, null, message, sentPI, deliveredPI);
50 }

在模拟器上是看不到Receiver中的log信息的,据网上说在手机上是可以实现的,只可惜手中无机,也只能纸上谈兵了。

方法3:

上面都是发送文本文件,如果想发送一些非文本,比如加密数据,可以用以下方法:

1 private void send2(String number, String message){
2     SmsManager smsm = SmsManager.getDefault();
3     short port = 1000;
4     PendingIntent pi = PendingIntent.getBroadcast(test.this0new Intent(), 0);
5     smsm.sendDataMessage(number, null, port, message.getBytes(), pi, null);
6 }

方法4:

调用系统的短信界面,这个方法需要用户自己输入接收方的电话号码

1 private void send(String message){
2     Intent sendIntent = new Intent(Intent.ACTION_VIEW);
3     sendIntent.putExtra("sms_body", message);
4     sendIntent.setType("vnd.android-dir/mms-sms");
5 }

这个方法自动设置接收方的号码

1 private void send1(String number, String message){
2     Uri uri = Uri.parse("smsto:" + number);
3     Intent sendIntent = new Intent(Intent.ACTION_VIEW, uri);
4     sendIntent.putExtra("sms_body", message);
5     startActivity(sendIntent);
6 }

短信的接受,需要实现BroadcastReceiver类,监听系统消息

首先在Mainfest.xml中加入申明,SmsReceiver为实现类

1 <receiver android:name=".SmsReceiver">
2  
3 <intent-filter>
4     <action android:name="android.provider.Telephony.SMS_RECEIVED" />
5 </intent-filter>
6  
7 </receiver>

 

如果是方法3,使用sendDataMessage时需要加入

01 <receiver android:name=".SmsReceiver">
02  
03 <intent-filter>
04     <action android:name="android.intent.action.DATA_SMS_RECEIVED" />
05     <data android:scheme="sms" />
06     <data android:host="localhost" />
07     <data android:port="1000" />
08 </intent-filter>
09  
10 </receiver>

将其中的dat数据注释掉,模拟器上也可以接收到短信; port跟sendDataMessage中的端口值不一致时,也没有问题,太神奇了

01 public class SmsReceiver extends BroadcastReceiver {
02  
03     @Override
04     public void onReceive(Context context, Intent intent) {
05         Bundle bundle = intent.getExtras();
06         SmsMessage[] msgs = null;
07         String phone;
08         String message;
09                 
10         if(bundle != null){
11             Object[] pdus = (Object[])bundle.get("pdus");
12             msgs = new SmsMessage[pdus.length];
13             for(int i = 0; i < msgs.length; i++){
14                 msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
15                 phone = msgs[i].getOriginatingAddress();
16                 message = msgs[i].getMessageBody();
17             }
18         }
19     }
20 }

如果是sendDataMessage发送:

01 public class SmsReceiver extends BroadcastReceiver {
02  
03     @Override
04     public void onReceive(Context context, Intent intent) {
05         Bundle bundle = intent.getExtras();
06         SmsMessage[] msgs = null;
07              String phone;
08              String message;
09                 
10         if(bundle != null){
11             Object[] pdus = (Object[])bundle.get("pdus");
12             msgs = new SmsMessage[pdus.length];
13             for(int i = 0; i < msgs.length; i++){
14                 msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
15                 phone = msgs[i].getOriginatingAddress();
16                 byte data[] = SmsMessage.createFromPdu((byte[])pdus[i]).getUserData();
17                 message = new String(data);
18             }
19         }
20     }
21 }

不一样的地方是message的获取时使用getUserData()方法。

原文转自:http://blog.csdn.net/rangq1/article/details/5793953

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值