2011-02-15 13 views
17

¿Alguien puede ayudarme con esto?¿Cómo leer el contenido del mensaje de un nuevo mensaje en Android?

Quiero leer el cuerpo del mensaje de un nuevo SMS entrante en Android, programáticamente.

que hemos probado algo, pero que no devuelve ningún contenido:

Uri uri = Uri.parse("content://sms/inbox"); 
     ContextWrapper context = null;  
     Cursor c = context.getContentResolver().query(uri, null, null ,null,null);  
     String body = null; 
     String number=null; 
     if(c.moveToFirst()) {   
      body = c.getString(c.getColumnIndexOrThrow("body")).toString(); 
      number = c.getString(c.getColumnIndexOrThrow("address")).toString(); 
     } 
     c.close(); 

Es su cualquier error en mi código favor alguno me dan la respuesta por favor, porque estoy totalmente perdido un mes para que este

+0

Buen artículo aquí: http://mobdev.olin.edu/mobdevwiki/FrontPage/Tutorials/SMS%20Messaging –

+0

http://stackoverflow.com/questions/14097500/get-inbox-messages-from-android-device -to-show-in-custom-listview # Funciona para mí. Este tipo de perro aquí en StackOverflow – texeratx

Respuesta

21

He publicado algunos ejemplos de programas sobre esto en el sitio web de mi clase. Aquí está el ejemplo Read SMS Example Aquí hay un fragmento de código. Básicamente, puede registrar un receptor de difusión para escuchar SMS_Receive y verifique lo siguiente.

Intent intent = getIntent(); 
    Bundle bundle = intent.getBundleExtra("mySMS"); 

    if (bundle != null) { 
     Object[] pdus = (Object[])bundle.get("pdus"); 
     SmsMessage sms = SmsMessage.createFromPdu((byte[])pdus[0]); 
     Log.i("mobile.cs.fsu.edu", "smsActivity : SMS is <" + sms.getMessageBody() +">"); 

     //strip flag 
     String message = sms.getMessageBody(); 
     while (message.contains("FLAG")) 
      message = message.replace("FLAG", ""); 

     TextView tx = (TextView) findViewById(R.id.TextBox); 
     tx.setText(message);    
    } else 
     Log.i("mobile.cs.fsu.edu", "smsActivity : NULL SMS bundle"); 
+0

Funciona bien gracias Frank – Krishna

+1

Este código es muy simple y elegante. ¡Gracias! – Simon

+0

También hay un método estático 'getMessagesFromIntent (Intent)' que devuelve un 'SmsMessage'-array (desde API nivel 19), por lo que la lectura/fundición manual del byte-array" pdus "puede no ser necesaria si su nivel objetivo es lo suficientemente alto : https://developer.android.com/reference/android/provider/Telephony.Sms.Intents.html#getMessagesFromIntent(android.content.Intent) – Blacklight

4

A continuación se muestra el trozo de código que lee el mensaje entrante y mostrar en la vista de lista, don' se olvide de agregar el permiso en el archivo de manifiesto:

<uses-permission android:name="android.permission.READ_SMS"/> 

Aquí el código:

listitem=(ListView)findViewById(R.id.ListView); 

     Uri mSmsQueryUri = Uri.parse("content://sms/inbox"); 
     List<String> messages = new ArrayList<String>(); 

     Cursor cursor = null; 
     try { 
      cursor = getContentResolver().query(mSmsQueryUri, null, null, null, null); 
      if (cursor == null) { 
       Log.i(TAG, "cursor is null. uri: " + mSmsQueryUri); 

      } 
      for (boolean hasData = cursor.moveToFirst(); hasData; hasData = cursor.moveToNext()) { 
       final String body = cursor.getString(cursor.getColumnIndexOrThrow("body")); 
       messages.add(body); 
      } 
     } catch (Exception e) { 
      Log.e(TAG, e.getMessage()); 
     } finally { 
      cursor.close(); 
     } 

     listitem.setAdapter(new ArrayAdapter<String>(ReadMessage.this, android.R.layout.simple_list_item_1,messages)); 
+0

¿Hay alguna forma de obtener solo el mensaje de hoy en lugar de recibir todos los mensajes? –

0

Aquí, en este ejemplo, le demostraré cómo leer los recientes mensajes recibidos (entrantes) de la bandeja de entrada y mostrarlos en la vista de texto.

fstmsgBtn.setOnClickListener(new OnClickListener() 

    { public void onClick(View v) 
    { 
     Uri my_uri = Uri.parse("content://sms/inbox");   
     Cursor readFstSms =v.getContext().getContentResolver().query(my_uri, null, null ,null,null); 
     if(readFstSms.moveToFirst()) 
     { 
      String msg_body = c.getString(c.getColumnIndexOrThrow("body")).toString(); 
      //String sender_number = c.getString(c.getColumnIndexOrThrow("address")).toString(); 
      readtxt.setText(msg_body); 
     } 
     readFstSms.close(); 
    } 
    }); 
0
listitem=(ListView)findViewById(R.id.list_view); 

      Uri mSmsQueryUri = Uri.parse("content://sms/inbox"); 
      List<String> messages = new ArrayList<String>(); 

      Cursor cursor = null; 
      try { 
       cursor = getContentResolver().query(mSmsQueryUri, null, null, null, null); 
       if (cursor == null) { 
        // Log.i(TAG, "cursor is null. uri: " + mSmsQueryUri); 

       } 
       for (boolean hasData = cursor.moveToFirst(); hasData; hasData = cursor.moveToNext()) { 
        final String body = cursor.getString(cursor.getColumnIndexOrThrow("body")).toString(); 
        final String sender_no= cursor.getString(cursor.getColumnIndexOrThrow("address")).toString(); 
        final String date= cursor.getString(cursor.getColumnIndexOrThrow("date")); 
        final String type =cursor.getString(cursor.getColumnIndexOrThrow("type")); 


        messages.add(body); 
        messages.add(sender_no); 
        messages.add(date); 
        messages.add(type); 
       } 
      } catch (Exception e) { 
       //Log.e(TAG, e.getMessage()); 
      } finally { 
       cursor.close(); 
      } 

      listitem.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,messages)); 
    } 
} 
1

Una solución muy fácil sería utilizar esta biblioteca SMS Analizador:

https://github.com/adorsys/sms-parser-android

compile 'de.adorsys.android:smsparser:0.0.3' 

Su uso se pueden leer todo el mensaje, o partes específicas de la mensaje entrante. También puede establecer los números de teléfono de los que saldrá el mensaje.

Si necesita más información sobre cómo funciona o su uso, consulte el repositorio de github que enumeré arriba.

Cuestiones relacionadas