Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

在安卓APP中如何打電話和發送短信

by
Difficulty:IntermediateLength:LongLanguages:

Chinese (Traditional) (中文(繁體)) translation by xingshi (you can also view the original English article)

在本教程中,你將瞭解Android Telephony和SMS API。你將學習如何從APP中撥打電話,以及如何監控電話和如何發送接收短信。

1.如何撥打電話

我將展示如何通過使用手機撥號APP或直接從APP來打電話。

創建一個新的Android Studio項目

啟動Android Studio並創建一個名為MainActivity的空Activity的新項目 。

Android Studio create a new Activity screenshot

螢幕佈局

現在,我們的佈局將只有一個EditText控制項和一個撥號按鈕:

Emulator dial screen with phone number given

修改MainActivity

下面的代碼塊,創建 顯示電話撥號器的ACTION_DIAL  intent。電話號碼從telURI方案解析:  tel:XXXXXXXX。請注意,這裡不需要任何許可權:

如果運行APP並按一下撥號按鈕,你將被帶到撥號介面,你可以在這裡撥打號碼。 你可以通過簡單地修改ACTION_DIAL intent為ACTION_CALL來實際撥打電話  。這需要  android.permission.CALL_PHONE許可權。

Emulator screen defualt phone dialer with the phone number

2.  監聽電話事件

在本節中,我們將學習如何在Android系統中監控電話事件。手機可以處於三種狀態:

  1. 1.     空閒(未使用時)
  2. 2.     振鈴(有來電時)
  3. 3.     摘機(接電話時)

添加許可權

我們需要 READ_PHONE_STATE許可權 才能監控電話狀態。將其添加到AndroidManifest.xml中:

創建PhoneStateListener對象

我們創建一個PhoneStateListener 類的物件,然後重寫它的  onCallStateChanged()方法(在IntelliJ中使用Control-O快速鍵選擇或搜索要重寫的方法)。 我們將通過顯示Toast來處理呼叫狀態更改。請注意,當觸發此方法時,我們還可以訪問來電號碼:

根據你的應用需求,你也可以重寫下列方法之一:onCellInfoChanged()onCallForwardingIndicatorChanged(),  onCellLocationChanged(),或  onSignalStrengthChanged()

監聽電話的狀態

為了開始監聽電話狀態,我們需要在onCreate()方法中從系統服務獲取並初始化TelephonyManager

onResume()方法中,我們可以使用TelephonyManager listen()方法進行監聽,需要參數PhoneStateListener實例和靜態LISTEN_CALL_STATE。我們通過傳遞LISTEN_NONE listen()的第二個參數在onStop()方法中停止監聽。

其他的手機監聽選項還有:  LISTEN_CELL_LOCATION,   LISTEN_SIGNAL_STRENGTH,  LISTEN_CALL_FORWARDING_INDICATOR,和LISTEN_CELL_INFO

最後,運行APP,並確保有電話進來。

Emulator incoming call states

只有當APP處於前臺時,此監聽才會起作用。 為了在後臺工作(當我們的APP沒有運行時),我們需要創建一個BroadcastReceiver,這樣即使APP沒有運行,我們仍然可以監視電話狀態。 根據你的應用需求,這可能是監聽電話狀態的更好方式了。我將在下一節中告訴你如何做到這一點。

請注意,我們只監聽來電。為了我監聽來電,我們需要額外的許可權。要監聽撥出電話,請在AndroidManifest.xml檔中包含以下行  。

如何使用模擬器撥打電話和發送短信

你可以使用你的模擬器來模擬通話或發送短信,但你需要進行一些設置。打開模擬器,按一下右側巡覽列上的最後一個按鈕打開擴展控制項對話方塊,然後選擇手機控制按鈕。

Using emulator to make call and send SMS

3.  在後臺監控撥打電話事件

創建BroadcastReceiver

就像上一節一樣,我們需要創建一個事件監聽器來監聽電話狀態的變化。 不同的是,這次我們將繼承 BroadcastReceiver基類,所以即使APP沒有運行,我們也可以收聽電話狀態。 確保不要多次註冊監聽!檢查第36行。

修改 AndroidManifest.xml

廣播接收者只有在註冊後才工作。我們需要通過在AndroidManifest.xml中註冊我們的廣播接收者來通知Android系統,將  PhoneCallStateReceiver 類連接到描述系統廣播的<internt-filter>,如 PHONE_STATE

監控撥出電話

對於撥出電話,你需要在AndroidManifest.xml接收者的<intent-filter>引入包含NEW_OUTGOING_CALL 动作的 <action android:name="andoid.intent.action.NEW_OUTGOING_CALL">

要獲取想要撥出的電話號碼,在onReceive(Context, Intent)方法中,我們從intent中獲取電話號碼作為extra。 為了防止預期的呼叫完成,我們可以調用  setResultData()方法並傳遞一個空參數。resultData用作實際要撥打的電話號碼。

有關廣播和廣播接收器的更多資訊,請參見Envato Tuts +中的教程:

4.發送短信

發送短信有兩個主要選擇:使用設備的短信用戶端APP或直接從你的應用發送短信。 我們將研究這兩種情況,你決定哪一種情況適合你。我們先使用設備的短信用戶端發送短信。

設置佈局

首先,我們需要修改我們的主要佈局,一個EditText控制項和一個發送消息的按鈕。

修改MainActivity

MainActivity類的onCreate()方法中,創建一個ACTION_SENDTO作為第一個參數的intent,一個smsto:〈phone number〉 URI作為第二個參數。sms_body extra的值是短信內容:

這裡,SMS用戶端將監聽消息傳遞的狀態。

運行應用程式

當輸入所有必填欄位時,按一下發送短信 按鈕將打開使用者的SMS用戶端,或者如果用戶沒有選擇APP,給用戶選擇。

Send SMS flow

5.直接發送短信

接下來,我們來看看如何直接從我們的APP發送短信,而不是使用設備的短信用戶端。

在 AndroidManifest.xml中添加許可權

像往常一樣,我們需要在AndroidManifest.xml中添加許可權。

修改MainActivity類

接下來,對於Android 6.0(API級別23)及以上版本,我們需要在運行時申請SEND_SMS許可權。

要瞭解有關Android運行時許可權的更多資訊以及它們在6.0版本中的修改,請參閱我們的Envato Tuts +教程:

要發送短信,我們獲取默認的SmsManager 實例,然後調用其sendTextMessage()方法,將電話號碼作為第一個參數傳遞,消息內容作為第二個參數:

要監聽發送狀態,SMSManager sendTextMessage()方法有兩個可選的 PendingIntent參數:  sentIntentdeliveryIntent

如果你想使用sentIntent,觀察成功後的結果代碼  Activity.RESULT_OK,或下面三種錯誤碼中的一種  RESULT_ERROR_GENERIC_FAILURE,  RESULT_ERROR_RADIO_OFF以及  RESULT_ERROR_NULL_PDU

6.  接收短信

為了讓你的APP開始從用戶手機接收短信,最好註冊一個廣播接收者,以便即使APP未在前臺運行時也能在新短信到達時收到通知。

添加許可權

RECEIVE_SMS許可權添加到  AndroidManifest.xml 

接下來,我們需要檢查APP是否有權在運行時接收短信。所以在MainActivity類中檢查  RECEIVE_SMS許可。如果找不到,就申請該許可權。

創建一個廣播接收者

我們通過使用createFromPdu(byte[] pdu)方法檢索SmsMessage類的每個物件,參數為PDU(協定資料單元)。然後我們將它添加到我們的消息陣列中。

為了支持API 23及以上版本,應該包括String extra格式(在3GPP格式中,“3gpp”代表GSM / UMTS / LTE消息,在3GPP2格式中,“3gpp2”代表CDMA / LTE消息)。

現在,運行APP,然後關閉它,給模擬器發送手機短信。

Emulator showing a toast when it receives an SMS in the background

結論

在本教程中,你學到的知識有:

  • 從你的APP中撥打電話
  • 監聽電話事件
  • 使用設備的消息發送APP或直接從你自己的APP發送短信
  • 在後臺接收短信

你還可以通過Android中的電話和短信進行更多操作。訪問Android Telephony API  和  SMSManager API  文檔以瞭解更多資訊。

與此同時,請查看我們在Android開發中的其他文章!

关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.