【Android基础 004】 发短信、打电话、发邮件、访问网页

短信

1.发送短信

需要权限 android.permission.SEND_SMS

使用android.telephony.SmsManager类

普遍使用的方式

[java] view plaincopy
  1. private void sendSmsMessage(String address,String message)throws Exception  
  2.     {  
  3.         SmsManager smsMgr = SmsManager.getDefault();  
  4.         Intent sent = new Intent();  
  5.         sent.setAction("com.send");  
  6.         PendingIntent sentIntent = PendingIntent.getBroadcast(this0, sent, 0);  
  7.         Intent delivery = new Intent();  
  8.         delivery.setAction("com.delivery");  
  9.         PendingIntent deliveryIntent = PendingIntent.getBroadcast(this0, delivery , 0);  
  10.         smsMgr.sendTextMessage(address, null, message, sentIntent, deliveryIntent);  
  11.     }  
  12.   
  13.  BroadcastReceiver send = new BroadcastReceiver() {  
  14.           
  15.         @Override  
  16.         public void onReceive(Context context, Intent intent) {  
  17.               
  18.             if("com.send".equals(intent.getAction()))  
  19.                 Toast.makeText(TelephonyDemo.this"SMS send  success",   
  20.                         Toast.LENGTH_LONG).show();  
  21.         }  
  22.     };  
  23.      BroadcastReceiver delivery = new BroadcastReceiver() {  
  24.               
  25.             @Override  
  26.             public void onReceive(Context context, Intent intent) {  
  27.                 if("com.delivery".equals(intent.getAction()))  
  28.                     Toast.makeText(TelephonyDemo.this"SMS delivery success",   
  29.                         Toast.LENGTH_LONG).show();  
  30.             }  
  31.         };  

 另两种方式

sendDataMessage()接受一个附加参数以指定一个端口号,还会接受一个字节数组(不是一个String 消息)。

sendMultipartTextMessage()支持在整条消息大于SMS规范所允许的大小时发送文本消息。

SmsManager类提供了divideMessage()方法来帮助将较长的消息拆分为多个部分。

2.监视传入的SMS消息

需要权限:android.permission.RECEIVE_SMS

当设备收到SMS消息时,android会发出广播。该广播的action是android.provider.Telephony.SMS_RECEIVED

该action在文档上找不到,在源码的android.provider包下能找到Telephony类,其中有这么个action,同时有参数说明

[java] view plaincopy
  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:</p> 
  5.            * 
  6.            * <ul> 
  7.            *   <li><em>pdus</em> - An Object[] od byte[]s containing the PDUs 
  8.            *   that make up the message.</li> 
  9.            * </ul> 
  10.            * 
  11.            * <p>The extra values can be extracted using 
  12.            * {@link #getMessagesFromIntent(Intent)}.</p> 
  13.            * 
  14.            * <p>If a BroadcastReceiver encounters an error while processing 
  15.            * this intent it should set the result code appropriately.</p> 
  16.            */  
  17.           @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)  
  18.           public static final String SMS_RECEIVED_ACTION =  
  19.                   "android.provider.Telephony.SMS_RECEIVED";  

具体实现

[java] view plaincopy
  1. <receiver android:name="MySMSMonitor">  
  2.             <intent-filter>  
  3.                 <action android:name="android.provider.Telephony.SMS_RECEIVED" />  
  4.             </intent-filter>  
  5.         </receiver>  
  6.   
  7. public class MySMSMonitor extends BroadcastReceiver {  
  8.   
  9.     private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";  
  10.   
  11.     @Override  
  12.     public void onReceive(Context context, Intent intent)  
  13.     {  
  14.         if(intent!=null && intent.getAction()!=null &&   
  15.             ACTION.compareToIgnoreCase(intent.getAction())==0)  
  16.         {  
  17.             Object[]pduArray = (Object[]) intent.getExtras().get("pdus");  
  18.             SmsMessage[] messages = new SmsMessage[pduArray.length];  
  19.             for (int i = 0; i<pduArray.length; i++) {  
  20.                 messages[i] = SmsMessage.createFromPdu((byte[])pduArray [i]);  
  21.                 Log.d("MySMSMonitor""From: " + messages[i].getOriginatingAddress());  
  22.                 Log.d("MySMSMonitor""Msg: " + messages[i].getMessageBody());  
  23.             }  
  24.             Log.d("MySMSMonitor","SMS Message Received.");  
  25.         }  
  26.     }  
  27. }  

访问SMS文件夹

需要权限 android.permission.READ_SMS

要读取SMS消息,必须对SMS收件箱进行查询。如下所示

[java] view plaincopy
  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, nullnullnullnull);  
  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

 

 

发送电子邮件

android没有提供API来发送电子邮件,必须使用已注册的电子邮件应用程序。可以使用ACTION_SEND来启动电子邮件应用程序

[java] view plaincopy
  1. Intent emailIntent=new Intent(Intent.ACTION_SEND);  
  2.   
  3.        String subject = "Hi!";  
  4.        String body = "hello from android....";  
  5.   
  6.        String[] extra = new String[]{"[email protected]"};  
  7.        
  8.        emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);  
  9.        emailIntent.putExtra(Intent.EXTRA_TEXT, body);  
  10.     emailIntent.putExtra(Intent.EXTRA_EMAIL, extra);  
  11.        emailIntent.setType("message/rfc822");  
  12.   
  13.        startActivity(emailIntent);  

 可以向电子邮件Intent添加的其他"extra"消息包括EXTRA_CC(抄送)、EXTRA_BCC(密送)。如果希望在邮件中发送电子邮件附件。可以使用以下代码。


[java] view plaincopy
  1. emailIntent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(new File(myFileName)));  

[java] view plaincopy
  1. 打电话  
  2.   
  3. 播出电话的最简单方法是使用以下代码  

[java] view plaincopy
  1. Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678911"));  
  2. startActivity(intent);  

 这段代码需要android.permission.CALL_PHONE权限。如果没有此权限,可以将Intent的操作更改为Intent.ACTION_VIEW.这会导致Dialer应用程序显示要拨打的目标号码,用户需要按下Send按钮才能开始呼叫。

 

 

监听电话状态

监听电话状态最简单的办法是在"android.intent.action.PHONE_STATE"上实现一个广播接收程序。可采用与上面监听传入的SMS消息相同的方式。

该action可以在文档中找到

http://developer.android.com/reference/android/telephony/TelephonyManager.html#ACTION_PHONE_STATE_CHANGED

另一种方式是使用TelephonyManager

[java] view plaincopy
  1.  private TelephonyManager teleMgr = null;  
  2.  private MyPhoneStateListener myListener = null;  
  3.   
  4.   
  5. @Override  
  6.     protected void onCreate(Bundle savedInstanceState)  
  7.     {  
  8.         super.onCreate(savedInstanceState);  
  9.           
  10.         teleMgr =   
  11.                 (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);  
  12.         myListener = new MyPhoneStateListener();  
  13.     }  
  14.   
  15.  @Override  
  16.     public void onResume() {  
  17.         super.onResume();  
  18.         Log.d("PhoneCallDemo""In onResume");  
  19.         teleMgr.listen(myListener, PhoneStateListener.LISTEN_CALL_STATE);  
  20.     }  
  21.       
  22.     @Override  
  23.     public void onPause() {  
  24.         super.onPause();  
  25.         Log.d("PhoneCallDemo""In onPause");  
  26.         teleMgr.listen(myListener, PhoneStateListener.LISTEN_NONE);  
  27.     }  
  28.   
  29. public class MyPhoneStateListener extends PhoneStateListener  
  30.     {  
  31.         @Override  
  32.         public void onCallStateChanged(int state, String incomingNumber) {  
  33.             super.onCallStateChanged(state, incomingNumber);  
  34.   
  35.             switch(state)  
  36.             {  
  37.                 case TelephonyManager.CALL_STATE_IDLE:  
  38.                     logText = "call state idle...incoming number is["+  
  39.                                 incomingNumber+"]\n" + logText;  
  40.                     break;  
  41.                 case TelephonyManager.CALL_STATE_RINGING:  
  42.                     logText = "call state ringing...incoming number is["+  
  43.                                 incomingNumber+"]\n" + logText;  
  44.                     break;  
  45.                 case TelephonyManager.CALL_STATE_OFFHOOK:  
  46.                     logText = "call state Offhook...incoming number is["+  
  47.                                 incomingNumber+"]\n" + logText;  
  48.                     break;  
  49.                 default:  
  50.                     logText = "call state ["+state+"]incoming number is["+  
  51.                                 incomingNumber+"]\n" + logText;  
  52.                     break;  
  53.             }  
  54.             print(logText);  
  55.         }  
  56.     }  







最后来个访问网页常用方法:

Uri uri = Uri.parse("http://www.baidu.com");

Intent it = new Intent(Intent.ACTION_VIEW, uri);

startActivity(it);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章