Android在传出呼叫期间检测线路何时连接

时间:2012-08-20 13:59:36

标签: android

我只是在一个根深蒂固的Nexus上运行CM7的快速背景。 我正在尝试检测拨出电话何时实际连接:已停止响铃并且您呼叫的人已应答。通过论坛来看,这似乎是一个艰难的,也许是没有答案的问题。我真的很感激任何洞察力。

在我的搜索中,我能找到的最好的是: Android : How to get a state that the outgoing call has been answered? @PattabiRaman说:“不是检测拨出呼叫连接状态,而是很容易获得上次拨打电话的持续时间。” 他是否意味着当呼叫正在进行时,应该获得上次拨打的呼叫的持续时间?当持续时间超过0时,你知道吗?

2 个答案:

答案 0 :(得分: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可能会发生变化,因为这不是应用程序开发人员应该依赖的东西。

答案 1 :(得分:0)

我查看了代码。 除非您实例化Phone对象并将其设置为默认Phone,否则它将始终为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