我想实现一个网关来处理拨出电话。
在最新的 Android 版本 2.x 中,我可以使用隐藏的 ACTION_CALL 额外字符串轻松做到这一点:“com.android.phone.extra.GATEWAY_URI”
但是在早期版本中,比如 1.6,我不知道该怎么做。这一定是可能的,因为谷歌语音正在这样做。有人可以帮帮我吗?
谢谢,伊曼纽尔
我想实现一个网关来处理拨出电话。
在最新的 Android 版本 2.x 中,我可以使用隐藏的 ACTION_CALL 额外字符串轻松做到这一点:“com.android.phone.extra.GATEWAY_URI”
但是在早期版本中,比如 1.6,我不知道该怎么做。这一定是可能的,因为谷歌语音正在这样做。有人可以帮帮我吗?
谢谢,伊曼纽尔
嘿 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 版本而推迟发布似乎是一个糟糕的商业想法。
使用 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 设备上......