Android SMS 按收件人 ID 显示联系人姓名

Posted

技术标签:

【中文标题】Android SMS 按收件人 ID 显示联系人姓名【英文标题】:Android SMS show contact name by recipient_ids 【发布时间】:2014-03-02 19:06:23 【问题描述】:

下面的代码sn-p返回基本的短信对话数据:

Cursor cursor = activity.getContentResolver().query(Uri.parse( "content://mms-sms/conversations?simple=true"), null, null, null, "normalized_date desc" );
if(cursor.moveToFirst())
  String recipient_ids = cursor.getString(3);

我的问题是,给定收件人 ID,我如何获取手机的联系人数据?在这种情况下,我需要检索联系人号码和联系人 display_name。

非常感谢您的帮助。提前致谢!

【问题讨论】:

这似乎在装有 android 4.3 的 Galaxy Note 2 上崩溃。错误是 Caused by: android.database.sqlite.SQLiteException: no such column: normalized_date (code 1): , while compiling: SELECT * FROM threads ORDER BY normalized_date desc 。如何确定 normalized_date 列是否不存在?我已经在其他版本的 android 上测试过这个没有问题。 【参考方案1】:

试试这个:

public String getContactData(String id)
  String number;

  Cursor phones = fa.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id, null, null); 
    if(phones.moveToFirst())  
      number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));       
     

  phones.close();
  return number;

希望对你有帮助!

【讨论】:

【参考方案2】:

这就是我的应用程序的工作原理:

private String getContactNumber(final long recipientId) 
    String number = null;
    Cursor c = getContentResolver().query(ContentUris
            .withAppendedId(Uri.parse("content://mms-sms/canonical-address"), recipientId),
            null, null, null, null);
    if (c.moveToFirst()) 
        number = c.getString(0);
    
    c.close();
    return number;

联系人号码保存在一个名为canonical-address的表中。 几年前它有点马车。联系人的更新未通过此表正确传播。但我认为现在很好。

您基本上需要将(列表)id 解析为单个 id。然后查询数据库中的每一个。 不过,您可以对所有 ID 一起使用一个查询。

【讨论】:

感谢您的回答,但它给了我这个错误java.lang.IllegalStateException: Unrecognized URI:content://mms-sms/canonical-address 请尝试使用附加 / 的 uri。它在我的应用程序中运行了 5 年。 ;-) 尝试用 "_id="+recipientId 的选择替换 contenturi 的东西 在某些手机中出现此异常致命异常:android.database.sqlite.SQLiteException 没有这样的列:data1(代码 1):,编译时:SELECT data1 FROM canonical_addresses WHERE _id=1127跨度>

以上是关于Android SMS 按收件人 ID 显示联系人姓名的主要内容,如果未能解决你的问题,请参考以下文章

Android 从收件箱获取短信,优化的方式来阅读所有消息并将它们分组

Android 上的 0 类 SMS(闪存 SMS)

获取不在联系人列表中的短信发件人姓名?

如何解码(非标准)字母数字SMS发件人ID

Android,在服务当前不可用时使用 Telephony.SMS_RECEIVED 操作接收广播

使用 SMS Retriever API Android 的 OTP/SMS 自动获取问题