Android – 如何检测或接收拨出电话?

有没有办法检测成功接听或接听拨出电话?我正在使用Intent.ACTION_CALL拨打电话,而PhoneCallListener则在拨打电话时找到呼叫状态,但我无法实现此目的.这在
Android中是否可行? 最佳答案 在深入研究这个问题后,我得出了这样的结论:

> PhoneStateListener不适用于传出呼叫,它会调用OFFHOOK而不是RINGING,并且永远不会在ANSWER上调用OFFHOOK.
>使用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());
    }
}

>使用AccessibilityService,它比NotificationListenerService更基本,我认为所有API都支持它.但是也使用AccessibilityService,一些电话在呼叫应答时不发布有用的事件.在大多数手机中,一旦呼叫应答,将提出一个事件,呼叫持续时间;它的打印输出如下:

onAccessibilityEvent EventType:TYPE_WINDOW_CONTENT_CHANGED;活动时间:21715433; PackageName:com.android.incallui; MovementGranularity:0;动作:0 [ClassName:android.widget.TextView;文字:[]; ContentDescription:0分0秒;

onAccessibilityEvent EventType:TYPE_WINDOW_CONTENT_CHANGED;活动时间:21715533; PackageName:com.android.incallui; MovementGranularity:0;动作:0 [ClassName:android.widget.TextView;文字:[]; ContentDescription:0分1秒;

> API 23有一个新类,Call.它有更详细的调用状态; STATE_ACTIVE.您可以通过自己的UI替换手机的默认InCallUI到InCallService我还没有尝试使用它,但无论如何,它仅限于API 23,Marshmallow.

总之,您需要构建一个结合NotificationListener和AccessibilityService的解决方案,以便覆盖所有手机,希望如此.

点赞