2014-10-04 98 views
3

是否有任何方法可以檢測到撥出電話已成功接收或應答?我正在使用Intent.ACTION_CALL撥打電話,PhoneCallListener在撥出電話時找到呼叫的狀態,但我無法實現此目的。這在android中可能嗎?Android - 如何檢測撥出電話已接聽或接聽?

+1

如果您找到答案,請發表解答。 – 2015-10-09 07:38:37

回答

-1

您需要使用RINGING狀態和OFFHOOK狀態的組合來判斷呼叫是否被應答。

請參閱此thread瞭解如何實現此目的的實際代碼。

+0

感謝您的回覆,我會盡力實施 – 2014-10-05 06:36:15

+1

問題是關於傳出呼叫,而不是傳入。 – Ton 2016-02-08 13:35:03

4

在這個問題上深深的工作之後,我得出這個結論:

  1. PhoneStateListener不會撥出電話的工作,它調用摘機代替鈴聲,並摘機不會被調用的答案。
  2. 使用NotificationListenerService,您可以偵聽與撥出呼叫相關的已發佈通知。你可以做下面的代碼。這裏的問題是,我是無法從某些三星手機獲得通知文本,而且它自己的文本可能會在一部手機之間發生很大變化。 此外它需要API 18及以上

    public class NotificationListener extends NotificationListenerService { 
    private String TAG = this.getClass().getSimpleName(); 
    @Override 
    public void onNotificationPosted(StatusBarNotification sbn) { 
    Log.i(TAG, "Notification Posted"); 
    Log.i(TAG, sbn.getPackageName() + 
         "\t" + sbn.getNotification().tickerText + 
         "\t" + sbn.getNotification().extras.getString(Notification.EXTRA_TEXT); 
    
    Bundle extras = sbn.getNotification().extras; 
    
    if ("Ongoing call".equals(extras.getString(Notification.EXTRA_TEXT))) 
        startService(new Intent(this, ZajilService.class).setAction(ZajilService.ACTION_CALL_ANSWERED)); 
    else if ("Dialing".equals(extras.getString(Notification.EXTRA_TEXT))) 
        startService(new Intent(this, ZajilService.class).setAction(ZajilService.ACTION_CALL_DIALING)); 
    } 
    
    @Override 
    public void onNotificationRemoved(StatusBarNotification sbn) { 
    Log.i(TAG, "********** onNotificationRemoved"); 
    Log.i(TAG, "ID :" + sbn.getId() + "\t" + sbn.getNotification().tickerText + "\t" + sbn.getPackageName()); 
    } 
    } 
    
  3. 使用AccessibilityService,它比NotificationListenerService更基本的,我想這是所有的API支持。但也使用AccessibilityService,某些電話在發出呼叫的情況下不發佈有用的事件。回答。在大多數電話中,一旦通話應答,通話持續時間將會發生;它的打印輸出看起來是這樣的:

onAccessibilityEvent事件類型:TYPE_WINDOW_CONTENT_CHANGED; EventTime:21715433;包名:com.android.incallui; MovementGranularity:0;操作:0 [ClassName: android.widget.TextView;文本:[];內容描述:0分鐘0 秒; onAccessibilityEvent EventType:TYPE_WINDOW_CONTENT_CHANGED; EventTime:21715533;包名:com.android.incallui; MovementGranularity:0;操作:0 [ClassName: android.widget.TextView;文本:[];內容描述:0分鐘1 秒;

  1. API 23有一個新類,Call。它有更詳細的通話狀態; STATE_ACTIVE。您可以通過InCallService來替換手機的默認InCallUI,但我沒有嘗試使用它,但無論如何,它僅限於API 23,棉花糖。

作爲結論,您需要構建一個組合NotificationListener和AccessibilityService的解決方案,以便覆蓋所有電話,希望。

+0

如果您有關於輔助功能方法的一些代碼,請向我們展示(或者鏈接到)。謝謝 – 2016-06-01 02:45:05

+0

嗨穆罕默德Qandeel,你想分享完整的代碼?如AndroidManifest和實現您的答案所需的其他類。謝謝。 – danisupr4 2016-10-07 06:56:52

+1

好的工作似乎很有希望 – 2017-01-04 18:27:32

相關問題