摘要
我能够获得'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帐户,但这没有帮助。
感谢您的帮助。
如果查看您的链接,其中提到了这些com.skype4life。*,我还会看到以下内容:
sync_adapter_account_type:
= com.skype4life
sync_adapter_authority:
= com.android.contacts
所以他们将它们加在一起。也许我们应该以一种或另一种方式进行同步?
例如:
com.skype.android.skypecall.action
可能已更改,因为Skype for Life显然不是同一应用程序。