【问题标题】:How do Apps get MY phone number to find friends?应用程序如何获取我的电话号码来寻找朋友?
【发布时间】:2016-04-22 21:29:56
【问题描述】:

我目前正在开发一个 cordova 网络应用程序。

我想知道像 Runkeeper 这样的应用程序如何向我显示我的通讯录的联系人,这些联系人也在使用 Runkeeper。每个联系人都有一个小的电话符号,所以我猜这个链接是通过电话号码建立的。

Runkeeper 从来没有得到我或我朋友的电话号码,但它无法从 SIM 卡中读取。

我能想到的唯一可能的方法是,Runkeeper 从 AccountManager 读取我的其他帐户并使用我的 WhatsApp-ID 建立连接...

有人知道这是怎么发生的吗?我也可以在我的 cordova 应用中这样做吗?

【问题讨论】:

  • 你怎么知道应用没有读取你的通讯录? Play 商店中的权限显示“读取您的联系人”
  • @cricket_007 它会读取我的通讯录,但问题是,它如何获得我自己的号码
  • 您自己的号码是您的 Google 帐户和手机通讯录的一部分
  • 所以其他应用可以通过谷歌账户读取我的电话号码?
  • 这是获取电话号码的一种方式,是的,如果您将号码保存到您的帐户中,否则Juan在下面的cmets中留下的链接是另一种方式。

标签: android cordova


【解决方案1】:

Runkeeper 读取您的联系人as per their own website。当您安装该应用程序时,他们会将您的安装与您的号码或源自您号码的内容(例如加密版本)一起存储在他们的数据库中。

当您想知道谁拥有该应用时,他们会对您的联系人号码进行相同的加密,并与他们拥有的内容相关联。

例如:

User1 : [Phone 1234] 
User2 : [Phone 2341] 
User3 : [Phone 3412]

User1 安装应用程序,Runkeeper 将其号码的 sha1 存储在他们的数据库中,无论是否加盐:

Runkeeper database of installs:
    7110eda4d09e062aa5e4a390b0a572ac0d2c0220

User2 安装应用程序,Runkeeper 将其号码的 sha1 存储在他们的数据库中:

Runkeeper database of installs:
    7110eda4d09e062aa5e4a390b0a572ac0d2c0220  <-user1
    52c88b165a3a614a5e3ceac0074bad92d5bb1c0a  <-user2

当 User2 加载向他显示正在使用该应用的联系人的 Activity 时,Runkeeper 会读取您的联系人,然后对于每个联系人,他们会联系他们的数据库并进行关联,而无需将您的电话号码或您的联系人发送到外面.

免责声明

这是一个示例方法,我不知道他们是否正在这样做。为了清楚起见,它被过度简化了。

跟进 虽然您可能从未向应用程序提供过电话号码,但这并不一定意味着它还没有。自己测试this answer 中的代码以检查它是否可读

显然 op 的 Settings / About Phone / Status / My phone Number 是空的,谷歌帐户的电话号码也是空的,这将是另一种访问它的方式。

【讨论】:

  • "Runkeeper 从来没有得到我的电话号码,但它无法从 SIM 卡中读取。"
  • 这只会妨碍其他用户找到您作为安装该应用程序的联系人,而不是您找到他们的联系人。stackoverflow.com/questions/2480288/…
  • 我知道,抱歉我没有说清楚。我用朋友的手机试了一下......我们在她的手机上找到了我,我在我的手机上找到了她,但对于这两款手机,SIM 卡上的电话号码都无法读取
  • SIM 卡无法读取是什么意思?您能否在示例应用程序中测试链接的问题以查看它是否确实可读?我现在很好奇这个
  • 用“SIM 卡信息”和两个类似的应用对其进行了测试。该字段为空。这是一家德国供应商...
【解决方案2】:

正如您在问题中所问的,cordova 有插件可以从当前的 Android 手机中检索详细信息,通过这些插件您可以获得有关当前用户的信息 您可以为此使用的一些插件是:
- https://github.com/vliesaputra/DeviceInformationPlugin
- https://github.com/pbakondy/cordova-plugin-sim,它有属性'phoneNumber',可以提供所有者的电话号码

当您登录/注册时,他们会收集您的设备信息并通过某种机制将其存储在服务器上


要获取所有联系人,还有一些插件,您可以通过这些插件从联系人列表中获取所有联系人,如下所示:
https://github.com/apache/cordova-plugin-contacts,使用此插件您可以在通讯录中找到一些联系人或获取所有联系人联系人

document.addEventListener("deviceready", init, false);
function init() {

    navigator.contacts.find(
        [navigator.contacts.fieldType.displayName],
        gotContacts,
        errorHandler);

}

function errorHandler(e) {
    console.log("errorHandler: "+e);
}

function gotContacts(c) {
    console.log("gotContacts, number of results "+c.length);
    for(var i=0, len=c.length; i<len; i++) {
        console.dir(c[i]);
    }
}

参考和更多信息:https://www.raymondcamden.com/2014/12/23/cordova-demo-viewing-all-contacts/


另一个获取所有联系人的插件:https://github.com/dbaq/cordova-plugin-contacts-phone-numbers
通过这种方式,您可以在项目中获取您和其他用户的联系方式/电话号码

我不知道他们如何映射您的联系人以查找哪些朋友正在使用此应用。可能是在您的联系人列表中进行一些服务器/客户端处理,或者可能是他的回答中提到的“胡安科尔特斯”之类的东西

【讨论】:

    【解决方案3】:

    有一些解决方法可以获取用户的电话号码,因为某些 sim 卡提供商不允许读取它。

    1. 首先尝试使用 TelephonyManager 来检查您是否可以从 sim 卡中读取(大多数情况下不能)。

    2. 大多数设备都安装了 whatsapp / telegram / 或类似的应用程序。因此,请使用 Accountmanager 检查他们的帐户

    3. 如果您的应用必须使用电话号码,最好让用户输入并在验证后存储在 sharedprefs 中。

    4. 读取用户发送短信并获取发件人地址(即电话号码)

    这是 1、2 和 3 的 link

    还有link 4

    我还没有尝试过,但这些是我目前所知道的基本解决方法。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多