8

我想实现一个网关来处理拨出电话。

在最新的 Android 版本 2.x 中,我可以使用隐藏的 ACTION_CALL 额外字符串轻松做到这一点:“com.android.phone.extra.GATEWAY_URI”

但是在早期版本中,比如 1.6,我不知道该怎么做。这一定是可能的,因为谷歌语音正在这样做。有人可以帮帮我吗?

谢谢,伊曼纽尔

4

2 回答 2

2

嘿 Emmanuel,76% 的设备已经运行 Android 2.x,也许这种努力是白费了。Gingerbread 预计将在今年年底前问世,这将进一步推动 1.6 设备的百分比下降。在不到半年的时间里,Android 2.x 及更高版本将超过 80%。只需查看平台版本分布http://d.android.com/resources/dashboard/platform-versions.html。也许看看 Android Open Source Project 中的源代码。

我在InCallScreen.java中找到了您提到的字符串。也许这让您有一种方法可以深入研究较旧的源代码,以尝试确定您是否可以通过一些未记录的 API 访问它。但我的建议是不要打扰那些会很快消失的 1.6 设备中的最后 25%。

[更新] 由于它是使它工作的必要条件,我建议你从 git 存储库重新编译电话应用程序并使其可调试,这样你就可以准确地看到发生了什么。可能拥有一个运行 1.6 的 ASOP 设备是深入了解 Android 是如何做到这一点的最佳选择。基本上,您必须将 2.x 中与此功能相关的所有代码移植回 1.6。从上市时间的角度来看,我建议让该应用程序支持 2.x 并发布为 1.6 量身定制的第二个版本。仅仅因为 1.6 版本而推迟发布似乎是一个糟糕的商业想法。

于 2010-11-15T17:34:15.577 回答
0

使用 GATEWAY_URI 的代码肯定是在 Eclair 中添加的。查看 AOSP,在 packages/apps/Phone/src/com/android/phone/InCallScreen.java 中,这部分代码在 Donut 中完全不存在:

    // If a provider is used, extract the info to build the
    // overlay and route the call.  The overlay will be
    // displayed the first time updateScreen is called.
    if (PhoneUtils.hasPhoneProviderExtras(intent)) {
        mProviderLabel = PhoneUtils.getProviderLabel(this, intent);
        mProviderIcon = PhoneUtils.getProviderIcon(this, intent);
        mProviderGatewayUri = PhoneUtils.getProviderGatewayUri(intent);
        mProviderAddress = PhoneUtils.formatProviderUri(mProviderGatewayUri);
        mProviderOverlayVisible = true;

        if (TextUtils.isEmpty(mProviderLabel) || null == mProviderIcon ||
            null == mProviderGatewayUri || TextUtils.isEmpty(mProviderAddress)) {
            clearProvider();
        }
    } else {
        clearProvider();
    }

我看不到任何替代方案。最好的运气可能是从 Donut 中获取电话应用程序,添加您需要的内容并将其作为新的电话应用程序发布到 Donut 设备上......

于 2010-11-18T01:08:26.573 回答