2015-11-10 48 views

回答

2

Android Developers Blog

監聽呼出請求

應用提供電話呼叫服務(如VoIP或數 管理)可以設置意圖過濾器來處理呼出 請求,例如由撥號程序或其他已安裝的應用程序製作的請求。 這爲用戶提供了無縫集成,他們可以將 直接轉換到呼叫服務,而無需重撥或啓動 其他應用程序。

當用戶發起呼叫時,系統通知由 感興趣的應用程序發送所述NEW_OUTGOING_CALL意圖, 的有序廣播附着原電話號碼,URI,和其他信息 額外。這使得Google Voice等應用可以在撥打 默認電話應用之前修改,重新路由或取消呼叫。

如果你希望你的手機通話應用能夠處理呼出 請求,實現接收 NEW_OUTGOING_CALL意向廣播接收器,進程數,並開始根據需要調用 。確保在接收器中聲明NEW_OUTGOING_CALL 的意圖過濾器,讓系統知道您的應用程序對 廣播感興趣。您還需要請求PROCESS_OUTGOING_CALLS 權限才能收到意圖。

需要注意的是該系統僅適用於不具有核心撥號功能,如 緊急電話號碼相關聯的廣播 NEW_OUTGOING_CALL。這意味着NEW_OUTGOING_CALL不能干涉 以使用CALL_PRIVILEGED 可能的方式訪問緊急服務。

下面是一個應用的清單 文件中聲明的一個例子廣播接收器:

<manifest> 
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 
    <application> 
     ... 
     <receiver android:name=MyOutgoingCallHandler"> 
      <intent-filter> 
       <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </receiver> 
     ... 
    </application> 
</manifest> 

相應的廣播接收器的實現看起來 是這樣的:

public class MyOutgoingCallHandler extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    // Extract phone number reformatted by previous receivers 
    String phoneNumber = getResultData(); 
    if (phoneNumber == null) { 
     // No reformatted number, use the original 
     phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
    } 
    // My app will bring up the call, so cancel the broadcast 
    setResultData(null); 
    // Start my app to bring up the call 
    ... 
    } 
} 

因爲NEW_OUTGOING_CALL廣播訂購,您的應用程序可以選擇是自己使用通話請求還是僅處理 th e號碼並將結果數據傳遞給其他可能對 感興趣的應用。在這個例子中,廣播接收器調用它自己的服務的電話 ,並將結果數據設置爲空。此 可防止呼叫請求到達默認電話應用程序。