Android获取与名称或地址的短信交谈

我正在开发一个短信程序,我想谈谈。
我写了下面的代码,它工作正常,但我想知道它可以更有效率

这是为了创build对话线程

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

有什么办法可以让这个过程更简单吗?

Solutions Collecting From Web of "Android获取与名称或地址的短信交谈"

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

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

从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; 

有没有简单的方法来做同样的彩信,因为他们不保留在数据库中的地址,你必须分别查询每一个。 如果您需要重复执行此操作,可行的解决scheme是将MMS-to-phone号码关系caching在您自己的数据库中。

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