如何从电话簿中获取与 android 中特定联系人相关联的所有社交帐户?

Posted

技术标签:

【中文标题】如何从电话簿中获取与 android 中特定联系人相关联的所有社交帐户?【英文标题】:how to get all social accounts linked with the particular contact in android from phonebook? 【发布时间】:2018-03-01 01:36:04 【问题描述】:

我从电话簿中提取了所有设备联系人。现在我想从从电话簿中获取的特定联系人中获取关联的帐户(facebook、twitter、instagram、LinkedIn)url。我该怎么办?

这是获取联系人的代码。

public Cursor getContactsCursor(FragmentActivity activity) 
        Cursor cursor = null;
        try 
            String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + "= 0" + " OR " + ContactsContract.Contacts.IN_VISIBLE_GROUP + "= 1";
            String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
            ContentResolver cr = activity.getContentResolver();
            return cr.query(ContactsContract.Contacts.CONTENT_URI, null, selection, null, sortOrder);
         catch (Exception e) 
            AppLogger.e(Helper.class.getSimpleName(), e.getMessage());
            return cursor;
        
    

现在我不知道如何获取与特定联系人关联的帐户(如 facebook、linkedin 等)

有人可以指导我吗。

更新: 在下面的附加图像中,单击以红色突出显示的部分时,会在浏览器中打开链接的用户配置文件。因此,我愿意获取用于打开用户个人资料页面的字段。

提前致谢。

【问题讨论】:

您是在询问有关在这些服务上查找联系人的问题吗?那么,将电子邮件发送到 Twitter 以查看用户名是什么? 不,我正在从电话簿中获取联系人。现在我想要与这些联系人关联的帐户。例如(LinkedIn、Facebook、Instagram、Twitter)。 请准确解释linked accounts urls 的含义,您可以张贴您想从通讯录应用中查询的信息的屏幕截图吗? 是的,当然..我想要社交媒体的公开个人资料链接,如果有任何个人资料链接从联系人应用程序连接到该联系人(例如 LinkedIn、Facebook、Twitter、Instagram)。链接联系人意味着只有一个联系人,如果他/她的电话号码在此社交媒体中相同并且联系人与之同步,那么在联系人应用程序中,用户联系人将显示为链接联系人。 @marmor 嗨,我已经用我要查询的信息的屏幕截图更新了问题。 【参考方案1】:

您需要找出您感兴趣的所有帐户中的确切MIMETYPE,例如,Google+ 的MIMETYPE 是:vnd.android.cursor.item/vnd.googleplus.profile

您可以为某个联系人转储所有MIMETYPEs 并手动找出您需要的联系人:

// make sure you import Data from: ContactsContract.Data
String[] projection = new String[]  Data.MIMETYPE ;
String selection = Data.CONTACT_ID + " = '"+ contactId + "'";
Cursor cursor = getContentResolver().query(Data.CONTENT_URI, projection, selection, null, null);
DatabaseUtils.dumpCursor(cursor);
cursor.close();

一旦您有了所需的MIMETYPEs 的固定列表,您就可以在其中查询特定联系人的信息:

// Add more
String[] mimetypes = new String[]  
    "vnd.android.cursor.item/vnd.googleplus.profile",
    "vnd.android.cursor.item/vnd.com.whatsapp.profile" 
;

// Usually the interesting info is on the first few fields, modify this if needed
String[] projection = new String[]  Data.DATA1, Data.DATA2, Data.DATA3, Data.DATA4 ;
String selection = Data.CONTACT_ID + " = '"+ contactId + "' AND " + Data.MIMETYPE + " IN (?,?)";

Cursor cursor = getContentResolver().query(Data.CONTENT_URI, projection, selection, mimetypes, null);
DatabaseUtils.dumpCursor(cursor);
cursor.close();

更新:

对于linkedin,mimetype 确实是:vnd.android.cursor.item/vnd.com.linkedin.android.profile。 关于您关于没有个人资料网址的评论,在 Data1 中您应该有一些长 ID,例如 AC...UQ4(大约 40 个字符)。

那么你的网址是: https://www.linkedin.com/profile/view?id=<data1Id> 喜欢:https://www.linkedin.com/profile/view?id=AC...UQ4

【讨论】:

我使用此代码并获取所有linkedin 联系人信息,但此代码无法获取已连接的配置文件的 url。对于 mime 类型的 lonked 是:“vnd.android.cursor。 item/vnd.com.linkedin.android.profile”非常感谢您的回答。我得到了在红色框中突出显示的字段,但没有获取个人资料网址 你能告诉我关于 facebook、instagram 和 twitter 的 mime 类型吗?我对 facebook、instagram 和 twitter 也有相同的流程。所以你能帮我看看这 3 的 mime 类型是什么吗? ..如果你知道? 抱歉,我不知道,您必须转储这些联系人的数据并自己查看。顺便说一句,如果我没记错的话,不能保证您能够根据存储在 android 联系人中的联系人数据创建个人资料 url,如果 facebook 能够在设备上同步联系人,它会增加保护,不允许应用程序访问该数据,否则它根本不同步 ids/url。 是的,你是对的。Facebook 不允许用户将联系人同步到联系人应用程序中。所以我认为 instagram 也不允许用户同步联系人,因为 instagram 也是 Facebook 的。但是你对推特有什么想法吗? 如果你用谷歌搜索“android twitter mimetype”你会得到vnd.android.cursor.item/vnd.twitter.profile我不知道这是不是真的,但听起来很合理【参考方案2】:

获取第一个帐户信息。获取所有帐户

ArrayList<String> accountsInfo = new ArrayList<String>();
    AccountManager manager = AccountManager.get(this);
    Account[] accounts = manager.getAccounts();
    for (Account account : accounts) 
        String name = account.name;
        String type = account.type;
        int describeContents = account.describeContents();
        int hashCode = account.hashCode();

        accountsInfo.add("name = " + name +
                         "\ntype = " + type +
                         "\n");
    
    String[] result = new String[accountsInfo.size()];
    accountsInfo.toArray(result);

使用以下示例帐户类型。

    /**
     * com.facebook.auth.login /
     * com.linkedin.android
     * flipkart.com
     * com.facebook.messenger
     * com.twitter.android.auth.login
     * com.truecaller.account
     * net.one97.paytm
     * com.whatsapp
     * com.google
     */

    Cursor c = getContentResolver().query(
            ContactsContract.RawContacts.CONTENT_URI,
            new String[]ContactsContract.RawContacts.CONTACT_ID, ContactsContract.RawContacts.DISPLAY_NAME_PRIMARY,
            ContactsContract.RawContacts.ACCOUNT_TYPE + "= ?",
            new String[]"com.whatsapp",
            null);

    final ArrayList<String> myContacts = new ArrayList<String>();
    int contactNameColumn = c.getColumnIndex(ContactsContract.RawContacts.DISPLAY_NAME_PRIMARY);
    while (c.moveToNext()) 
        // You can also read RawContacts.CONTACT_ID to read the
        // ContactsContract.Contacts table or any of the other related ones.
        myContacts.add(c.getString(contactNameColumn));
    
    Log.d("contact size", String.valueOf(myContacts.size()));

【讨论】:

以上是关于如何从电话簿中获取与 android 中特定联系人相关联的所有社交帐户?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取特定组的电话号码

从android中的指定组获取联系人

使用 ContentProvider 从联系人获取电话号码 - Android

如何从 Android 设备中仅获取电话号码联系人

如何从 android 的电话簿中选择联系人号码到我的应用程序中?

从电话簿中获取联系人号码在android