2012-10-11 29 views
3

我使用下面的代碼插入到草案內容://短信/草案如何插入草案後更新短信線程「的內容://短信/草案」

 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)中的線程沒有更新爲「draft」[我可以看到草稿消息體,但是有沒有「草稿」標籤。我必須打開關閉線程,以便標記爲標記]。我已經在某處看到線程沒有正確更新的問題。我如何強制更新線程以便在所有客戶端中都顯示正常?

編輯:

看了您的回答,我已經更新了我的代碼了一下,但問題仍然存在。我在下面添加了一個屏幕截圖,因爲當我寫下我的問題時,我很匆忙,無法清楚地寫下來。

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

a busy cat http://oi46.tinypic.com/2mnkoqq.jpg 正如你所看到的,有沒有「草稿」的標籤,旁邊是我通過代碼作出上述草案。

+0

在消息應用程序中,打開草稿並再次關閉它。看草稿標籤是否出現。這是因爲某些SQLite觸發器需要運行才能自動完成您沒有提供的值。 –

+0

正如我在我的問題中寫的,草稿標籤* does *在我打開關閉線程後出現。有什麼辦法通過我的應用程序觸發該觸發器? –

+1

如果你殺死消息應用程序並重新啓動它,它會正確顯示每一件事情。這將是一個消息應用程序的問題。所以,我不確定可以做些什麼。 –

回答

5

這已經有一段時間,因爲我做了這個問題,但這裏是答案:

首先,如前所述,「草稿」提示未出現在原生SMS應用程序中的事實不應該困擾任何人。沒有什麼可以做的,它只是原生短信應用程序的工作方式。特別是在應用程序啓動時初始化緩存,保存包含草稿的線程的線程ID。緩存草案只從應用程序本身,而不是從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數據庫不會在所有記錄,你可以抓住從AOSP的電話類,並看看如何添加/刪除郵件並處理有關短信和彩信的各種任務。 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/provider/Telephony.java

+0

謝謝。這是一個好的 – Jame

2

使用this answer中描述的方法,只需插入到content://sms/draft而不是content://sms/sent

+0

我試着根據這個答案更新我的代碼,但結果保持不變:/ 檢查編輯是否可以 –

3

我認爲你的方法不同於內置的消息應用程序。

如果上面的地址沒有任何對話,thread_id是0,否則它是該線程的ID。

據我所知即使草稿自動生成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訪問信息數據,所以我不建議你使用。但現在是唯一的方法。

+0

感謝您提出這個問題,因爲它讓我查找了一些關於api隱藏部分的內容。 Afaik如果你編寫thread_id = 0,它會生成一個唯一的thread_id,至少在我的代碼中它是。 我已更新我的問題了一些截圖和更新的代碼。尚無新的結果。 –

+2

實際的thread_Id是一個自動遞增整數,因此它不總是0.另外,當你以收件人地址作爲參數查詢'content:// mms-sms/ThreadId'時,或者已經存在的thread_Id(如果地址組合匹配'recipient_Ids' )或返回一個新的thread_Id。爲什麼這是必要的,因爲在短信表中,「地址」字段對於草稿是空的。 –

2

非常感謝我有嘗試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; 
} 

}