Android与名称或地址进行短信对话

我正在开发一个短信程序,我希望得到对话。
我写了下面的代码,它工作正常,但我想知道它是否可以更有效

这是用于创建会话线程

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(); } } 

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

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

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

从KitKat开始,我们有一个特定的Uri: content://mms-sms/messages/byphone 。 但在此之前,我们可以提出这个问题:

 Set conversationIds = new HashSet(); 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消息做同样的事情,因为他们没有在数据库中保留他们的地址,你必须分别查询每一个。 如果您需要反复进行,可行的解决方案是在您自己的数据库中缓存MMS到电话号码的关系。

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