在 RawContacts 中找不到 Facebook 联系人
Posted
技术标签:
【中文标题】在 RawContacts 中找不到 Facebook 联系人【英文标题】:Cannot find Facebook contacts in RawContacts 【发布时间】:2011-08-27 15:41:27 【问题描述】:我正在尝试构建一个联系人管理应用程序。在我的手机上,我有来自几个帐户的联系人,包括 Facebook 和 HTC Facebook。由于某种原因,我无法从ContactsContract
的RawContacts
表中检索这些联系人:
managedQuery(ContactsContract.RawContacts.CONTENT_URI, new String[]
ContactsContract.RawContacts._ID,
ContactsContract.RawContacts.CONTACT_ID,
ContactsContract.RawContacts.ACCOUNT_NAME,
ContactsContract.RawContacts.ACCOUNT_TYPE,
, ContactsContract.RawContacts.ACCOUNT_TYPE + " = 'com.facebook.auth.login'", null, null)
此查询不返回任何结果。如果我用com.htc.socialnetwork.facebook
替换帐户类型,我仍然没有得到任何结果。我的手机上有很多 Facebook 联系人;如何找回它们?
【问题讨论】:
【参考方案1】:我想我在这里找到了答案:How to get a contact's facebook id or url from native contacts / content resolver?
似乎对 Facebook 联系人的访问受到限制。
【讨论】:
【参考方案2】:是的,Facebook 联系人是安全的,但可以通过一些偷偷摸摸的 SQLite 注入来劫持。不——我不会在这个页面上发帖,但你有什么理由不只是使用 Facebook 身份验证并以这种方式获取联系人吗?无论如何,Facebook 联系人实际上并没有任何有用的东西,而且它更安全,更有可能在所有情况下都能正常工作
【讨论】:
【参考方案3】:绝对没有办法以标准方式做到这一点。因此,我们必须使用 SQLi 注入(正如 roger 评论的那样)才能破解联系人数据库并获取 Facebook 头像。以下代码适用于大多数在 android 2.2 或更高版本上使用 Motoblur 的摩托罗拉:
public static Bitmap loadFacebookAvatar(Context context, long personId)
String[] rawProjection = ContactsContract.RawContacts._ID;
String contactIdAssertion = ContactsContract.RawContacts.CONTACT_ID + " = " + personId;
String rawWhere = new StringBuilder()
.append(contactIdAssertion).append(") UNION ALL SELECT ")
.append(ContactsContract.RawContacts._ID).append(" FROM view_raw_contacts WHERE (")
.append(contactIdAssertion).toString();
Cursor query = context.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI,
rawProjection,
rawWhere, null, null);
if (query != null && query.moveToFirst())
do
long id = query.getLong(query.getColumnIndex(ContactsContract.RawContacts._ID));
String[] projection = ContactsContract.CommonDataKinds.Photo.PHOTO;
Uri uri = ContactsContract.Data.CONTENT_URI;
String mimeTypeAssertion = ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'";
String photoAssertion = ContactsContract.CommonDataKinds.Photo.PHOTO + " IS NOT NULL";
String rawContactIdAssertion = ContactsContract.CommonDataKinds.Photo.RAW_CONTACT_ID + " = " + id;
String where = new StringBuilder().append(mimeTypeAssertion).append(" AND ")
.append(photoAssertion).append(" AND ").append(rawContactIdAssertion)
.append(") UNION ALL SELECT ").append(ContactsContract.CommonDataKinds.Photo.PHOTO)
.append(" FROM view_data WHERE (").append(photoAssertion).append(" AND ")
.append(rawContactIdAssertion).toString();
Cursor photoQuery = context.getContentResolver().query(uri, projection, where, null, null);
if (photoQuery != null && photoQuery.moveToFirst())
do
byte[] photoData = photoQuery.getBlob(photoQuery.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO));
if (photoData != null)
return BitmapFactory.decodeByteArray(photoData, 0, photoData.length, null);
while (photoQuery.moveToNext());
while (query.moveToNext());
return null;
对于其他手机,您必须获取联系人数据库并对其进行分析,以确定如何应用 SQL 注入,这需要有根手机。
【讨论】:
我从哪里得到 personId ?以上是关于在 RawContacts 中找不到 Facebook 联系人的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何在一个查询中列出属于特定 RawContacts 帐户的所有数据行
android中RawContacts.CONTENT_URI和ContactsContract.Contacts.CONTENT_URI的区别
通过从 RawContacts 过滤 account_type 列来显示联系人