只是一个快速的背景我正在一个有根的 Nexus 上运行 CM7。我正在尝试检测何时实际连接了拨出电话:已停止响铃并且您呼叫的人已接听。纵观论坛,这似乎是一个棘手的问题,也许没有答案。我真的很感激对此的任何见解。
在我的搜索中,我能找到的最好的是: Android:如何获得拨出电话已被接听的状态? @PattabiRaman 说:“而不是检测呼出连接状态,很容易得到最后一次拨打电话的持续时间。” 他的意思是应该在通话进行时获得最后一次拨打电话的持续时间吗?当持续时间超过 0 时,你知道吗?
只是一个快速的背景我正在一个有根的 Nexus 上运行 CM7。我正在尝试检测何时实际连接了拨出电话:已停止响铃并且您呼叫的人已接听。纵观论坛,这似乎是一个棘手的问题,也许没有答案。我真的很感激对此的任何见解。
在我的搜索中,我能找到的最好的是: Android:如何获得拨出电话已被接听的状态? @PattabiRaman 说:“而不是检测呼出连接状态,很容易得到最后一次拨打电话的持续时间。” 他的意思是应该在通话进行时获得最后一次拨打电话的持续时间吗?当持续时间超过 0 时,你知道吗?
该类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 可能会发生变化,因为这不是应用程序开发人员应该依赖的东西。
我已经查看了代码。除非您实例化一个电话对象并将其设置为默认电话,否则它将始终为 null。但是实例化它需要一些系统权限,只允许系统应用程序。
通过使用此方法: com.android.internal.telephony.PhoneFactory# public static void makeDefaultPhones(Context context) {