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

标签 android broadcastreceiver phone-call telephony telephonymanager

有什么方法可以检测拨出电话是否已成功接听或接听?我正在使用 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/

相关文章:

android - android onCreate 初始化用户对象

android - 在android中创建一个3d形状的按钮

android - BroadcastReceiver 中的可序列化附加功能

ios - 如何通过互联网在两个应用程序之间进行语音聊天?

android - 无提示调用号码

android - 如何在 Android 中使用 Intent 调用电话?

无法导入 Android Studio 通知 channel

Android APK 证书 - 需要哪些字段,如果该信息发生更改怎么办?

android - 是否有理由继续使用 IntentService 来处理 GCM 消息?

android - 如何获得可靠的 Broadcastreceiver