Как обновить sms-поток после вставки черновика в «content: // sms / draft»

Я использую следующий код для вставки черновика в контент: // 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 равно 0, если не было разговора с указанным выше адресом, иначе это идентификатор этого потока.

Когда я запускаю этот код, проект действительно сохраняется, но поток в нативном sms-клиенте (шток android 4.0.3) не обновляется как «черновик» [я могу видеть проект тела сообщения, но нет «Черновики», На нем. Мне нужно открыть-закрыть поток, чтобы пометить его как отмеченную. Я где-то читал, что есть проблема с тем, что поток не обновляется должным образом. Как я могу принудительно обновлять потоки, чтобы он отображался хорошо во всех клиентах?

РЕДАКТИРОВАТЬ:

Прочитав ваши ответы, я немного обновил свой код, но проблема остается. Я добавил снимок экрана ниже, так как, когда я написал свой вопрос, я торопился и не мог написать его достаточно ясно.

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

Занятая кошка http://oi46.tinypic.com/2mnkoqq.jpg Как вы можете видеть, нет метки «Черновик», рядом с черновиком, который я сделал с помощью приведенного выше кода.

Прошло некоторое время с тех пор, как я задал этот вопрос, но вот ответ:

Прежде всего, как указано выше, тот факт, что подсказка «Проект» не отображается в приложении для родных SMS, никому не нужно никого беспокоить. Ничто не может быть сделано по этому поводу, и именно так работает приложение для родных SMS. В частности, кеш инициализируется при запуске приложения, сохраняя идентификаторы потоков потоков, содержащих черновик. Червь кэша обновляется только из самого приложения, а не из фактического изменения в таблице sms

Для запасной части тяги здесь находится фрагмент кода, чтобы сохранить проект должным образом:

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

Примечание. Черновики сообщений могут содержать или не содержать адрес получателя сообщения. Черновики сохраняются в потоке (поток может содержать много получателей)

Хотя база данных sms вообще не документирована, вы можете захватить класс Telephony из AOSP и посмотреть, как добавлять / удалять сообщения и обрабатывать различные задачи о смс и мм. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/provider/Telephony.java

Я думаю, что ваш подход отличается от встроенного приложения обмена сообщениями.

Thread_id равно 0, если не было разговора с указанным выше адресом, иначе это идентификатор этого потока.

Насколько я знаю, даже черновик получил автогенератор thread_id . Если это не так, все черновики (с адресом получателя никогда не появлялись) будут группироваться в одном разговоре с thread_id = 0

Вот как встроенное приложение добавляет черновик.

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

Заключительное напоминание: это не public API для доступа к данным сообщений, поэтому я не предлагаю вам использовать. Но теперь это единственный способ.

Используйте метод, описанный в этом ответе , просто вставьте в content://sms/draft вместо content://sms/sent .

Спасибо большое, я попробовал save_draft() попробовать это и вставить в inbox/sent/draft т. Д. …

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

}