Cómo actualizar el hilo de sms después de insertar un borrador en "content: // sms / draft"
Estoy usando el siguiente código para insertar un borrador en el contenido: // sms / draft
ContentValues values = new ContentValues(); values.put("address", receiver2); values.put("body", body2); values.put("date", String.valueOf(System.currentTimeMillis())); values.put("type", "3"); values.put("thread_id", thread_id); getContentResolver().insert(Uri.parse("content://sms/draft"), values);
thread_id es 0 si no hubo ninguna conversación con la dirección anterior, de lo contrario es el id de ese hilo.
- Prueba de unidad Android SMS Receiver
- Crear PDU para Android
- SMS recibidos en mi aplicación de SMS y en Hangouts, aunque llamo a abortBroadcast ()
- Cómo obtener la dirección de un proyecto de SMS
- SMS tipo de Android 0
Cuando ejecuto este código, el borrador es de hecho guardado, pero el hilo en el cliente sms nativo (android de stock 4.0.3) no se actualiza como "borrador" [Puedo ver el proyecto de cuerpo del mensaje, pero no hay "Borrador" etiqueta en él. Tengo que abrir-cerrar el hilo, para poder marcarlo como marcado]. He leído en alguna parte que hay un problema con el hilo que no se actualiza correctamente. ¿Cómo puedo forzar los subprocesos a ser actualizados por lo que muestra ok en todos los clientes?
EDITAR:
Después de leer sus respuestas, he actualizado mi código un poco, pero el problema sigue siendo. He añadido una captura de pantalla a continuación, ya que cuando escribí mi pregunta que tenía prisa y no podía escribir con claridad suficiente.
protected void save_draft(String[] recipients, String body) { Uri threadIdUri = Uri.parse("content://mms-sms/threadID"); Uri.Builder builder = threadIdUri.buildUpon(); for (String recipient : recipients) { builder.appendQueryParameter("recipient", recipient); } Uri uri = builder.build(); Long thread_id = get_thread_id(uri); Log.d("thread_id", thread_id + " "); ContentValues values = new ContentValues(); values.put("body", body); values.put("date", String.valueOf(System.currentTimeMillis())); values.put("type", 3); values.put("thread_id", thread_id); getContentResolver().insert(Uri.parse("content://sms/draft"), values); //^tried "content://sms/" as well, but got the same result } private Long get_thread_id(Uri uri) { long threadId = 0; Cursor cursor = getContentResolver().query(uri, new String[] { "_id" }, null, null, null); if (cursor != null) { try { if (cursor.moveToFirst()) { threadId = cursor.getLong(0); } } finally { cursor.close(); } } return threadId; }
un gato ocupado http://oi46.tinypic.com/2mnkoqq.jpg Como puede ver, no hay una etiqueta de "Borrador", junto al borrador que hice a través del código anterior.
- Bloquear SMS salientes
- Receptor de radiodifusión dentro de un servicio
- Abortar / Cancelar transmisiones
- Cómo abrir la ventana de SMS en android programatically?
- Permitir que el usuario que utiliza el navegador móvil para enviar el código de producto que quieren por SMS
- ¿Por qué obtengo NullPointerException al enviar un SMS en un HTC Desire, o lo que es SubmitPdu?
- Cómo consultar el MMS Iniciar sesión en Android
- Android: ¿Cómo registrar un observador de contenido sin actividad?
Ha pasado un tiempo desde que hice esta pregunta, pero aquí está la respuesta:
En primer lugar, como se ha dicho antes, el hecho de que la sugerencia de "borrador" no aparece en la aplicación nativa de SMS, no debe molestar a nadie. No se puede hacer nada al respecto, y es sólo la forma en que funciona la aplicación nativa de SMS. En particular, una caché se inicializa cuando se inicia la aplicación, guardando los identificadores de subproceso de los subprocesos que contienen un borrador. El caché de borrador se actualiza sólo desde la propia aplicación y no desde un cambio real en la tabla sms
Para la parte de proyecto de ahorro aquí es el pedazo de código para guardar un borrador correctamente:
public static final Uri CONTENT_URI = Uri.parse("content://sms/draft"); public static Uri addDraft(ContentResolver resolver, String address, String body, String subject, Long date, long threadId) { ContentValues values = new ContentValues(6); values.put(ADDRESS, address); if (date != null) { values.put(DATE, date); } values.put(READ, Integer.valueOf(1)); values.put(SUBJECT, subject); values.put(BODY, body); if (threadId != -1L) { values.put(THREAD_ID, threadId); } return resolver.insert(CONTENT_URI , values); }
Nota: Los mensajes de borrador pueden o no contener la dirección del destinatario del mensaje. Los borradores se guardan en el hilo (un hilo puede contener muchos destinatarios)
Aunque la base de datos sms no está documentada en absoluto, puede tomar la clase de telefonía de la AOSP y echar un vistazo a cómo agregar / quitar mensajes y manejar varias tareas acerca de sms y mms. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/provider/Telephony.java
Creo que su enfoque es diferente de la aplicación de mensajería incorporada.
thread_id es 0 si no hubo ninguna conversación con la dirección anterior, de lo contrario es el id de ese hilo.
Por lo que sé, incluso proyecto se generó automáticamente thread_id
. Si no es así, todo el borrador (si la dirección del receptor no apareció) se thread_id
en la misma conversación con thread_id
= 0
A continuación, se muestra cómo la aplicación incorporada agrega un borrador.
public static final Uri SmsCONTENT_URI = Uri.parse("content://sms"); ContentValues values = new ContentValues(3); values.put("thread_id", threadId); values.put("body", contents); // values.put("type", Sms.MESSAGE_TYPE_DRAFT); // type = 3 is draft. SqliteWrapper.insert(mActivity, mContentResolver, Sms.CONTENT_URI, values);
Recordatorio final: Esta no es public API
para acceder a los datos de los mensajes, así que no te sugiero que lo uses. Pero ahora es la única manera.
Utilice el método descrito en esta respuesta , simplemente inserte en el content://sms/draft
lugar del content://sms/sent
.
gracias mucho intento save_draft()
probar esto e insertar en la inbox/sent/draft
etc ….
public class AddData { Activity act; Context ctx,context; ContentResolver cr; public AddData(Activity act) { cr = act.getContentResolver(); this.act = act; } public void addsms(String address,String body,String date,String type,String read) { String[] addr = address.split(" "); String thread_id = save_draft(addr); ContentValues values = new ContentValues(); values.put("body", body); values.put("date", date); values.put("type", type); if(type.equals("3")) { values.put("thread_id", thread_id); }else { values.put("address", address); } Uri uri = cr.insert(Uri.parse("content://sms/"), values); cr.notifyChange(uri, null); } protected String save_draft(String[] recipients) { Uri threadIdUri = Uri.parse("content://mms-sms/threadID"); Uri.Builder builder = threadIdUri.buildUpon(); for (String recipient : recipients) { builder.appendQueryParameter("recipient", recipient); } Uri uri = builder.build(); String thread_id = get_thread_id(uri).toString(); Log.d("thread_id", thread_id + " "); //^tried "content://sms/" as well, but got the same result return thread_id; } private Long get_thread_id(Uri uri) { long threadId = 0; Cursor cursor = act.getContentResolver().query(uri, new String[] { "_id" }, null, null, null); if (cursor != null) { try { if (cursor.moveToFirst()) { threadId = cursor.getLong(0); } } finally { cursor.close(); } } return threadId; }
}