2012-10-06 4 views
19

Sto sviluppando un programma SMS e voglio ottenere conversazioni.
Ho scritto il codice qui sotto e funziona benissimo, ma mi chiedo se potrebbe essere più efficienteAndroid riceve una conversazione SMS con nome o indirizzo

Questo è per geting conversazione thread

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

per gli indirizzi che ottengono in base al thread di conversazione

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

e infine controllare gli indirizzi (se in elenco contatti) e aggiungendo a un elenco

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

    }  

C'è un modo per semplificare questo processo?

+0

E 'possibile ottenere la conversazione tra i due utenti (me e chi mi invia msg) da Conversations = "content: // sms/conversations". se é cosi, come ? – Developer

+7

Questo non dovrebbe essere stato chiuso. L'utente sta chiaramente chiedendo un modo efficiente per ottenere i thread dei messaggi in base al numero di contatto o al nome, proprio come fa l'applicazione di messaggi nativi. Vorrei anche una risposta per questo –

+6

Sono d'accordo, questo non avrebbe dovuto essere chiuso. Speriamo che qualcuno possa almeno rispondere sotto forma di commento ... – Pkmmte

risposta

1

Poiché si tratta di una query SQLite semplice e al provider di contatti è possibile accedere in modo simile, è necessario provare a eseguire il lavoro in SQL da GROUPING tramite numero, timestamp e magari thrad_id e quindi associando i risultati a una query al fornitore di contatti (anche tramite SQLite)

La documentazione contiene una descrizione abbastanza buona di tutte le colonne disponibili. https://developer.android.com/reference/android/provider/ContactsContract.PhoneLookupColumns.html

+0

Sfortunatamente no. I fornitori di contenuti non espongono le clausole di raggruppamento. A meno che non abbia un URI specifico per questo scopo extra, sei sfortunato; devi percorrere la lunga strada, cioè ... –

1

Da KitKat in poi, abbiamo un URI specifico per questo: content://mms-sms/messages/byphone. Ma prima di questo, questo è ciò che siamo in grado di venire con:

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; 

Non v'è alcun modo semplice per fare lo stesso con i messaggi MMS, perché non tengono il loro indirizzo nel database, è necessario interrogare tutti e ognuno separatamente. Se hai bisogno di farlo ripetutamente, una soluzione praticabile è quella di memorizzare nella cache le relazioni numeriche MMS-to-phone in un tuo database personale.

È quindi possibile utilizzare gli identificativi accumulati in conversationIds per interrogare le singole conversazioni. Si noti che se si desidera unire coperture diverse appartenenti allo stesso contatto, è possibile riutilizzare lo stesso modello di selezione della query sopra con passare tutti gli ID come IN (?,...,?) in una sola volta.