代码改变世界

Android小項目之--電話與短信服務(附源碼)

2010-06-09 23:14  Terry_龙  阅读(5681)  评论(6编辑  收藏  举报

  Android 上實現電話與短信服務相信己經是老生常談了,有些人或許認為沒有必要拿出來談,網上一抓一大把。確實是,網上現在有很多調用 Android 電話與短信服務的例子,今天特地拿出來談,只是因為有一些小技巧還是有拿出來談的必要的。

  

什麽是Intent

  使用 Intent之前我們有必要先認識一下 Intent。

  Intent是一種運行時綁定(runtime binding)機制,它能在程序運行的過程中連接兩個不同的組件。通過Intent,你的程序可以向 Android 表達某種請求或者意愿,Android 會根據意願的內容選擇適合的組件來請求。比如本例中使用的打電話功能,那么這個Acitivity只需要發出 Intent.ACTION_CALL 請求給Android ,剩下只要交給Android 來處理即可。

 

Intent的主要組成部份

  Intent對象抽象地描述了要執行的操作,其描述的基本內容可以分為組件名稱、Action(動作)、Data(數據)、Category(類別)、Extra(附加信息)和Flag(標誌位)6部份,具體的使用功能可查看相關文檔,這里不多介紹。

 

解析 Intent

  Intent是一種在不同組件之間傳遞的請求消息,是應用程序發出的請求和意圖。作為一個完整的消息傳遞機制, Intent 不僅需要發送端,還需要接收端。那么Intent如何解析 Intent 的請求內容,并選擇合適的組件響應 Intent 請求呢?本篇就會告訴大家,請繼續往下看。

 

Intent激活程序---電話與短信   

  本篇中使用的 Intent 打電話程序中,Intent 的行為是 ACTION_DIAL,同時在 Intent 中傳遞被呼叫人的電話號碼。

  撥打電話的關鍵有兩個方面,首先,要在 AndroidManifest 中添加 uses-permission(即為程序分配使用權限),并聲明android:name="android.permission.CALL_PHONE" 權限。由於打電話是屬於手機的底層服務,與用戶隱私及通話費用等話題息息相關,困此,程序必須取得權限。其次,通過自定義 Intent 對象,帶入“ACTION_CALL” 這個關鍵(Action),以及通過Uri.parse()的方法將用戶輸入電話號碼(Data)帶入,最后以 startActivity()方法,即可完成,代碼如下:

 

代码

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;
public class phoneAndsmsAcitivity extends Activity {
    
private Button myButton;
    
private EditText myEditText;
    
/** Called when the activity is first created. */
    @Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myButton
=(Button)findViewById(R.id.button);
        myEditText
=(EditText)findViewById(R.id.mobile);
        
        myButton.setOnClickListener(
new OnClickListener() {
            
            @Override
            
public void onClick(View v) {
                
// TODO Auto-generated method stub
                if(myEditText.getText().length()>0)
                {
                    Intent myIntent
=new Intent(Intent.ACTION_CALL,Uri.parse
                            (
"tel:"+myEditText.getText().toString()));
                phoneAndsmsAcitivity.
this.startActivity(myIntent);
                }
            }
        });
    }
}

 

運行效果:

  短信也是任何一款手機不可或缺的應用之一,幾乎是手機使用頻率最高的應用之一(不發短信的飄過~~~~~~)。Android自帶有一個發短信的類 SmsManager,利用這個類,我們可以完成手機的短信發送與接收工作,其中 sentTextMessage() 方法需要傳入五個值,依次是收件人地址(String)、發送人地址(String)、正文(String)、發送服務(PendingIntent)、與送達服務(PendingIntent),其中收件人與正文是不可為NULL的參數。跟打電話一樣,涉及到與金錢有關的必須在配置文件分配權限,權限代碼如下:<uses-permission android:name="android.permission.SEND_SMS"/>,smsManager的公開方法如下:

 

簡單的發送短信代碼:

代码
package com.terry;

import java.util.List;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsManager; 
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

@SuppressWarnings(
"deprecation")
public class smsAcitivity extends Activity {
    
private Button myButton;
    
private EditText myEditText;
    
private EditText EditText2;
    @Override
    
protected void onCreate(Bundle savedInstanceState) {
        
// TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sms);
        
        myButton
=(Button)findViewById(R.id.button);
        myEditText
=(EditText)findViewById(R.id.mobile);
        EditText2
=(EditText)findViewById(R.id.content);
        
        myButton.setOnClickListener(
new OnClickListener() {
             
            @Override
            
public void onClick(View v) {
                
// TODO Auto-generated method stub
                 String mobile=myEditText.getText().toString();
                 String content
=EditText2.getText().toString();
                SmsManager sms
=SmsManager.getDefault();
                PendingIntent sentintent 
=PendingIntent.getBroadcast(smsAcitivity.this,
                        
0new Intent(), 0);
                
try {
                    
if(content.length()>70)
                    {
                        List
<String> msgs=sms.divideMessage(content);
                        
for(String msg:msgs)
                        {
                            sms.sendTextMessage(mobile, 
null, msg, sentintent, null); 
                        }
                    }
                    
else
                    {
                    
                        sms.sendTextMessage(mobile, 
null, content, sentintent, null);
                    }
                } 
catch (Exception e) {
                    
// TODO: handle exception
                    e.printStackTrace();
                }
                Toast.makeText(smsAcitivity.
this"短信發送成功"1000).show();
            }
        });
        
    }
}

 

  關於一個測試的小技巧:發送短信的時候我們需要兩台機子可以測試,這時候我們要同時啟動兩個模擬器己達到發送與接收的效果,這時候你可以如下操作:開始 --cmd--emulator -data foo 依此在 dos 命令中輸入,即可重新打開一個模擬器,下麵是收送測試效果圖:

疑問:

   不知道有沒有細心的朋友發現。好像Google API 中不建議使用 smsManager 這個類來發送短信,如果是不建議那是否有另外的替代方案?如果知道的園友不妨告知一聲。。非常感激。

 

源碼下載:/Files/TerryBlog/phoneAndsms.rar

 

如果你有什麽疑問或者建議 你可以  QQ 285735942 Email:terryyhl@gmail.com