【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);



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