texto studio programar programacion por para mensajes mensaje mandar for enviar como codigo aplicación android sms inbox

android - studio - programar mensajes whatsapp iphone



¿Cómo puedo leer los mensajes SMS del dispositivo mediante programación en Android? (8)

¿Quiero recuperar los mensajes SMS del dispositivo y mostrarlos?


Desde la API 19 en adelante, puede hacer uso de la Clase de Telefonía para eso; Dado que los valores almacenados no recuperarán los mensajes en todos los dispositivos, ya que 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(); } }


Es un proceso trivial. Puedes 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<columns.length; i++) { // Log.v("columns " + i + ": " + columns[i] + ": " + cursor.getString(i)); // } long messageId = cursor.getLong(0); long threadId = cursor.getLong(1); String address = cursor.getString(2); long contactId = cursor.getLong(3); String contactId_string = String.valueOf(contactId); long timestamp = cursor.getLong(4); String body = cursor.getString(5); if (!unreadOnly) { count = 0; } SmsMmsMessage smsMessage = new SmsMmsMessage(context, address, contactId_string, body, timestamp, threadId, count, messageId, SmsMmsMessage.MESSAGE_TYPE_SMS); return smsMessage; } } finally { cursor.close(); } } return null; }


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 biblioteca: https://github.com/EverythingMe/easy-content-providers

  • Obtener todos los SMS :

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

    Cada SMS tiene todos los campos, por lo que puede obtener cualquier información que necesite:
    dirección, cuerpo, fecha de recepción, tipo (INBOX, SENT, DRAFT, ..), threadId, ...

  • Gel todo MMS :

    List<Mms> mmses = telephonyProvider.getMms(Filter.ALL).getList();

  • Gel de todos los Thread :

    List<Thread> threads = telephonyProvider.getThreads().getList();

  • Gel de toda la Conversation :

    List<Conversation> conversations = telephonyProvider.getConversations().getList();

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

De hecho, hay 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-providers

Espero que también ayudó :)


Hay muchas respuestas ya disponibles, pero creo que todas faltan 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 los mensajes SMS del dispositivo mediante programación en Android?

Por lo tanto, en la tabla de SMS de Android es como lucir así

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

id, dirección y cuerpo

En caso de leer SMS:

1. Solicitar 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

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

2.Ahora tu código va así

// 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 de ayuda. Gracias.


Use Content Resolver ( "content: // 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<cursor.getColumnCount();idx++) { msgData += " " + cursor.getColumnName(idx) + ":" + cursor.getString(idx); } // use msgData } while (cursor.moveToNext()); } else { // empty box, no SMS }

Por favor agregue el permiso READ_SMS .

Espero que ayude :)


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

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

Paso 2: a continuación, agregue servicio de clase de receptor de SMS para recibir SMS

<receiver android:name="com.aquadeals.seller.services.SmsReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>

Paso 3: Agregar permiso de tiempo de ejecución

private boolean checkAndRequestPermissions() { int sms = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS); if (sms != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, 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<pdus.length;i++) { SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]); String sender = smsMessage.getDisplayOriginatingAddress(); String phoneNumber = smsMessage.getDisplayOriginatingAddress(); String senderNum = phoneNumber ; String messageBody = smsMessage.getMessageBody(); try { if(messageBody!=null){ Matcher m = p.matcher(messageBody); if(m.find()) { mListener.messageReceived(m.group(0)); } else {}} } catch(Exception e){} } } public static void bindListener(SmsListener listener) { mListener = listener; }}


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

cambiado por:

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


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<Sms> lst = getAllSms(); } }else { List<Sms> lst = getAllSms(); }

Establecer la aplicación como 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<Sms> lst = getAllSms(); } } } } }

Función para obtener SMS

public List<Sms> getAllSms() { List<Sms> lstSms = new ArrayList<Sms>(); 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 de 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

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