我知道已经多次问过这个问题,没有答案,但我仍然希望有人最终解决了这个问题。
问题:我有一台运行Android 2.3的非root设备。我需要创建一个服务:
和许多其他人一样,我已经陷入了#2。以下是有人提出的解决方案的摘要:
com.android.internal.telephony.CallManager
及其registerForPreciseCallStateChanged
之类的方法(例如this one):不起作用,未在其中注册任何手机,因此不会触发事件。com.android.internal.telephony.PhoneFactory
获取com.android.internal.telephony.Phone
实例(这是所有内容的关键):不起作用,工厂未初始化;尝试使用makeDefaultPhones
调用结果初始化安全异常(例如here)。看起来已经尝试了所有东西,但是仍然可能还有一个技巧可以拯救我:)
答案 0 :(得分: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状态,但我不知道如何从应用程序读取此值,可能通过为此添加特定功能来修改框架: / p>
public boolean isActive() {
return this == ACTIVE;
}
这只是一个想法,但我不确定如何实现这一点,因为显然必须进行其他修改才能从应用层访问这个新功能。
如果您认为这样做或知道如何做到这一点,将非常感谢帮助和反馈。
答案 1 :(得分:0)
如果您按照Android INJECT_EVENTS permission
中的说明操作,则可以在root设备中使用第3个项目符号中的解决方案一步一步,它就像:
使用adb:
将应用程序安装为系统应用程序adb root
adb remount
adb push MyApp.apk / system / app
adb shell chmod 644 /systen/app/MyApp.apk
重启设备。
我实际上已尝试过第二个子弹中的解决方案,但它对我来说也不起作用(在运行Kitkat的Galaxy S5上)。 第3项目中的解决方案确实可以正常工作。无论软件包名称如何,该应用程序都以com.android.phone运行,因此如果要调试应用程序,则需要附加到该进程。