Android中发送短信等普通方法

来源:互联网 发布:淘宝上好的牛排店 编辑:程序博客网 时间:2024/05/11 01:28
首先要在Mainfest.xml中加入所需要的权限:
[html] view plain copy
print?
  1. <uses-permission android:name="android.permission.SEND_SMS"/>  
  2. <uses-permission android:name="android.permission.READ_SMS"/>  
  3. <uses-permission android:name="android.permission.RECEIVE_SMS"/>  
为了后面测试方便,干脆把SMS的所有权限加上。

方法1:
[java] view plain copy
print?
  1. public class testSms extends Activity {  
  2.     private void send1(String phone, String message){  
  3.         PendingIntent pi = PendingIntent.getActivity(this0new Intent(this, testSms.class), 0);  
  4.         SmsManager sms = SmsManager.getDefault();  
  5.         sms.sendTextMessage(phone, null, message, pi, null);  
  6.     }  
  7. }  
方法2:
如果想知道短信发送后的状态,需要两个Receiver来实现
[java] view plain copy
print?
  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.             @Override  
  10.             public void onReceive(Context context, Intent intent) {  
  11.                 switch(getResultCode())  
  12.                 {  
  13.                     case Activity.RESULT_OK:  
  14.                         Log.i("====>""Activity.RESULT_OK");  
  15.                         break;  
  16.                     case SmsManager.RESULT_ERROR_GENERIC_FAILURE:  
  17.                         Log.i("====>""RESULT_ERROR_GENERIC_FAILURE");  
  18.                         break;  
  19.                     case SmsManager.RESULT_ERROR_NO_SERVICE:  
  20.                         Log.i("====>""RESULT_ERROR_NO_SERVICE");  
  21.                         break;  
  22.                     case SmsManager.RESULT_ERROR_NULL_PDU:  
  23.                         Log.i("====>""RESULT_ERROR_NULL_PDU");  
  24.                         break;  
  25.                     case SmsManager.RESULT_ERROR_RADIO_OFF:  
  26.                         Log.i("====>""RESULT_ERROR_RADIO_OFF");  
  27.                         break;  
  28.                 }  
  29.             }  
  30.     }, new IntentFilter(SENT));  
  31.       
  32.     registerReceiver(new BroadcastReceiver(){  
  33.         @Override  
  34.         public void onReceive(Context context, Intent intent){  
  35.             switch(getResultCode())  
  36.             {  
  37.                 case Activity.RESULT_OK:  
  38.                     Log.i("====>""RESULT_OK");  
  39.                     break;  
  40.                 case Activity.RESULT_CANCELED:  
  41.                     Log.i("=====>""RESULT_CANCELED");  
  42.                     break;  
  43.             }  
  44.         }  
  45.     }, new IntentFilter(DELIVERED));  
  46.       
  47.     SmsManager smsm = SmsManager.getDefault();  
  48.     smsm.sendTextMessage(number, null, message, sentPI, deliveredPI);  
  49. }  
方法3:
上面都是发送文本文件,如果想发送一些非文本,比如加密数据,可以用以下方法:
[java] view plain copy
print?
  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] view plain copy
print?
  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
print?
  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为实现类:
[html] view plain copy
print?
  1. <receiver android:name=".SmsReceiver">  
  2. <intent-filter>   
  3.     <action android:name="android.provider.Telephony.SMS_RECEIVED" />  
  4. </intent-filter>  
  5. </receiver>  
如果是方法3,使用sendDataMessage时需要加入:
[html] view plain copy
print?
  1. <receiver android:name=".SmsReceiver">  
  2. <intent-filter>   
  3.     <action android:name="android.intent.action.DATA_SMS_RECEIVED" />  
  4.     <data android:scheme="sms" />  
  5.     <data android:host="localhost" />  
  6.     <data android:port="1000" />  
  7. </intent-filter>  
  8. </receiver>  

[java] view plain copy
print?
  1. public class SmsReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         Bundle bundle = intent.getExtras();  
  5.         SmsMessage[] msgs = null;  
  6.         String phone;  
  7.         String message;  
  8.                   
  9.         if(bundle != null){  
  10.             Object[] pdus = (Object[])bundle.get("pdus");  
  11.             msgs = new SmsMessage[pdus.length];  
  12.             for(int i = 0; i < msgs.length; i++){  
  13.                 msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);  
  14.                 phone = msgs[i].getOriginatingAddress();  
  15.                 message = msgs[i].getMessageBody();  
  16.             }  
  17.         }  
  18.     }  
  19. }  
如果是sendDataMessage发送:
[java] view plain copy
print?
  1. public class SmsReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         Bundle bundle = intent.getExtras();  
  5.         SmsMessage[] msgs = null;  
  6.              String phone;  
  7.              String message;  
  8.                   
  9.         if(bundle != null){  
  10.             Object[] pdus = (Object[])bundle.get("pdus");  
  11.             msgs = new SmsMessage[pdus.length];  
  12.             for(int i = 0; i < msgs.length; i++){  
  13.                 msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);  
  14.                 phone = msgs[i].getOriginatingAddress();  
  15.                 byte data[] = SmsMessage.createFromPdu((byte[])pdus[i]).getUserData();  
  16.                 message = new String(data);  
  17.             }  
  18.         }  
  19.     }  
  20. }  
不一样的地方是message的获取时使用getUserData()方法。

转自:http://blog.csdn.net/rangq1/article/details/5793953
原创粉丝点击