11

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

问题:我有一个运行 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 - 指出检测铃声可能有助于解决问题,但没有提供任何细节,所以我无法尝试这种技术。

看起来一切都已经尝试过了,但可能还有一个技巧可以拯救我:)

4

2 回答 2

0

如果您按照 Android INJECT_EVENTS 权限中的说明进行操作,则第三个项目符号中的解决方案应该可以在有根设备中使用

一步一步,它是这样的:

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

    亚行根

    adb 重新挂载

    adb push MyApp.apk /system/app

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

  3. 重启设备。

我实际上已经尝试了第二个项目符号中的解决方案,但它对我也不起作用(在运行 Kitkat 的 Galaxy S5 上)。第三个项目中的解决方案确实工作得很好。无论包名称如何,应用程序都以 com.android.phone 运行,因此如果要调试应用程序,则需要附加到该进程。

于 2014-08-05T20:56:23.120 回答
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;
    }
}

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

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

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

如果您发现此方法可行或知道如何操作,我们将非常感谢您提供帮助和反馈。

于 2013-08-26T16:32:07.093 回答