2012-10-06 14 views
19

Pracuję program SMS i chcę uzyskać rozmowy.
napisałem poniższy kod i działa dobrze, ale zastanawiam się, czy to może być bardziej wydajnyAndroid zaczyna rozmowę sms z nazwą lub adresem

to dla czuło rozmowę podaje

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

dla adresów coraz według wątku konwersacji

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

i wreszcie sprawdzenie adresów (jeśli są w liście kontaktów) i dodanie do listy

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

    }  

Czy istnieje sposób na uproszczenie tego procesu?

+0

Czy można uzyskać rozmowę między dwoma użytkownikami (ja i ​​którzy wyślą do mnie wiadomość) z Conversations = "content: // sms/conversations". Jeśli tak to jak ? – Developer

+7

To nie powinno być zamknięte. Użytkownik wyraźnie żąda skutecznego sposobu na uzyskanie wątków wiadomości zgodnie z numerem kontaktowym lub nazwą, tak jak robi to aplikacja natywnej wiadomości. Chciałbym również otrzymać odpowiedź na to pytanie: –

+6

Zgadzam się, nie powinno to być zamknięte. Mam nadzieję, że ktoś może przynajmniej odpowiedzieć w formie komentarza ... – Pkmmte

Odpowiedz

1

Ponieważ jest to proste zapytanie SQLite, a dostawca Kontaktu może być dostępny w podobny sposób, powinieneś spróbować wykonać zadanie w SQL przez GROUPING poprzez numer, znacznik czasu i może thrad_id, a następnie dopasowując wyniki do zapytania do dostawcy kontaktu (również przez SQLite)

Dokumentacja zawiera całkiem dobry opis wszystkich dostępnych kolumn. https://developer.android.com/reference/android/provider/ContactsContract.PhoneLookupColumns.html

+0

Niestety, nie. Dostawcy treści nie ujawniają klauzul grupujących. O ile nie ma określonego URI dla tego dodatkowego celu, nie masz szczęścia; musisz iść długą trasą, czyli ... –

1

Od KitKat mamy specyficzne Uri do tego: content://mms-sms/messages/byphone. Ale przed tym, to co możemy wymyślić:

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; 

Nie ma łatwego sposobu, aby zrobić to samo z wiadomości MMS, ponieważ nie zachowują swój adres w bazie danych, trzeba zapytać siebie i każdy osobno. Jeśli chcesz zrobić to wielokrotnie, realnym rozwiązaniem jest buforowanie relacji między numerami MMS w bazie danych.

Następnie można użyć identyfikatorów zgromadzonych w conversationIds, aby przesłać zapytanie do poszczególnych rozmów. Pamiętaj, że jeśli chcesz scalić różne okładki należące do tego samego kontaktu, możesz ponownie użyć tego samego wzoru selekcji zapytań powyżej, przekazując jednocześnie wszystkie identyfikatory jako IN (?,...,?).