【问题标题】:How to obtain Skype ID from Contact DB on Android (my solution is almost OK)如何从 Android 上的 Contact DB 获取 Skype ID(我的解决方案几乎可以)
【发布时间】:2020-04-26 09:21:14
【问题描述】:

编辑

仅供参考,从 lookupKey(类似于“1450iSkype_288”)中提取 RawContactID 的技巧不再起作用。

总结

我能够获取“Skype ID”/“Skype 用户名”,但我的解决方案并不总是有效,因为 Skype 应用程序的联系人数据库似乎并不总是包含(公开?)“所有”数据。
在问我的问题之前让我解释一下情况:

1 - 从 Skype apk 收集信息

Skype App (apk) 包含 /res/xml/contacts.xml 其中包含

<ContactsDataKind
    android:icon="@ref/0x7f0e0004"
    android:mimeType="vnd.android.cursor.item/com.skype4life.audio"
    android:summaryColumn="data3"
    android:detailColumn="data4" />

<ContactsDataKind
    android:icon="@ref/0x7f0e0004"
    android:mimeType="vnd.android.cursor.item/com.skype4life.video"
    android:summaryColumn="data3"
    android:detailColumn="data4" />

<ContactsDataKind
    android:icon="@ref/0x7f0e0004"
    android:mimeType="vnd.android.cursor.item/com.skype4life.message"
    android:summaryColumn="data3"
    android:detailColumn="data4" />

<ContactsDataKind
    android:icon="@ref/0x7f0e0004"
    android:mimeType="vnd.android.cursor.item/com.skype4life.phone"
    android:summaryColumn="data3"
    android:detailColumn="data4" />

这里的重要数据是这 4 种 Skype mimeTypes

"vnd.android.cursor.item/com.skype4life.phone"
"vnd.android.cursor.item/com.skype4life.message"
"vnd.android.cursor.item/com.skype4life.audio"
"vnd.android.cursor.item/com.skype4life.video"

注意:
看起来这些是在 2018 年 Augustus 前后添加的(请参阅此处http://www.skaip.org/skype-8-27-0-88-for-android

另一个有用的信息是 Skype 的ContactsContract.RawContacts.ACCOUNT_TYPE"com.skype.raider"

2 - 查询内容提供者

使用在第 1 点中获得的信息,我可以query Skype ContentProvider(使用选择 ContactsContract.Data.MIMETYPE+ "= ? " 和 selectionArgs "com.skype.raider" )并获得必须根据“解释”的数据到 mimeType(在第 1 点中获得的 4 个 Skype mimeTypes 之一)。

2.1 - 对于 mimeType vnd.android.cursor.item/com.skype4life.message,我得到如下内容:

mimetype = vnd.android.cursor.item/com.skype4life.message
_id = 2773
lookup = 1450iSkype_288
contact_id = 1601
display_name = <Skype User DISPLAY Name HERE>
raw_contact_id = 515
mimetype = vnd.android.cursor.item/com.skype4life.message
data1 = 8:<skype.user.name.value.here>
data2 = null
data3 = Skype
is_primary = 0
data5 = null

在哪里

<Skype User DISPLAY Name HERE>  is an actual Display Name
<skype.user.name.value.here>    is an actual Skype user name / Skype ID

&lt;skype.user.name.value.here&gt;是我要的数据,这样就好了!

重要提示:

编辑:这个技巧不再起作用 ->

lookup = 1450iSkype_288 可以解析得到288,它是某个其他联系人的 RawcontactId!
如果这个 rawContact 有一个contactId,那么这允许我找到原始联系人(与 RawContact 相比) 它甚至有时会引用一些不是 Google 联系人的联系人,但是,例如,WhatsApp 联系人!
享受这些重要信息 ;-)

2.2 - 这两个 mimeTypes 的相似数据:

"vnd.android.cursor.item/com.skype4life.audio"
"vnd.android.cursor.item/com.skype4life.video"

所以我也可以获得&lt;skype.user.name.value.here&gt;。再次,这很好!

2.3 - Phone mimeType

"vnd.android.cursor.item/com.skype4life.phone"

不包含 Skype ID(在 data1 字段中),而是包含电话号码,这是有道理的。

3 - 问题

所以,这一切都很好,我决定在其他一些设备上测试我的代码,我安装了 Skype 并使用相同的 Skype 帐户 + 相同的 Google 帐户,BOOM,这里是问题:

Skype 内容提供程序只有 mimeType 的数据

"vnd.android.cursor.item/com.skype4life.phone" // <- contains Skype user's phone number, NOT Skype user name / Skype ID

并且没有这 3 种 mimeType 的数据

"vnd.android.cursor.item/com.skype4life.message" // <- contains Skype username / ID
"vnd.android.cursor.item/com.skype4life.audio"   // <- contains Skype username / ID
"vnd.android.cursor.item/com.skype4life.video"   // <- contains Skype username / ID

Skype 电话号码仅用于通过 Skype 拨打电话,但这不是我想做的:我想通过“互联网 Skype 音频/视频”通话,而不是“普通手机”通话。

4 - 问题

为什么 Skype 应用有时会存储所有 4 个“电话/消息/音频/视频”mimeType 数据,有时只存储“电话”mimeType?
在后一种情况下,我无法获取 Skype Ids / Skype 用户名,即我上面提到的 &lt;skype.user.name.value.here&gt;

我知道我的解决方案是某种“类似逆向工程的方法”的结果,根本不是“官方”的,但也许其他人做了我做过的同样的调查并且可以找到解决方案?

也许应该在 Skype 应用程序或 Android 中激活一些“Skype 同步设置”?

我已经强制为 Google 和 Skype 帐户重新同步联系人,但这没有帮助。

感谢您的帮助。

【问题讨论】:

标签: android android-contentprovider skype


【解决方案1】:

多么伟大的研究啊!我来到这里是因为我偶然发现了同样的问题。我也想获取Skype用户名,但通讯录中只有mimetype“vnd.android.cursor.item/com.skype4life.phone”。

如果我查看您的链接,您提到这些 com.skype4life.* 已添加,我还看到添加:

sync_adapter_account_type:
= com.skype4life
sync_adapter_authority:
= com.android.contacts

所以他们把这个加在一起。也许我们应该以一种或另一种方式同步它?

【讨论】:

  • 谢谢。我列出了设备上的所有同步适配器和权限,只找到了与 Skype 相关的 com.skype.raider(没有 com.skype4life,尽管在网络上到处都有提及)
  • 嗯,突然间他们添加到了 mij 通讯录中。我不知道触发器是什么...您知道如何触发自动音频或视频通话吗?我可以这样使用: Intent intent = new Intent();意图.setAction(意图.ACTION_VIEW); intent.setData(Uri.parse("skype:" + contactNumber + "?call")); context.startActivity(intent);但这只会触发 callscreen 本身,而不是实际调用
  • 好的,确实有一些同步机制,但不是立即的。 Skype 也改变了通话开始的方式,所以现在用户必须点击一个按钮。我(还)找不到任何解决方法。对于视频通话,只需使用 Uri.parse("skype:" + skypeId + "?call&video=true"),但您可能已经知道 ;-) 仅供参考,我很快就会调查 Google Duo,因为我也想集成到我的应用中。
  • 我认为您正在尝试与我相同的方法 :-D 在 Google Play 商店中搜索“seniorfoon”(这是荷兰语,但您会发现)
  • 不错。因此,即使不在您的 WhatsApp 联系人列表中的人也可以拨打 Whatsapp 电话?我的 (10) 个应用程序在这里:play.google.com/store/apps/developer?id=Elementique 如果您希望我们进一步讨论,请随时通过电子邮件与我们联系。 Ik spreek een beetje Nederlands ;-)
【解决方案2】:

唯一的问题是,您没有com.skype.raider.permission.ACCOUNT

所以你只能通过ContentProvider查询它们或者建立一个索引来查找它们。

例如:

类似com.skype.android.skypecall.action 的意图字符串可能不再存在,因为com.skype.raider/com.skype4life 显然不是同一个应用程序。

【讨论】:

  • 感谢您的回答。如前所述,我使用 ContentProvider 进行查询。我已经检查了 2 个链接: 第一个链接:我已经使用 IM.protocol,其余的 sinfo 没有用。第二个链接:解决方案不起作用。尽管 packageName 是“com.skype.raider”,但源代码包含在“com.skype4life”包中,所以这没关系。也许我尝试做的事情是不可能的,因为“com.skype.raider.permission.ACCOUNT”缺少权限..
  • 这些 mime 类型实际上是 ContactsDataKindUri.parse("skype:" + phoneNumber + "?call") 应该仍然有效;除了Skype URIs,好像也没什么可访问的了。
  • 我试过 ContactsDataKind。 Uri.parse("skype:" + phoneNumber + "?call") 但它确实触发了“常规手机通话”,而不是“互联网/VOIP 电话”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
相关资源
最近更新 更多