當聯絡歷史超過20個,且穿插撥打**本中的號碼時,聯絡歷史會出問題,表現為在聯絡歷史中的名字與其號碼不相符合,
結果是 在聯絡歷史中撥號時撥的是其它號碼,與名字不符。
經過反覆試驗,發現規律為:當聯絡歷史中的記錄超過10個時,
撥打第11個號碼,會自動將原來第1個記錄的號碼修改為第11個的號碼,
撥打第12個號碼,會自動將原來第2個記錄的號碼修改為第12個的號碼,
撥打第13個號碼,會自動將原來第3個記錄的號碼修改為第13個的號碼,
依此類推。
進入entryidlescreen()
進入後,呼叫:mmi_idle_set_handler
該函式呼叫setkeyhandler(chistgetcalllogbysendkey, key_send1, key_event_down);
chistgetcalllogbysendkey進入後,呼叫mmi_chist_pre_entry_all_call_list
該函式呼叫
*type = mmi_chist_action_log_type_all;
mmi_chist_add_action(3, (void*) type, (mmi_chist_action_func_ptr)mmi_chist_read_call_log, (mmi_chist_action_cbk_ptr) mmi_chist_pre_entry_all_call_list_cbk);
這裡牽涉到幾個函式:
1.mmi_chist_add_action
2.mmi_chist_read_call_log這個函式會呼叫
reqreaddialednum(); reqreadmissednum(); reqreadrecvdnum();
以reqreaddialednum為例,會發個訊息出去獲取已撥**記錄,訊息響應函式為rspreaddialednum
在這個函式中迴圈呼叫到
chistextractpscalllog(&chis_p->dialedcalls[chis_p->ndialedcalls], &rsp->list[index]);
chis_p->ndialedcalls++;
讀取出每乙個**記錄。
chistextractpscalllog這個函式將獲取到的**簿(rsp->list)的姓名和號碼轉成合適的編碼放到chis_p->dialedcalls這個全域性變數中。
3.mmi_chist_pre_entry_all_call_list_cbk這個函式會呼叫entrychistviewmixedcalllist,為最終的顯示介面函式。
顯示時會讀取chis_p這個全域性變數中的內容,show函式為showcategory184screen
以上為讀取和顯示聯絡歷史,下面是寫:
在有了乙個新的聯絡歷史,比如說呼出**結束通話後,會呼叫srv_ucm_log_call_history函式,
進入後,呼叫chistlogdialedcall
進入後,呼叫
mmi_chist_add_action(1, (void*) call_log, (mmi_chist_action_func_ptr) mmi_chist_write_dialed_call, (mmi_chist_action_cbk_ptr) mmi_chist_write_call_log_cbk);
其中mmi_chist_write_dialed_call呼叫reqwritecalllog(call, phb_lnd);
進入後,將call資訊以訊息形式傳送出去
設定mmi的訊息響應函式為rspwritenum,響應後,呼叫rspwritedialednum(info);
這個函式主要是進行一些mmi相關的處理,並沒有進行聯絡歷史儲存的工作。
———————————————————————————-
於是從另乙個方向進行查詢:
通過nvram找到phb_write_ln_to_nvram函式,是寫聯絡歷史到nvram的函式,這個函式被phb_write_ln_handler呼叫,
而phb_write_ln_handler函式被phb_main函式呼叫,phb_main函式中的**都是通過訊息響應的方式執行,
在**中不能找到phb_main被呼叫的地方,在lis檔案中查詢,找到
l4_create.obj(i.process_ilm) refers to phb_main.obj(i.phb_main) for phb_main
這一部分的處理被l4層封裝起來了,應該是l4層收到請求後,傳送訊息到phb。通過trace,在reqwritecalllog之後,mmi_chist_update_call_log_after_write之前,會呼叫到phb_write_ln_handler。
通過trace,在phb_write_ln_handler這個函式中,呼叫到函式phb_update_ln,進入後,呼叫到phb_ln_renew_entry1 和phb_ln_renew_entry2,
經過trace,發現,撥打聯絡歷史的前十位的號碼,會呼叫phb_ln_renew_entry1,撥打後10位的號碼,會呼叫phb_ln_renew_entry2。
phb_ln_renew_entry1和phb_ln_renew_entry2這兩個函式的入口為更新的聯絡歷史的index和內容,以及原來的聯絡歷史列表,是屬於收到訊息後的處理函式。
比較25平台和53平台的phb_update_ln函式,發現53平台的多了兩句這樣的語句:
kal_mem_cpy((kal_uint8*) record0->array[i].addr_bcd, (kal_uint8*) entry->addr_bcd, max_cc_addr_len);
kal_mem_cpy((kal_uint8*) record0->array[i - phb_max_ln_entries].addr_bcd, (kal_uint8*) entry->addr_bcd, max_cc_addr_len);
將其去掉後,問題解決。
分析聯絡歷史資料庫
列表內容 資料表字段分析 問題 calls表中記錄的是每一條聯絡歷史,但是當我通過手機刪除一條聯絡歷史,或者使用 刪除聯絡歷史發現 中的記錄並沒有被刪除掉,就是說 操作和手機操作是一樣的,而資料庫中內容沒有被刪掉,這個地方有點疑問。我想的是當我刪除掉一條聯絡歷史表中的內容應該會被刪除 糾結 關於聯絡...
oj 聯絡歷史
描述 使用3個佇列,分別保留手機上最近10個,0 未接來電 1 已接來電 2 已撥 輸入 全部聯絡歷史,每行一條記錄。每條記錄包含兩個數字,第乙個數代表記錄型別,第二個數代表手機號碼。輸出 分3列輸出未接來電 已接來電 已撥 列之間用空格分割,後接 在最先輸出,不足10條用0佔位。樣例輸入12 18...
Windows Mobile獲取聯絡歷史
在現有的.net compact framework中,無論是1.0 2.0還是3.5版本,都沒有直接獲取使用者聯絡歷史的介面,那麼,我們只能自己封裝底層api來實現了。改介面在phone.dll中,呼叫phonegetcalllogentry方法會返回乙個聯絡歷史結構,在該結構中,包含號碼 姓名 ...