¿Cómo puedo leer mensajes SMS desde el dispositivo mediante progtwigción en Android?

Quiero recuperar los mensajes SMS del dispositivo y mostrarlos?

Use Content Resolver ( “contenido: // sms / inbox” ) para leer los SMS que están en la bandeja de entrada.

// public static final String INBOX = "content://sms/inbox"; // public static final String SENT = "content://sms/sent"; // public static final String DRAFT = "content://sms/draft"; Cursor cursor = getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, null); if (cursor.moveToFirst()) { // must check the result to prevent exception do { String msgData = ""; for(int idx=0;idx 

Por favor, agrega el permiso READ_SMS .

Espero que ayude 🙂

Es un proceso trivial. Puede ver un buen ejemplo en el código fuente SMSPopup

Examine los siguientes métodos:

 SmsMmsMessage getSmsDetails(Context context, long ignoreThreadId, boolean unreadOnly) long findMessageId(Context context, long threadId, long _timestamp, int messageType void setMessageRead(Context context, long messageId, int messageType) void deleteMessage(Context context, long messageId, long threadId, int messageType) 

este es el método para leer:

 SmsMmsMessage getSmsDetails(Context context, long ignoreThreadId, boolean unreadOnly) { String SMS_READ_COLUMN = "read"; String WHERE_CONDITION = unreadOnly ? SMS_READ_COLUMN + " = 0" : null; String SORT_ORDER = "date DESC"; int count = 0; // Log.v(WHERE_CONDITION); if (ignoreThreadId > 0) { // Log.v("Ignoring sms threadId = " + ignoreThreadId); WHERE_CONDITION += " AND thread_id != " + ignoreThreadId; } Cursor cursor = context.getContentResolver().query( SMS_INBOX_CONTENT_URI, new String[] { "_id", "thread_id", "address", "person", "date", "body" }, WHERE_CONDITION, null, SORT_ORDER); if (cursor != null) { try { count = cursor.getCount(); if (count > 0) { cursor.moveToFirst(); // String[] columns = cursor.getColumnNames(); // for (int i=0; i 
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { final String myPackageName = getPackageName(); if (!Telephony.Sms.getDefaultSmsPackage(this).equals(myPackageName)) { Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, myPackageName); startActivityForResult(intent, 1); }else { List lst = getAllSms(); } }else { List lst = getAllSms(); } 

Establecer la aplicación como la aplicación de SMS predeterminada

  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { if (resultCode == RESULT_OK) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { final String myPackageName = getPackageName(); if (Telephony.Sms.getDefaultSmsPackage(mActivity).equals(myPackageName)) { List lst = getAllSms(); } } } } } 

Función para recibir SMS

 public List getAllSms() { List lstSms = new ArrayList(); Sms objSms = new Sms(); Uri message = Uri.parse("content://sms/"); ContentResolver cr = mActivity.getContentResolver(); Cursor c = cr.query(message, null, null, null, null); mActivity.startManagingCursor(c); int totalSMS = c.getCount(); if (c.moveToFirst()) { for (int i = 0; i < totalSMS; i++) { objSms = new Sms(); objSms.setId(c.getString(c.getColumnIndexOrThrow("_id"))); objSms.setAddress(c.getString(c .getColumnIndexOrThrow("address"))); objSms.setMsg(c.getString(c.getColumnIndexOrThrow("body"))); objSms.setReadState(c.getString(c.getColumnIndex("read"))); objSms.setTime(c.getString(c.getColumnIndexOrThrow("date"))); if (c.getString(c.getColumnIndexOrThrow("type")).contains("1")) { objSms.setFolderName("inbox"); } else { objSms.setFolderName("sent"); } lstSms.add(objSms); c.moveToNext(); } } // else { // throw new RuntimeException("You have no SMS"); // } c.close(); return lstSms; } 

La clase Sms está abajo:

 public class Sms{ private String _id; private String _address; private String _msg; private String _readState; //"0" for have not read sms and "1" for have read sms private String _time; private String _folderName; public String getId(){ return _id; } public String getAddress(){ return _address; } public String getMsg(){ return _msg; } public String getReadState(){ return _readState; } public String getTime(){ return _time; } public String getFolderName(){ return _folderName; } public void setId(String id){ _id = id; } public void setAddress(String address){ _address = address; } public void setMsg(String msg){ _msg = msg; } public void setReadState(String readState){ _readState = readState; } public void setTime(String time){ _time = time; } public void setFolderName(String folderName){ _folderName = folderName; } } 

No olvides definir el permiso en tu AndroidManifest.xml

  

Esta publicación es un poco antigua, pero aquí hay otra solución fácil para obtener datos relacionados con el proveedor de contenido SMS en Android:

Utilice esta lib: https://github.com/EverythingMe/easy-content-providers

  • Obtener todos los SMS :

     TelephonyProvider telephonyProvider = new TelephonyProvider(context); List smses = telephonyProvider.getSms(Filter.ALL).getList(); 

    Cada Sms tiene todos los campos, para que pueda obtener la información que necesita:
    address, body, receivedDate, type (INBOX, SENT, DRAFT, ..), threadId, …

  • Gel todo MMS :

     List mmses = telephonyProvider.getMms(Filter.ALL).getList(); 
  • Gel todo el Thread :

     List threads = telephonyProvider.getThreads().getList(); 
  • Gel toda la Conversation :

     List conversations = telephonyProvider.getConversations().getList(); 

Funciona con List o Cursor y hay una aplicación de muestra para ver cómo se ve y funciona.

De hecho, existe un soporte para todos los proveedores de contenido de Android como: Contactos, Registros de llamadas, Calendario, … Documento completo con todas las opciones: https://github.com/EverythingMe/easy-content-providers/wiki/Android- proveedores

Espero que también haya ayudado 🙂

Desde la API 19 en adelante puede hacer uso de la clase de telefonía para eso; Dado que los valores hardcored no recuperarán mensajes en todos los dispositivos porque el proveedor de contenido Uri cambia de dispositivos y fabricantes.

 public void getAllSms(Context context) { ContentResolver cr = context.getContentResolver(); Cursor c = cr.query(Telephony.Sms.CONTENT_URI, null, null, null, null); int totalSMS = 0; if (c != null) { totalSMS = c.getCount(); if (c.moveToFirst()) { for (int j = 0; j < totalSMS; j++) { String smsDate = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.DATE)); String number = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.ADDRESS)); String body = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.BODY)); Date dateFormat= new Date(Long.valueOf(smsDate)); String type; switch (Integer.parseInt(c.getString(c.getColumnIndexOrThrow(Telephony.Sms.TYPE)))) { case Telephony.Sms.MESSAGE_TYPE_INBOX: type = "inbox"; break; case Telephony.Sms.MESSAGE_TYPE_SENT: type = "sent"; break; case Telephony.Sms.MESSAGE_TYPE_OUTBOX: type = "outbox"; break; default: break; } c.moveToNext(); } } c.close(); } else { Toast.makeText(this, "No message to show!", Toast.LENGTH_SHORT).show(); } } 

Paso 1: primero tenemos que agregar permisos en el archivo de manifiesto como

   

Paso 2: luego agrega la clase de receptor SMS de servicio para recibir sms

      

Paso 3: agrega permiso de tiempo de ejecución

  private boolean checkAndRequestPermissions() { int sms = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS); int loc = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); int loc2 = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION); List listPermissionsNeeded = new ArrayList<>(); if (sms != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(Manifest.permission.READ_SMS); } if (loc != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.ACCESS_FINE_LOCATION); } if (loc2 != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(Manifest.permission.ACCESS_COARSE_LOCATION); } if (!listPermissionsNeeded.isEmpty()) { ActivityCompat.requestPermissions(this,listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS); return false; } return true; } 

Paso 4: agregue estas clases en su aplicación y pruebe la clase de interfaz

 public interface SmsListener { public void messageReceived(String messageText); } 

SmsReceiver.java

 public class SmsReceiver extends BroadcastReceiver { private static SmsListener mListener; public Pattern p = Pattern.compile("(|^)\\d{6}"); @Override public void onReceive(Context context, Intent intent) { Bundle data = intent.getExtras(); Object[] pdus = (Object[]) data.get("pdus"); for(int i=0;i 

CÓDIGO FELIZ

Ya hay muchas respuestas disponibles, pero creo que a todas les falta una parte importante de esta pregunta. Antes de leer los datos de una base de datos interna o su tabla, debemos entender cómo se almacenan los datos en ella y luego podemos encontrar la solución a la pregunta anterior que es:

¿Cómo puedo leer mensajes SMS desde el dispositivo mediante progtwigción en Android?

Entonces, en la tabla de SMS de Android es como este

enter image description here

Sepa, podemos seleccionar lo que queramos de la base de datos. En nuestro caso solo hemos requerido

identificación, dirección y cuerpo

En caso de leer SMS:

1. Solicite permisos

 int REQUEST_PHONE_CALL = 1; if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_SMS}, REQUEST_PHONE_CALL); } 

o

   

2. Ahora tu código es como esto

 // Create Inbox box URI Uri inboxURI = Uri.parse("content://sms/inbox"); // List required columns String[] reqCols = new String[]{"_id", "address", "body"}; // Get Content Resolver object, which will deal with Content Provider ContentResolver cr = getContentResolver(); // Fetch Inbox SMS Message from Built-in Content Provider Cursor c = cr.query(inboxURI, reqCols, null, null, null); // Attached Cursor with adapter and display in listview adapter = new SimpleCursorAdapter(this, R.layout.a1_row, c, new String[]{"body", "address"}, new int[]{ R.id.A1_txt_Msg, R.id.A1_txt_Number}); lst.setAdapter(adapter); 

Espero que este sea útil. Gracias.

 String WHERE_CONDITION = unreadOnly ? SMS_READ_COLUMN + " = 0" : null; 

cambiado por:

 String WHERE_CONDITION = unreadOnly ? SMS_READ_COLUMN + " = 0 " : SMS_READ_COLUMN + " = 1 ";