如何从Android上的联系人数据库获取Skype ID(我的解决方案几乎可以)

问题描述 投票:0回答:2

摘要

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

1-从Skype apk收集信息

Skype应用程序(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"

注意:看来这些已在Augustus 2018左右添加(请参阅此处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

[<skype.user.name.value.here>是我想要的数据,所以很好!

重要注意事项:

lookup = 1450iSkype_288可以解析以获得288,它是其他一些联系人的RawcontactId!如果此rawContact具有contactId,则这使我可以找到原始联系人(相对于RawContact)它有时甚至会引用某些不是Google联系人的联系人,而是WhatsApp联系人!享受这一重要信息;-)

2.2-这些2 mimeTypes的相似数据:

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

所以我也可以获得<skype.user.name.value.here>。同样,这很好!

2.3-电话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进行电话呼叫,但这不是我想做的:我想通过“ Internet Skype音频/视频”通话,而不是“常规手机”通话。

4-问题

为什么Skype应用有时会存储所有4种“电话/消息/音频/视频” mimeTypes数据,有时只存储“电话” mimeType?

在后一种情况下,我无法获得Skype ID / Skype用户名,即上面提到的<skype.user.name.value.here>我了解我的解决方案是某种“类似逆向工程的方法”的结果,而根本不是“官方的”,但也许有人进行了与我相同的调查,并且可以找到解决方案?

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

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

感谢您的帮助。

android android-contentprovider skype
2个回答
0
投票
多么棒的研究!我来到这里是因为偶然发现了同样的问题。我也想获取Skype用户名,但通讯簿中仅包含哑剧类型“ vnd.android.cursor.item / com.skype4life.phone”。

如果查看您的链接,其中提到了这些com.skype4life。*,我还会看到以下内容:

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

所以他们将它们加在一起。也许我们应该以一种或另一种方式进行同步?

0
投票
您可能必须通过电话号码查询它们...

例如:

  • 字符串com.skype.android.skypecall.action可能已更改,因为Skype for Life显然不是同一应用程序。
  • © www.soinside.com 2019 - 2024. All rights reserved.