有什么方法可以检测拨出电话是否已成功接听或接听?我正在使用 Intent.ACTION_CALL
调用电话,并使用 PhoneCallListener
在拨出电话接听时查找通话状态,但我无法做到这一点。这在 Android 中可能吗?
最佳答案
在深入研究这个问题之后,我得出了这个结论:
PhoneStateListener
不适用于拨出电话,它调用OFFHOOK
而不是RINGING
和OFFHOOK
永远不会调用 ANSWER。使用
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 事件类型: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秒;
- API 23 有一个新类,Call .它有更详细的调用状态;
STATE_ACTIVE
。您可以通过InCallService将手机默认的InCallUI替换成自己的UI。我还没有尝试使用它,但无论如何,它仅限于 API 23,Marshmallow。
作为结论,您需要构建一个结合NotificationListener
和AccessibilityService
的解决方案,以覆盖所有手机,希望如此。
关于Android - 如何检测拨出电话是否已接听或已接听?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26190318/