【问题标题】:How does "Phone" app show information of contacts that are not on the address book?“电话”应用程序如何显示不在通讯录中的联系人信息?
【发布时间】:2019-07-24 04:19:31
【问题描述】:

背景

在 Google 的“Phone”应用程序中,有一个“来电显示和垃圾邮件”选项:

因此,如果您接到来自不在通讯簿上的某人或某个组织的电话,但它以某种方式被识别,您会得到一个名称,例如(称为“+972-035283487”):

自 Android M (6.0 - API 23) 以来,应用程序可以替换默认的电话应用程序,然后通过扩展 InCallService 类,还可以在您打电话或接听电话时提供替代 UI,如 here 所示这是基于here

问题

我想尝试显示与“电话”应用程序相同的信息,即个人/公司的名称,以防被识别(并且不在通讯簿上)。

我尝试过的

我试图挖掘通过拨号器的 API 获得的各种东西,但失败了:

  1. 各种字段和函数:android.telecom.Call

  2. Call 类里面有getDetails,所以我试图得到里面的内容,并且在 "statusHints" 里面还有 statusHints 和 "label" 。这些都没有任何信息(返回 null)。我试图查看“statusHints”的原因是因为这就是我在文档上看到的:

包含通话界面中显示的状态标签和图标。

  1. 在“电话”应用程序中,按“了解更多”会转到一个网站 (here),其中包含我认为可能是数据来源的链接,但我认为应用程序本身不会使用它。相反,我认为它使用了 Google 的一些东西。

问题

  1. 是否可以获得此 CallerId 信息?如果有,怎么做?

  2. 电话应用程序是如何做到的?它应该是开源的,所以必须有一些东西可以提供这些信息,对吧?克隆它会以某种方式获得这些信息吗?也许 Google 有自己的 CallerID 服务?

  3. “callDetails”和“statusHints”有什么用?他们提供什么?

【问题讨论】:

  • 可能来自 Google 的地点数据库。类似的问题在这里:stackoverflow.com/questions/16463399/…
  • 你查过号码对应的content provider数据吗?
  • @ChristosThemelis 你怎么知道?你检查过吗?它是否返回相同的信息?
  • @SarthakMittal 你什么意思?哪个内容提供商?如何检查?
  • @androiddeveloper 我在手机上注意到拨号器的一些我交叉检查的结果与出现在 Google 地方的名称相匹配。我没有交叉检查所有结果

标签: android android-dialer caller-id


【解决方案1】:

我相信 Android 的原生手机应用正在使用 Google 的地点搜索 API。因为您可以通过电话号码轻松搜索地点并获取地点详细信息,例如名称、地点 ID、格式化地址以及您可以在 the documentation 中找到的许多其他字段

请求网址https://maps.googleapis.com/maps/api/place/findplacefromtext/json

请求方法:GET

请求查询参数

  • key:您应用的 API 密钥。
  • input:指定要搜索的位置的文本输入(例如姓名或电话号码)。
  • inputtype:输入的类型。这可以是 textquery 或 phonenumber 之一。电话号码必须在 国际格式(以加号 ("+") 为前缀,后跟 国家代码,然后是电话号码本身)。

请求示例https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=%2B972035283487&inputtype=phonenumber&fields=place_id,name&key=API_KEY_HERE

示例响应

{
   "candidates" : [
      {
         "name" : "מלך העופות",
         "place_id" : "ChIJ78ko1zBKHRURpwbgUdWc4nU"
      },
      {
         "name" : "Of Yaakov",
         "place_id" : "ChIJv3myn4FMHRURUGffcXgxKuw"
      }
   ],
   "status" : "OK"
}

注意: 此类 API 目前在适用于 Android 的 Google Places SDK 中不可用,但您可以直接在您的应用程序中使用 HTTP API,或者您可以在后端创建一个 API 作为 places API 的代理。我更喜欢更高版本,因为在第一个解决方案中,API 密钥部署在应用程序代码中,黑客可以反编译 APK 并出于恶意原因使用它。出于安全原因,您必须将 API 密钥的使用限制为服务器的 IP 地址,以防您使用后端解决方案!

【讨论】:

  • 你测试了吗?如果我搜索我在屏幕截图上显示的电话号码(在上面写了电话号码),它会显示相同的信息吗?我注意到它可用于服务器端和客户端,并且可能要花钱,但对于基本使用而言,它似乎不花钱:developers.google.com/places/web-service/usage-and-billing。不确定这是否是正确的网站。你能解释一下吗(它没有说明网站上的区别,也没有显示它的成本,可能客户端与服务器的不同......)......
  • “callDetails”和“statusHints”是干什么用的?
  • @androiddeveloper 是的,我能够在屏幕上获得与您相同的信息。您只需在 Google 云控制台中创建一个新项目并启用计费即可使用 API,您将获得 300 美元的试用费,因此您可以免费测试一段时间,然后在计费应用后,这真的很复杂,具体取决于哪些数据您需要从 API 中获取。您可以在您分享的同一链接中找到更多信息developers.google.com/places/web-service/usage-and-billing
  • 不知道“callDetails”和“statusHints”变量是干什么用的!
  • 我认为您对计费的看法是对的,但以防万一我已经建立了一个项目并会监控它并在确定后更新答案!关于代码示例,您到底想到了什么?因为这是一个简单的获取请求和一些查询参数!如果您只是在提供有效 API 密钥的浏览器中单击请求,它将起作用!我不想编写 HTTP 库特定代码 tbh
【解决方案2】:

我试图反编译 Dialer 应用程序,找不到有关应用程序如何执行此操作的具体信息。

但此信息可能很有用。请检查一下。

在拨号器应用程序中,有类SpamCallDatabase_Impl.smali SpamCallDatabase.smali 并且在 com.google.android.gms 应用程序包中运行了一个服务,它提供了垃圾邮件列表

com.google.android.gms/.telephonyspam.sync.SpamListSyncTaskService 

对于来电显示检查这个提交

https://gitlab.e.foundation/e/os/android_packages_apps_Dialer/commit/420eb901ed1d64fdaf055cde4cc46d7a5c0b42fc

这看起来像 lineage os 的拨号器应用程序 它使用不同的服务来查找电话号码,例如

https://auskunft.at/

https://www.dastelefonbuch.de/

【讨论】:

  • 那么您的意思是,这对开发人员来说是隐藏的,并且那些制作自己的拨号器的人使用不同的服务集来找出电话号码背后的人?鉴于“lineage os”是完全免费的,是否意味着这些服务也是免费的?
  • “callDetails”和“statusHints”是干什么用的?
【解决方案3】:

我相信 Google 有自己的垃圾邮件呼叫者数据库,电话应用会将号码发送到其服务器,如果匹配,它会显示姓名。

也许,如果您的应用可以读取通知,则有可能检索到该名称。试试this的例子,根据你的需要修改

【讨论】:

  • 我对这种变通办法不感兴趣。此外,我想知道当当前应用程序是默认拨号器时该怎么做,所以无论如何这都行不通......
  • “callDetails”和“statusHints”是干什么用的?
  • 如果它是默认拨号器并且您的应用可以读取通知,那么应该可以从该通知中获取文本。我不知道你要的第二部分
  • 如果应用程序是默认拨号器并显示自己的 UI,则它是负责显示通知的应用程序,因此无需阅读通知,因为我会创造它。也没有要读取的数据,因为我应该将文本放入其中。
【解决方案4】:

您可以为此检查 Truecaller 等应用的运行情况。 Truecaller 在一个给予和接受的情况下采取行动......你想要那些未知号码然后你必须与你的电话簿联系人分开。现在显然每个安装了该应用程序的人都交出了他的电话簿。这些数据来自数百万在智能手机上下载了 truecaller 应用程序的用户。作为最终用户协议的一部分,truecaller 应用程序要求用户允许访问智能手机上用户的通讯录/联系人。然后,此数据由应用程序上传到公司的服务器。在经过多种数据匹配/优化算法之后,这些数据可供所有 truecaller 用户搜索。

【讨论】:

  • 我知道这一点。我询问了 Google 的拨号器应用程序。
【解决方案5】:

Google Phone app 默认提供使用来电显示和垃圾邮件防护功能。其中一些步骤仅适用于Android 6.0 及更高版本。

当您拨打或接听来电显示和垃圾邮件保护时,您可以看到不在您的通讯录中的来电者或企业的信息,或关于潜在垃圾邮件来电者的警告。

要使用来电显示和垃圾邮件防护功能,您的手机可能需要将有关您来电的信息发送给 Google。

关闭或重新开启来电显示和垃圾邮件防护

来电显示和垃圾邮件防护默认开启。您可以选择将其关闭。

要使用来电显示和垃圾邮件防护功能,您的手机可能需要将有关您来电的信息发送给 Google。它不控制您拨打电话时是否显示您的号码。

Google 的来电显示显示带有“Google 我的商家”列表的公司和服务的名称。它还会在显示工作或学校帐户的呼叫者信息的任何目录中查找匹配项。

根据您的解决方案,Google 不会根据您的需要提供此类支持。您需要创建自己的函数并将垃圾邮件和其他联系方式保存在您身边。

【讨论】:

  • 你写的好像我问作为一个用户如何使用它。我问的是如何使用 API 来获取此信息,而不是如何在智能手机上启用它...我已经知道如何打开设置...
  • 正如我所说,谷歌不提供 API 来获取这些信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多