MTK 聯絡歷史分析

2021-05-27 07:41:53 字數 2960 閱讀 4425

當聯絡歷史超過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方法會返回乙個聯絡歷史結構,在該結構中,包含號碼 姓名 ...