android发送短信

android中发送短信很简单, 

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

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

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

方法1: 

Java代码   收藏代码
  1. public   class  testSms  extends  Activity {  
  2.   
  3.     private   void  send1(String phone, String message){  
  4.   
  5.         PendingIntent pi = PendingIntent.getActivity(this  0  new  Intent( this, testSms. class ),  0 );  
  6.   
  7.         SmsManager sms = SmsManager.getDefault();  
  8.   
  9.         sms.sendTextMessage(phone, null , message, pi,  null );   
  10.   
  11.     }  
  12.   
  13. }  
[java]  view plain copy
  1. public class testSms extends Activity {  
  2.   
  3.     private void send1(String phone, String message){  
  4.   
  5.         PendingIntent pi = PendingIntent.getActivity(this0new Intent(this, testSms.class), 0);  
  6.   
  7.         SmsManager sms = SmsManager.getDefault();  
  8.   
  9.         sms.sendTextMessage(phone, null, message, pi, null);   
  10.   
  11.     }  
  12.   
  13. }  



方法2: 

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

Java代码   收藏代码
  1. private   void  send2(String number, String message){  
  2.     String SENT = "sms_sent" ;  
  3.     String DELIVERED = "sms_delivered" ;  
  4.       
  5.     PendingIntent sentPI = PendingIntent.getActivity(this  0  new  Intent(SENT),  0);  
  6.     PendingIntent deliveredPI = PendingIntent.getActivity(this  0  new Intent(DELIVERED),  0 );  
  7.       
  8.     registerReceiver(new  BroadcastReceiver(){  
  9.   
  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. }  
[java]  view plain copy
  1. private void send2(String number, String message){  
  2.     String SENT = "sms_sent";  
  3.     String DELIVERED = "sms_delivered";  
  4.       
  5.     PendingIntent sentPI = PendingIntent.getActivity(this0new Intent(SENT), 0);  
  6.     PendingIntent deliveredPI = PendingIntent.getActivity(this0new Intent(DELIVERED), 0);  
  7.       
  8.     registerReceiver(new BroadcastReceiver(){  
  9.   
  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. }  




方法3: 

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

Java代码   收藏代码
  1. private   void  send2(String number, String message){  
  2.     SmsManager smsm = SmsManager.getDefault();  
  3.     short  port =  1000 ;  
  4.     PendingIntent pi = PendingIntent.getBroadcast(test.this  0  new  Intent(),  0 );  
  5.     smsm.sendDataMessage(number, null , port, message.getBytes(), pi,  null );  
  6. }  
[java]  view plain copy
  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: 

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

Java代码   收藏代码
  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. }  
[java]  view plain copy
  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. }  



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

Java代码   收藏代码
  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. }  
[java]  view plain copy
  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为实现类 

Java代码   收藏代码
  1. <receiver android:name= ".SmsReceiver" >   
  2.   
  3. <intent-filter>   
  4.     <action android:name="android.provider.Telephony.SMS_RECEIVED"  />  
  5. </intent-filter>   
  6.   
  7. </receiver>  
[java]  view plain copy
  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时需要加入 

Java代码   收藏代码
  1. <receiver android:name= ".SmsReceiver" >   
  2.   
  3. <intent-filter>   
  4.     <action android:name="android.intent.action.DATA_SMS_RECEIVED"  />  
  5.     <data android:scheme="sms"  />  
  6.     <data android:host="localhost"  />  
  7.     <data android:port="1000"  />  
  8. </intent-filter>  
  9.   
  10. </receiver>  
[java]  view plain copy
  1. <receiver android:name=".SmsReceiver">   
  2.   
  3. <intent-filter>   
  4.     <action android:name="android.intent.action.DATA_SMS_RECEIVED" />  
  5.     <data android:scheme="sms" />  
  6.     <data android:host="localhost" />  
  7.     <data android:port="1000" />  
  8. </intent-filter>  
  9.   
  10. </receiver>  


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

Java代码   收藏代码
  1. public   class  SmsReceiver  extends  BroadcastReceiver {  
  2.   
  3.     @Override   
  4.     public   void  onReceive(Context context, Intent intent) {  
  5.         Bundle bundle = intent.getExtras();  
  6.         SmsMessage[] msgs = null ;  
  7.         String phone;  
  8.         String message;  
  9.                   
  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. }  
[java]  view plain copy
  1. public class SmsReceiver extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent) {  
  5.         Bundle bundle = intent.getExtras();  
  6.         SmsMessage[] msgs = null;  
  7.         String phone;  
  8.         String message;  
  9.                   
  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发送: 

Java代码   收藏代码
  1. public   class  SmsReceiver  extends  BroadcastReceiver {  
  2.   
  3.     @Override   
  4.     public   void  onReceive(Context context, Intent intent) {  
  5.         Bundle bundle = intent.getExtras();  
  6.         SmsMessage[] msgs = null ;  
  7.              String phone;  
  8.              String message;  
  9.                   
  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. }  
[java]  view plain copy
  1. public class SmsReceiver extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent) {  
  5.         Bundle bundle = intent.getExtras();  
  6.         SmsMessage[] msgs = null;  
  7.              String phone;  
  8.              String message;  
  9.                   
  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()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值