Dunque, mi sembra di aver usato la classe che dici tu per fare la richiesta. Avevo seguito il tutorial che mi hai linkato infatti

Questa è la funzione (non prende parametri perchè è interna alla classe e sa già dove prendere il numero

)
public String generateContactNameFromPhoneNumber()
{
//--------------- Get contact name from phone number ----------------
String contactName;
// encode the phone number and build the filter URI
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode( this.senderPhoneNumber ));
// define the columns I want the query to return
String[] projection = new String[] { ContactsContract.PhoneLookup.DISPLAY_NAME };
Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
if (cursor.moveToFirst()) {
// Get values from contacts database:
contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
} else {
contactName = senderPhoneNumber; // Contact unknow, name is the phone number
}
return contactName;
}
EDIT:Credo che il problema dipendesse dal fatto che non avevo chiuso il cursor dentro la funzione che recupera il nome dal numero...possibile giusto?

Ora faccio un paio di test ma sembra funzionare...già che ci sono vi chiedo un paio di cose sull'ottimizzazione. All'avvio della app ci mette un paio di secondi a caricare tutti i messaggi, ho notato che anche la app di default ci mette circa un tempo simile (mi sembra anche plausibile se ci sono parecchi messaggi), volevo tuttavia sapere se secondo voi c'è un modo di ottimizzare il tutto.
In particolare:
1) All'apertura della app leggo tutti i msg, dopodichè per ognuno creo un oggetto msgItem inserendo numero, nome contatto, ora, ecc...
2) Cerco se nella mia lista di conversazioni se ce n'è una con un numero uguale e nel caso inserisco il messaggio (mantenendo ordinati i msg per data dentro l'oggetto Conversation). Se invece non c'è creo una nuova Conversation e aggiungo il messaggio.
3) Infine se nella lista di Conversation la conversazione c'era già, la elimino e la inserisco nuovamente (per mantenere oridnate le conversazioni per data senza dover fare spostamenti nell'arraylist), altrimenti la inserisco e basta
Struttura dati:
1) MessageItem --> oggetto che rappresenta un messaggio e che ha numero di tel, nome, data, ecc....
2) Conversation --> oggetto che rappresenta una conversazione. Ha una arraylist di MessageItem, un campo con il numero con cui quella conversazione sta avvenendo e un campo con la data dell'ultimo messaggio (queste ultime cose per snellire la ricerca quando inserisco una Conversation
3) Una arrayList di Conversation
Ora dovrò affrontare anche il problema che quando clicco su una conversazione devo aprirla, e qui non so come fare, ovvero dovendo aprire un'altra activity, le rifaccio leggere tutto il DB con solo il numero che mi interessa?? Perchè passargli i dati che ho non credo sia possibile giusto?
(chiedo scusa se siamo un attimo usciti dal problema descritto all'inizio ma già che l'argomento è la lettura di messaggi ne ho approfittato. Se non si può apro un altro thread

)