检测在Android上应答的拨出电话

我知道这已经被问了很多次了,没有答案,但我仍然希望有人终于解决了这个问题。

问题:我有一个运行Android 2.3的无根设备。 我需要创build一个服务,其中:

  1. 打个电话;
  2. 等待电话回复;
  3. 挂断电话后(超时);

像其他许多人一样,我被困在#2。 以下是有史以来build议的解决scheme的总结:

  • 使用PhoneStateListener(最stream行的):不起作用,对于一个传出的呼叫,它不能检测到我需要什么。
  • 使用com.android.internal.telephony.CallManager和它的方法,如registerForPreciseCallStateChanged (例如, 这个 ):不起作用,没有电话注册,所以事件不会触发。
  • 使用com.android.internal.telephony.PhoneFactory获取一个com.android.internal.telephony.Phone实例(这是一切的关键):不起作用,工厂没有初始化; 尝试使用makeDefaultPhones调用初始化它将导致安全exception(如此处 )。
  • 检测外出的铃声( 链接 ):作者 – Dany Poplawec – 说检测铃声可能有助于解决问题,但没有提供任何细节,所以我没有能够尝试这种技术。

它看起来像一切都已经尝试过,但仍然可能有一个伎俩,将拯救我:)

Solutions Collecting From Web of "检测在Android上应答的拨出电话"

我试图得到这个,也找不到任何解决scheme。

查看Android的源代码我发现〜/ kitchen / jellybean / frameworks / opt / telephony / src / java / com / android / internal / telephony / Call.java

 public enum State { IDLE, ACTIVE, HOLDING, DIALING, ALERTING, INCOMING, WAITING, DISCONNECTED, DISCONNECTING; public boolean isAlive() { return !(this == IDLE || this == DISCONNECTED || this == DISCONNECTING); } public boolean isRinging() { return this == INCOMING || this == WAITING; } public boolean isDialing() { return this == DIALING || this == ALERTING; } } 

我认为可以知道一个呼出是否被回答检查ACTIVE状态,但我不知道如何从应用程序读取这个值,也许修改框架通过添加一个特定的function,如:

  public boolean isActive() { return this == ACTIVE; } 

这只是一个想法,但我不知道如何实现这一点,因为从应用程序层访问这个新function显然需要做其他修改。

如果你发现这个可行或知道如何去做,帮助和反馈将非常感激。

如果您按照Android INJECT_EVENTS权限中的说明操作,则可以在根用户设备中使用第3项符号中的解决scheme

一步一步,它是这样的:

  1. 使用平台证书签署应用程序。 这需要以下步骤:
  2. 使用adb将应用程序安装为系统应用程序:

    adb根

    adb remount

    adb推MyApp.apk / system / app

    adb shell chmod 644 /systen/app/MyApp.apk

  3. 重新启动设备。

我实际上已经在第二个子弹中尝试过这个解决scheme,它对我也不起作用(在运行Kitkat的Galaxy S5上)。 第三个项目中的解决scheme确实可行。 无论程序包名称如何,应用程序都以com.android.phone的forms运行,因此如果要debugging应用程序,则需要附加到该进程。