2

只是一个快速的背景我正在一个有根的 Nexus 上运行 CM7。我正在尝试检测何时实际连接了拨出电话:已停止响铃并且您呼叫的人已接听。纵观论坛,这似乎是一个棘手的问题,也许没有答案。我真的很感激对此的任何见解。

在我的搜索中,我能找到的最好的是: Android:如何获得拨出电话已被接听的状态? @PattabiRaman 说:“而不是检测呼出连接状态,很容易得到最后一次拨打电话的持续时间。” 他的意思是应该在通话进行时获得最后一次拨打电话的持续时间吗?当持续时间超过 0 时,你知道吗?

4

2 回答 2

1

该类com.android.internal.telephony.CallManager应该有关于何时实际应答呼叫的信息。它有一个getInstance()返回 CallManager 实例的公共静态方法,以及一个getActiveFgCallState()将当前调用状态作为Call.State枚举返回的公共方法。
所以理论上这样的事情可能会起作用:

Method getFgState = null;
Object cm = null;

try {
  Class cmDesc = Class.forName("com.android.internal.telephony.CallManager");
  Method getCM = cmDesc.getMethod("getInstance");
  getFgState = cmDesc.getMethod("getActiveFgCallState");
  cm = getCM.invoke(null);
} catch (Exception e) {
  e.printStackTrace();
}

然后反复轮询状态:

Object state = getFgState.invoke(cm);
if (state.toString().equals("IDLE")) {
  ...
} else if (state.toString().equals("ACTIVE")) {
  // If the previous state wasn't "ACTIVE" then the
  // call has been established.
}

我还没有验证这是否真的有效。即使是这样,您也必须记住 API 可能会发生变化,因为这不是应用程序开发人员应该依赖的东西。

于 2012-08-20T17:35:36.137 回答
0

我已经查看了代码。除非您实例化一个电话对象并将其设置为默认电话,否则它将始终为 null。但是实例化它需要一些系统权限,只允许系统应用程序。

通过使用此方法: com.android.internal.telephony.PhoneFactory# public static void makeDefaultPhones(Context context) {

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.4_r1.2/com/android/internal/telephony/PhoneFactory.java

于 2013-11-14T15:43:47.437 回答