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

时间:2013-05-22 04:59:53

标签: android

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

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

  1. 拨打电话;
  2. 等待电话接听;
  3. 在应答呼叫后挂断电话(超时);
  4. 和许多其他人一样,我已经陷入了#2。以下是有人提出的解决方案的摘要:

    • 使用PhoneStateListener(最受欢迎):不起作用,对于拨打电话,它无法检测到我需要的内容。
    • 使用com.android.internal.telephony.CallManager及其registerForPreciseCallStateChanged之类的方法(例如this one):不起作用,未在其中注册任何手机,因此不会触发事件。
    • 使用com.android.internal.telephony.PhoneFactory获取com.android.internal.telephony.Phone实例(这是所有内容的关键):不起作用,工厂未初始化;尝试使用makeDefaultPhones调用结果初始化安全异常(例如here)。
    • 检测外发铃声(link):作者 - Dany Poplawec - 声明检测铃声可能有助于解决问题,但未提供任何详细信息,因此我无法尝试此操作技术。

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

2 个答案:

答案 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个项目符号中的解决方案

一步一步,它就像:

  1. 使用平台证书签署应用程序。这需要以下步骤:
    • android:sharedUserId =“android.uid.phone”添加到apk清单的manifest-tag中。
    • android:process =“com.android.phone”添加到清单的应用标记中。
    • 您可能需要为清单添加一些额外权限,还需要更改项目“Android Lint首选项”中 ProtectedPermission 的严重性。
    • 从{Android Source} / build / target / product / security获取platform.pk8 + platform.x509.pem(我在https://android.googlesource.com/platform/build/+/android-4.4.4_r1/target/product/security/中使用了4.4.4r1的那些)
    • https://github.com/getfatday/keytool-importkeypair
    • 下载keytool-importkeypair
    • 使用此脚本通过以下命令获取平台的密钥库: keytool-importkeypair -k google_certificate.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform 。我在cygwin上运行它,对脚本进行了一些修改。
    • 使用此密钥库签署apk。
  2. 使用adb:

    将应用程序安装为系统应用程序
      

    adb root

         

    adb remount

         

    adb push MyApp.apk / system / app

         

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

  3. 重启设备。

  4. 我实际上已尝试过第二个子弹中的解决方案,但它对我来说也不起作用(在运行Kitkat的Galaxy S5上)。 第3项目中的解决方案确实可以正常工作。无论软件包名称如何,该应用程序都以com.android.phone运行,因此如果要调试应用程序,则需要附加到该进程。