19

我正在开发一个 SMS 程序,我想进行对话。
我写了下面的代码,它工作正常,但我想知道它是否可以更有效

这是为了获取对话线程

       Uri SMS_INBOX = Uri.parse("content://sms/conversations/");
    Cursor c = getContentResolver().query(SMS_INBOX, null, null, null, "date desc");

        startManagingCursor(c);
        String[] count = new String[c.getCount()];
        String[] snippet = new String[c.getCount()];
        String[] thread_id = new String[c.getCount()];

        c.moveToFirst(); 
        for (int i = 0; i < c.getCount(); i++) {
            count[i] = c.getString(c.getColumnIndexOrThrow("msg_count"))
                    .toString();
            thread_id[i] = c.getString(c.getColumnIndexOrThrow("thread_id"))
                    .toString();
            snippet[i] = c.getString(c.getColumnIndexOrThrow("snippet"))
                    .toString();
            //Toast.makeText(getApplicationContext(), count[i] + " - " + thread_id[i]+" - "+snippet[i] , Toast.LENGTH_LONG).show();
            c.moveToNext();
        }
        c.close();

根据对话线程获取地址

    for(int ad = 0; ad < thread_id.length ; ad++)
    {
    Uri uri = Uri.parse("content://sms/inbox");
    String where = "thread_id="+thread_id[ad]; 
    Cursor mycursor= getContentResolver().query(uri, null, where ,null,null); 
    startManagingCursor(mycursor);

    String[] number = new String[mycursor.getCount()];


    if(mycursor.moveToFirst()){
            for(int i=0;i<mycursor.getCount();i++){
                    number[i]=mycursor.getString(mycursor.getColumnIndexOrThrow("address")).toString();

                    mycursor.moveToNext();
            }
    }
    mycursor.close();

最后检查地址(如果在联系人列表中)并添加到列表中

     for(int i =0 ; i < numaralar.length ;i++)
    {


    String a = numaralar[i].substring(0,1);



    if(!a.equals("+")){ kisiismi = numaralar[i]; }


    ContentResolver localContentResolver = getApplicationContext().getContentResolver();
       Cursor contactLookupCursor =  
        localContentResolver.query(
                 Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, 
                 Uri.encode(numaralar[i])), 
                 new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup._ID}, 
                 null, 
                 null, 
                 null);
        try {
        while(contactLookupCursor.moveToNext()){
             String contactName = contactLookupCursor.getString(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup.DISPLAY_NAME));
             kisiismi = contactName;
         }
        }catch (Exception e) {
         kisiismi = numaralar[i].toString(); 

        }
          finally {
              //Toast.makeText(getApplicationContext(), ad + kisiismi + " " + count[ad], Toast.LENGTH_LONG).show();
              myArr.add(kisiismi);
              contactLookupCursor.close();
         }

    }    

有没有办法让这个过程更容易?

4

2 回答 2

1

由于它是一个简单的 SQLite 查询,并且可以以类似的方式访问联系人提供程序,因此您应该尝试通过 GROUPING 通过数字、时间戳和可能的 thrad_id 在 SQL 中完成工作,然后将结果与对联系人提供程序的查询进行匹配(也通过 SQLite)

该文档对所有可用列进行了很好的描述。 https://developer.android.com/reference/android/provider/ContactsContract.PhoneLookupColumns.html

于 2014-05-23T13:58:49.947 回答
1

从 KitKat 开始,我们为此提供了一个特定的 Uri content://mms-sms/messages/byphone:. 但在此之前,这是我们可以想出的:

Set<Integer> conversationIds = new HashSet<Integer>();
String numbers = "+xxxxxxxxxx,+yyyyyyyyyy";

final String[] PROJECTION = { Sms._ID, Sms.THREAD_ID };
final String SELECTION = Sms.ADDRESS + " IN (" + numbers.replaceAll("[^,]+", "?") + ")";
final String[] selectionArgs = numbers.split(",");

Cursor cursor = context.getContentResolver().query(Sms.CONTENT_URI, PROJECTION, SELECTION, selectionArgs, null);
int threadColumn = cursor.getColumnIndexOrThrow(Sms.THREAD_ID);

while (cursor.moveToNext())
  conversationIds.add(cursor.getInt(threadColumn));
cursor.close();

return conversationIds;

没有简单的方法可以对 MMS 消息执行相同的操作,因为它们不会将其地址保存在数据库中,您必须分别查询每一条消息。如果您需要重复执行此操作,一个可行的解决方案是将彩信与电话号码的关系缓存在您自己的数据库中。

然后,您可以使用累积的标识符conversationIds来查询各个对话。请注意,如果您想合并属于同一联系人的不同覆盖,您可以重用上述相同的查询选择模式,同时传入所有 id IN (?,...,?)

于 2015-01-12T17:07:59.707 回答