Cómo obtener lista de sms como convesations en cada dispositivo Android 2.2+

Necesito conseguir la lista de mensajes de texto y exhibirlos como en la aplicación común o Go sms pro. Estoy usando código siguiente:

uriSms = Uri.parse("content://mms-sms/conversations"); Cursor cursor = getContentResolver().query(uriSms, new String[] {"*"}, null, null, "date DESC"); cursor.moveToFirst(); do{ try{ String address = cursor.getString(32); if(address == null){ address = ""; //phone number }else{ address = getContactName(address); } String body = cursor.getString(2); System.out.println("======> Mobile number => "+address); System.out.println("=====> SMS Text => "+body); }catch (Exception e) { e.printStackTrace(); } }while(cursor.moveToNext()); 

Funciona en mi pestaña galaxia (android 2.2) pero en mi aplicación s3 (ICS) se bloquea al inicio. No quiero analizar mms así que intenté usar

 uriSms = Uri.parse("content://sms/conversations"); 

Pero no funcionó en ambos dispositivos. Busqué mucho en Google para encontrar una solución y no encontré nada. Sólo he descubierto que el acceso a las conversaciones sms depende de Android y el dispositivo. Mi propósito es hacer la aplicación que apoyan cada dispositivo androide 2.2+. En la aplicación de valores que utilizan Thread.CONTENT_URI para obtener lista de sms como conversaciones, por ejemplo.

 Threads.CONTENT_URI.buildUpon().appendQueryParameter("simple", "true").build(); 

Pero la clase Thread no se proporciona con el código fuente y no puedo encontrarlo en Internet. ¿Qué puedo hacer para que mi aplicación se ejecute en todos los dispositivos Android (2.2+) como Handcent Sms o GO sms pro.

Su código se está bloqueando porque está suponiendo que la tabla consultada contiene una columna denominada address , en la que no todas las versiones de android almacenan la dirección en la conversación. Para comprobar la estructura de la tabla puede mostrar sus nombres de columna y contenido a través del siguiente código:

 ArrayList<String> conversation = new ArrayList<>(); Uri uri = Uri.parse( "content://sms/conversations/" ); Cursor cursor = getContentResolver().query( uri, null, null ,null, null ); startManagingCursor( cursor ); if( cursor.getCount() > 0 ) { String count = Integer.toString( cursor.getCount() ); while( cursor.moveToNext() ) { String result = ""; for( int i = 0; i < cursor.getColumnCount(); i++ ) { result = result + "\nindex " + i + "\n column is " + cursor.getColumnName( i ) + "\nvalue is " + cursor.getString( i ); } result = result + "\n new conversation"; conversation.add( result ); } } cursor.close(); 

Una posible solución es utilizar el thread_id como un parámetro para buscar la dirección de la siguiente manera:

 ArrayList<String> conversation = new ArrayList<>(); // We may use sms/sent or sms/inbox Uri uri = Uri.parse( "content://sms" ); Cursor cursor = getContentResolver().query( uri, null, "thread_id" + " = " + threadId ,null, null ); startManagingCursor( cursor ); if( cursor.getCount() > 0 ) { String count = Integer.toString( cursor.getCount() ); while( cursor.moveToNext() ){ String result = ""; for( int i = 0; i < cursor.getColumnCount(); i++ ) { result = result + "\nindex " + i + "\n column is " + cursor.getColumnName( i ) + "\nvalue is " + cursor.getString( i ); } result = result + "\n new conversation"; conversation.add( result ); } } cursor.close(); 
 final StringBuilder msgString = new StringBuilder(); // ************** SMS ********************* List<SMSData> smsList = new ArrayList<SMSData>(); Uri uri = Uri.parse("content://sms/"); Cursor c= getContentResolver().query(uri, null, null ,null,null); //startManagingCursor(c); // Read the sms data and store it in the list if(c.moveToFirst()) { for(int i=0; i < c.getCount(); i++) { SMSData sms = new SMSData(); sms.setBody(c.getString(c.getColumnIndexOrThrow("body")).toString()); sms.setDate(c.getString(c.getColumnIndexOrThrow("date")).toString()); sms.setNumber(c.getString(c.getColumnIndexOrThrow("address")).toString()); smsList.add(sms); String address = c.getString(c.getColumnIndexOrThrow("address")).toString(); String mbody = c.getString(c.getColumnIndexOrThrow("body")).toString(); String mdate = c.getString(c.getColumnIndexOrThrow("date")).toString(); Date dt = new Date(Long.valueOf(mdate)); msgString.append(address + "<-||->"); msgString.append(mbody + "<-||->"); msgString.append(dt + "<-||->"); msgString.append(mdate + "<--!-->"); c.moveToNext(); } } c.close(); 
  • ¿Cómo usar el proveedor de contenido de SMS? ¿Dónde están los documentos?
  • ¿Cómo funciona "deliveryIntent" en el marco de Android SMS?
  • Volver automáticamente a la anterior aplicación de SMS predeterminada
  • SMS BroadCast Receptor recibe muchas veces?
  • Puedo enviar "SMS recibido intención"?
  • ¿Cómo leer el contenido del mensaje de un mensaje nuevo en el próximo mensaje en android?
  • Android: cómo obtener el número de teléfono de un SMS entrante?
  • Configuración única de Android SMS
  • Leer y mostrar texto de mensaje entrante android
  • ¿Cómo obtener el informe de entrega para el mensaje de texto enviado?
  • Ir a SMS Pro sobreponiendo android.provider.Telephony.SMS_RECEIVED
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.