gpt4 book ai didi

Android - 如何检测拨出电话是否已接听或已接听?

转载 作者:太空宇宙 更新时间:2023-11-03 10:19:39 24 4
gpt4 key购买 nike

有什么方法可以检测拨出电话是否已成功接听或接听?我正在使用 Intent.ACTION_CALL 调用电话,并使用 PhoneCallListener 在拨出电话接听时查找通话状态,但我无法做到这一点。这在 Android 中可能吗?

最佳答案

在深入研究这个问题之后,我得出了这个结论:

  1. PhoneStateListener 不适用于拨出电话,它调用 OFFHOOK 而不是 RINGINGOFFHOOK 永远不会调用 ANSWER。

  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;事件时间:21715433;包名:com.android.incallui;运动粒度:0; Action :0 [类名:android.widget.TextView;文本: [];内容描述:0分0秒;

onAccessibilityEvent 事件类型:TYPE_WINDOW_CONTENT_CHANGED;事件时间:21715533;包名:com.android.incallui;运动粒度:0; Action :0 [类名:android.widget.TextView;文本: [];内容描述:0分1秒;

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

作为结论,您需要构建一个结合NotificationListenerAccessibilityService 的解决方案,以覆盖所有手机,希望如此。

关于Android - 如何检测拨出电话是否已接听或已接听?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26190318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com