2012-10-06 3 views
19

Ich entwickle ein SMS-Programm und ich möchte Gespräche zu bekommen.
ich den Code unten geschrieben und es funktioniert gut, aber ich frage mich, ob esAndroid bekommen SMS-Konversation mit Name oder Adresse

Dieses Gespräch für geting fädelt

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

für immer Adressen nach Konversations-Thread

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(); 
effizienter sein könnte

und schließlich die Adressen überprüfen (wenn in Kontaktliste) und zu einer Liste hinzufügen

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

    }  

Gibt es eine Möglichkeit, diesen Prozess zu vereinfachen?

+0

Ist es möglich, die Konversation zwischen den beiden Benutzer (mich und wer sendet mir msg) von Conversations = "content: // sms/conversations". Wenn das so ist, wie ? – Developer

+7

Dies sollte nicht geschlossen sein. Der Benutzer bittet eindeutig um eine effiziente Möglichkeit, die Threads von Nachrichten entsprechend der Kontaktnummer oder dem Namen zu erhalten, genau wie die native Nachrichtenanwendung. Ich möchte auch eine Antwort dafür –

+6

Ich stimme zu, das sollte nicht geschlossen worden sein. Hoffentlich kann jemand zumindest in Form eines Kommentars antworten ... – Pkmmte

Antwort

1

Da es sich um eine einfache SQLite-Abfrage handelt und auf den Kontaktprovider in ähnlicher Weise zugegriffen werden kann, sollten Sie versuchen, die Arbeit in SQL durch GROUPING über number, timestamp und vielleicht thrad_id zu erledigen und dann die Ergebnisse mit einer Abfrage abzugleichen Zum Kontaktanbieter (auch über SQLite)

Die Dokumentation enthält eine ziemlich gute Beschreibung aller verfügbaren Spalten.

+0

Leider nicht. Inhaltsanbieter legen keine Gruppierungsklauseln offen. Wenn es keinen speziellen URI für diesen zusätzlichen Zweck gibt, haben Sie kein Glück; Sie müssen den langen Weg gehen, das ist ... –

1

Ab KitKat haben wir einen spezifischen Uri dafür: Aber vorher, ist das, was wir mit oben kommen kann:

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; 

Es gibt keine einfache Möglichkeit, das gleiche mit MMS-Nachrichten zu tun, weil sie nicht halten ihre Adresse in der Datenbank, müssen Sie abfragen, jedes jeder einzeln. Wenn Sie es wiederholt tun müssen, ist eine praktikable Lösung, MMS-zu-Telefonnummer-Beziehungen in einer eigenen Datenbank zu cachen.

Sie können dann die in conversationIds gesammelten Kennungen verwenden, um die einzelnen Konversationen abzufragen. Beachten Sie, dass Sie, wenn Sie verschiedene Coverages zusammenführen möchten, die zu demselben Kontakt gehören, dasselbe Abfrageauswahlmuster wie oben verwenden und alle IDs gleichzeitig als IN (?,...,?) übergeben können.