2

我是Android开发的新手。我正在做一个简单的应用程序来阅读手机的短信。我知道内容提供者 content://sms 存在很多问题,但是... 编写自定义的对我来说太难了,所以我暂时使用它。

问题:当我查询 content://sms/inbox 时,我会收到所有消息,因此当我尝试在 ListActivity 中列出它们时,我会为他/她拥有的每条消息重复相同的联系人。基本上这是正确的,我理解,但我需要别的东西,一些“更专业”的东西。首先是因为: 1- 如此大的查询在手机上需要很长时间 2- 显然,以这种方式列出所有消息没有任何意义。

最简单的事情是使用 DISTINCT 或......如果不是,但非常糟糕,因为它再次查询所有消息,一个 GROUP BY。问题是:无法识别 GROUP BY,因为正确地,内容提供者背后的内容可能与数据库不同。显然 DISTINCT 被接受,但如果使用它并没有任何区别。在收到查询后,我已经吓坏了 3 天来找到解决方案而没有自己过滤消息。

这是我尝试进行查询的一小段简单的代码: List smsList = new ArrayList();

       Uri uri = Uri.parse("content://sms/inbox");
       String order = new String("date DESC");
       String[] projection = new String[]{"DISTINCT thread_id, address, body, _id"};
       String selection = new String("GROUP BY address"); //this doesn't work
       Cursor c = getContentResolver().query(uri, projection, null, null, order);

       // Read the sms data and store it in the list
       if(c.moveToFirst()) {
           for( i=0; i < c.getCount(); i++) {
               SMSData sms = new SMSData();
               sms.setBody(c.getString(c.getColumnIndexOrThrow("body")).toString());
               sms.setNumber(c.getString(c.getColumnIndexOrThrow("address")).toString());
               sms.setId(c.getString(c.getColumnIndexOrThrow("_id")).toString());
               sms.setPersonName(getContactNameFromNumber(sms.getNumber()));
               smsList.add(sms);
               //Log.v(TAG,"il nome è: "+smsList.get(i).getPersonName()+" e il numero è: "+smsList.get(i).getNumber());
               c.moveToNext();
           }
       }

       c.close();

我希望有一个人可以帮助我!提前致谢。

4

1 回答 1

0

您必须使用GROUP BY thread_id,在我的 github 存储库SmsMessenger中查看更多详细信息,您可以通过以下查询获取它:

    cursor = MyApplication.getContext().getContentResolver().query(Uri.parse("content://sms")
            , null
            , "address IS NOT NULL) GROUP BY (thread_id"
            , null
            , null);
于 2016-11-30T15:55:37.727 回答