Eliminar SMS en Android 1.5
Hay muchas preguntas al respecto, no hay respuestas que funcionen en mi aplicación 🙁
Necesito quitar SMS de un receptor, incluso si el usuario puede verlo, pero debe ser quitado programaticamente.
- ¿Cómo evitar que los SMS entrantes lleguen a la bandeja de entrada?
- IPhone o Android que utilizan la autenticación basada en SMS?
- Desarrollo de la versión personalizada de la aplicación incorporada de SMS / MMS para Android
- Encontrar datamessage en el teléfono android antes de instalar la aplicación
- Administrador de sms de Android no envía sms
¿Cómo puedo hacerlo?
El más adecuado que he utilizado fue el siguiente, pero no funciona 🙁
context.getContentResolver().delete( deleteUri, "address=? and date=?", new String[] { msg.getOriginatingAddress(), String.valueOf(msg.getTimestampMillis()) });
- Recepción de SMS en Android Manifest.xml
- Escribir sms enviados al contenido: // sms / tabla enviada
- Obtener múltiples transmisiones de intenciones?
- ¿Por qué obtengo NullPointerException al enviar un SMS en un HTC Desire, o lo que es SubmitPdu?
- SmsManager.sendTextMessage no funciona
- Cómo abrir la ventana de SMS en android programatically?
- Registrar BroadcastReceiver para SMS entrantes
- Envío de SMS en Android
Después de refactorizar mi código encontré que la siguiente solución funciona:
private int deleteMessage(Context context, SmsMessage msg) { Uri deleteUri = Uri.parse("content://sms"); int count = 0; Cursor c = context.getContentResolver().query(deleteUri, null, null, null, null); while (c.moveToNext()) { try { // Delete the SMS String pid = c.getString(0); // Get id; String uri = "content://sms/" + pid; count = context.getContentResolver().delete(Uri.parse(uri), null, null); } catch (Exception e) { } } return count; }
Gracias a todos por su ayuda!
Ps si este código es útil para alguien – recuerda que catch (Exception) no es bueno.
Simplemente utilice este código simple en su receptor de difusión.
try { Uri uriSms = Uri.parse("content://sms/inbox"); Cursor c = context.getContentResolver().query( uriSms, new String[] { "_id", "thread_id", "address", "person", "date", "body" }, "read=0", null, null); if (c != null && c.moveToFirst()) { do { long id = c.getLong(0); long threadId = c.getLong(1); String address = c.getString(2); String body = c.getString(5); String date = c.getString(3); if (message.equals(body) && address.equals(number)) { // mLogger.logInfo("Deleting SMS with id: " + threadId); context.getContentResolver().delete( Uri.parse("content://sms/" + id), "date=?", new String[] { <your date>}); Log.e("log>>>", "Delete success........."); } } while (c.moveToNext()); } } catch (Exception e) { Log.e("log>>>", e.toString()); }
¿Cuál es el valor de deleteUri
?
¿Está seguro de que el SMS se ha escrito en el almacenamiento local antes de intentar eliminarlo? Si está manejando la transmisión SMS_RECEIVED
, no está garantizado que el SMS haya sido procesado por la aplicación nativa de SMS …
También, notaría que la API del proveedor de contenido de SMS no está públicamente documentada por Android y podría estar sujeta a cambios en el futuro. Pero si sólo apunta a Android 1.5 (o dispositivos actuales), puede que esté bien.
Este enlace puede ser útil
http://blog.chinaunix.net/u/9577/showart_1850111.html
No lo he implementado completamente pero lo que he implementado funciona
Tenga en cuenta que no está totalmente documentado y es probable que cambie en futuras versiones de Android
EDITAR:
Aquí está la forma en que implementé el código yo mismo:
String url = "content://sms/"; Uri uri = Uri.parse(url); getContentResolver().registerContentObserver(uri, true, new MyContentObserver(handler)); Uri uriSms = Uri.parse("content://sms/inbox"); Cursor c = getContentResolver().query(uriSms, null,null,null,null); Log.d("COUNT", "Inbox count : " + c.getCount()); } class MyContentObserver extends ContentObserver { public MyContentObserver(Handler handler) { super(handler); } @Override public boolean deliverSelfNotifications() { return false; } @Override public void onChange(boolean arg0) { super.onChange(arg0); Log.v("SMS", "Notification on SMS observer"); Message msg = new Message(); msg.obj = "xxxxxxxxxx"; handler.sendMessage(msg); Uri uriSMSURI = Uri.parse("content://sms/"); Cursor cur = getContentResolver().query(uriSMSURI, null, null, null, null); cur.moveToNext(); String protocol = cur.getString(cur.getColumnIndex("protocol")); if(protocol == null){ Log.d("SMS", "SMS SEND"); int threadId = cur.getInt(cur.getColumnIndex("thread_id")); Log.d("SMS", "SMS SEND ID = " + threadId); getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadId), null, null); } else{ Log.d("SMS", "SMS RECIEVE"); int threadIdIn = cur.getInt(cur.getColumnIndex("thread_id")); getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null); } } }
El código escucha los cambios en el proveedor de contenido de SMS.
Esta es la línea que le interesaría si desea eliminar un SMS
getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null);
Usted tiene que suprimir una conversación entera para suprimir el SMS, no he podido apenas suprimir el último mensaje de una conversación
Usar esto y ser chicos felices
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.telephony.SmsMessage; import android.widget.Toast; import android.net.Uri; public class SmsReceiver extends BroadcastReceiver { private Handler mHandler = new Handler(); private SmsMessage[] msgs; private Context con; @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); msgs = null; String str = ""; if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); msgs = new SmsMessage[pdus.length]; for (int i=0; i<msgs.length; i++) { msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); str += "SMS from " + msgs[i].getOriginatingAddress(); str += ":"; str += msgs[i].getMessageBody().toString(); str += "\n"; } con = context; mHandler.postDelayed(new Runnable() { @Override public void run() { deleteSMS(); } }, 5000); Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); } } private void deleteSMS() { try { for (int i=0; i<msgs.length; i++) { con.getContentResolver().delete(Uri.parse("content://sms"), "address=? and date=?", new String[] {msgs[i].getOriginatingAddress(), String.valueOf(msgs[i].getTimestampMillis())}); } } catch (Exception ex) { Toast.makeText(con, "Error: " + ex, Toast.LENGTH_SHORT).show(); } } }
- Detectar cuando la aplicación está cerrada
- Android ViewHolder parámetro de RecyclerView # onCreateViewHolder differents