检测到在Android上接听的拨出电话

Ale*_*lev 11 android

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

问题:我有一个运行Android 2.3的非root设备.我需要创建一个服务:

  1. 打个电话;
  2. 等待电话接听;
  3. 在应答呼叫后挂断电话(超时);

像许多其他人一样,我已经陷入了#2.以下是有史以来建议的解决方案的摘要:

  • 使用PhoneStateListener(最受欢迎):不起作用,对于拨打电话,它无法检测到我需要的内容.
  • 使用com.android.internal.telephony.CallManager及其方法registerForPreciseCallStateChanged(例如,这一个):不起作用,没有电话在其中注册,因此事件不会触发.
  • 使用com.android.internal.telephony.PhoneFactory获得com.android.internal.telephony.Phone实例(这是一切的关键):不工作,工厂没有被初始化; 尝试makeDefaultPhones使用安全异常中的调用结果初始化它(如此).
  • 检测传出铃声(链接):作者 - Dany Poplawec - 指出检测铃声可能有助于解决问题,但没有提供任何细节,所以我无法尝试这种技术.

看起来已经尝试了所有东西,但仍然可能还有一个技巧可以拯救我:)

108*_*427 0

我也在尝试解决这个问题,但还没有找到任何解决方案。

查看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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为人们可以通过检查 ACTIVE 状态来知道拨出电话是否已应答,但我不知道如何从应用程序中读取此值,也许可以通过为此添加特定函数来修改框架,例如:

    public boolean isActive() {
         return this == ACTIVE;
    }
Run Code Online (Sandbox Code Playgroud)

这只是一个想法,但我不确定如何实现它,因为显然必须进行其他修改才能从应用程序层访问这个新功能。

如果您发现这可行或知道如何去做,我们将非常感谢您提供帮助和反馈。