【问题标题】:Android 1.6 equivalent of EXTRA_GATEWAY_URI相当于 EXTRA_GATEWAY_URI 的 Android 1.6
【发布时间】:2010-11-02 20:10:03
【问题描述】:

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

在最新的 Android 版本 2.x 中,我可以使用隐藏的 ACTION_CALL 额外字符串轻松完成此操作: "com.android.phone.extra.GATEWAY_URI"

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

谢谢, 伊曼纽尔

【问题讨论】:

  • 基本上我希望能够拨打一个电话号码,但要为用户显示不同的号码。例如,这对于电话卡应用程序很有用。
  • 我该怎么做才能得到答案?
  • 原始代码不是在某处开源的吗?您可以简单地扫描实现并复制所需的代码。
  • 谷歌语音真的可以拨打电话吗?我认为它使用 IP 网络请求服务器拨打电话,然后接听回调,只是比您从网站上拨打电话时更无缝。如果您将您的谷歌语音“拨号”日志与您的移动账单(假设它指定传入/传出)进行比较,您应该能够判断是否是这种情况。

标签: android google-voice


【解决方案1】:

嘿,伊曼纽尔, 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 版本而推迟发布似乎是一个糟糕的商业想法。

【讨论】:

  • 在某种意义上我同意你的看法,但这是我雇主的要求,我必须交付。我确实查看了旧代码,但我不知道它是如何工作的。我试过玩额外的东西但没有成功。基本上我希望能够拨打一个电话号码,但要为用户显示不同的号码。
  • 我不确定我是否理解。您希望我在运行 Google Voice 的同时调试电话应用程序吗?我不知道该怎么做……首先我必须在模拟器上安装谷歌语音——不知道怎么做。第二个谷歌语音在加拿大不可用。我不得不作弊。
  • 嘿 Emmanuel,不,我不是在说调试 Google Voice,而是从 2.x 开始调试电话应用程序,因此您可以查看电话应用程序在何处以及如何使用该方法,然后您可以一直深入了解Android 中的低级调用,并希望找到 1.6 中已经存在的东西。这很乏味,但如果你真的需要弄清楚这是我能想象的唯一方法。您可以在模拟器或真机上调试它。但重新编译电话应用程序将是必要的,因为股票应用程序通常不可调试。
【解决方案2】:

使用 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 设备上...

【讨论】:

  • 我也在查看源代码,我确实注意到在 1.6 和之前的版本中缺少 API。但既然谷歌语音可以做到这一点,就必须有一些其他的 API 可以用来产生类似的结果。我看了额外的东西,但找不到任何东西。我觉得很奇怪,对于 ACTION_CALL,电话号码在 EXTRA_PHONE_NUMBER 和意图 URI 中都指定了,但似乎只有意图 URI 号码很重要。我在 EXTRA_PHONE_NUMBER 中输入的任何内容似乎都被忽略了。或者有什么秘密行动可以拨打 Google 语音电话?
猜你喜欢
  • 2011-10-16
  • 2013-09-05
  • 2011-04-26
  • 2019-02-06
  • 1970-01-01
  • 2015-06-06
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多