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.

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.

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; } 

}

  • El envío de SMS mediante Intent no incluye destinatarios en algunos dispositivos
  • Cómo obtener todos los mensajes de ThreadID en android
  • Enviar SMS a través de PhoneGap en Android
  • Android enviar SMS que es visible en el hilo de SMS (sin GUI)
  • Utilizar autocompletar texto con número de teléfono de contactos
  • Android: Unicode / Charset problemas al enviar un SMS (sendTextMessage)
  • Programáticamente eliminar SMS no funciona
  • ¿Cómo puedo ordenar SMS y MMS juntos?
  • Enviar y recibir SMS dentro de mi propia aplicación, no en la aplicación nativa de mensajes en android usando la API nativa de SMS
  • Android SmsProvider, ¿qué significa ICC?
  • ¿Cuál es la longitud máxima de sms concatenados en smpp?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.