android 藍(lán)牙 pbap 獲取通話記錄以及通話日期時(shí)間

android 藍(lán)牙 pbap 獲取通話時(shí)間

之前,我們利用 pbap 協(xié)議獲取到了用戶的通訊錄。那自然而然產(chǎn)生了衍生需求:能否獲取通話記錄?包括打電話記錄(DIALED)、接電話記錄(RECEIVED)、未接電話記錄(MISSED)?
答案是肯定的。類比獲取通訊錄的方式,我們可以通過修改client.pullPhoneBook(BluetoothPbapClient.PB_PATH);中的PB_PATH參數(shù),來獲取其他的信息。比如:

    /**
     * Path to local incoming calls history object
     */
    public static final String ICH_PATH = "telecom/ich.vcf";

    /**
     * Path to local outgoing calls history object
     */
    public static final String OCH_PATH = "telecom/och.vcf";

    /**
     * Path to local missed calls history object
     */
    public static final String MCH_PATH = "telecom/mch.vcf";

    /**
     * Path to local combined calls history object
     */
    public static final String CCH_PATH = "telecom/cch.vcf";

    /**
     * Path to local main phone book object
     */
    public static final String PB_PATH = "telecom/pb.vcf";

但是,在替換PB_PATH為其他的各種 PATH 之后,我們發(fā)現(xiàn)獲取的信息不完全。我們從控制臺(tái)中輸出的信息只有按時(shí)間順序倒敘排列的一堆聯(lián)系人信息(其實(shí)是VCardEntry對(duì)象,控制臺(tái)輸出的時(shí)候調(diào)用了VCardEntry#toString())。每一個(gè)聯(lián)系人信息如下:

[[  
hash: 427457895   
NAME: [family: nameOfThePerson, given: null, middle: null, prefix: null, suffix: null]  
PHONE: [type: 2, data: 1-111-111-1111, label: null, isPrimary: false]  
]]

問題來了,怎么沒有時(shí)間信息?對(duì)于通話記錄而言,時(shí)間信息還是比較重要的。那么,是 pbap 協(xié)議就不會(huì)給我們返回時(shí)間?還是我們解析時(shí)間數(shù)據(jù)的時(shí)候出了錯(cuò)誤?或者是手機(jī)廠商在實(shí)現(xiàn) pbap server 端的時(shí)候偷工減料了呢?

首先,先去藍(lán)牙 pbap 協(xié)議中查看是否有通話記錄對(duì)應(yīng)的描述:

3.1.4.1 Call History extension
The time of each call found in och, ich, mch and cch folder, can be shown using the
IrMC [13] defined X-IRMC-CALL-DATETIME property that extends the vCard
specification. This attribute can be used in combination with three newly created
property parameters:
? MISSED
? RECEIVED
? DIALED
These are used to indicate the nature of the call that is time-stamped with X-IRMCCALL-DATETIME.
For instance, a call that was missed on March 20th, 2005 at 10 am would be stamped:
X-IRMC-CALL-DATETIME;MISSED:20050320T100000
It is strongly recommended to use this property parameter whenever possible. They are
especially useful in vCards that are retrieved from the cch folder ( see Section 3.1.2 ).
Note that it is legal to use this property with no data; i.e,
X-IRMC-CALL-DATETIME;MISSED:

看來,關(guān)于通話記錄,PBAP 協(xié)議是有所規(guī)定的。所以,問題可能出在手機(jī)廠商的 pbap server 端或者是出在我們解析數(shù)據(jù)的時(shí)候。通過對(duì)VCardParserImp_V21進(jìn)行深層次的調(diào)試,我們發(fā)現(xiàn),X-IRMC-CALL-DATETIME參數(shù)是有輸出的。那就說明是手機(jī)端的 pbap server 是沒有問題的。問題出在我們的 pbap client 上。更具體的定位一下,是我們解析這個(gè)參數(shù)的時(shí)候出了問題,或者是根據(jù)解析出的參數(shù)構(gòu)造VCardEntry的時(shí)候出了問題。

繼續(xù)調(diào)試,在 VCardEntry#addProperty(VCardProperty property) 函數(shù)中,可以輸出 property 并且也是有 X-IRMC-CALL-DATETIME 對(duì)應(yīng)的數(shù)據(jù)的。那么,最終鎖定了問題:我們構(gòu)造 VCardEntry 的時(shí)候,沒有把 X-IRMC-CALL-DATETIME 加進(jìn)來。更本質(zhì)的原因是,android sdk 23 的相關(guān)源碼中,沒有定義 X-IRMC-CALL-DATETIME 相關(guān)的字段。

找到了問題所在,改的時(shí)候就非常好改了。

首先,在 VCardConstants.java 中添加

    public static final String PROPERTY_X_IRMC_CALL_DATETIME = "X-IRMC-CALL-DATETIME"; // added

然后,在 VCardEntry.java 中添加:

    public enum EntryLabel {
        NAME,
        PHONE,
        EMAIL,
        POSTAL_ADDRESS,
        ORGANIZATION,
        IM,
        PHOTO,
        WEBSITE,
        SIP,
        NICKNAME,
        NOTE,
        BIRTHDAY,
        ANNIVERSARY,
        ANDROID_CUSTOM,
        CALL_DATETIME // added
    }

然后,添加 CALL_DATETIME 對(duì)應(yīng)的類:

public static class CallDatetimeData implements EntryElement {

        private final String mCallDatetime;

        public CallDatetimeData(String datetime) {
            mCallDatetime = datetime;
        }



        /** start implementing EntryElement */

        @Override
        public EntryLabel getEntryLabel() {
            return EntryLabel.CALL_DATETIME;
        }

        @Override
        public boolean isEmpty() {
            return TextUtils.isEmpty(mCallDatetime);
        }

        @Override
        public void constructInsertOperation(List<ContentProviderOperation> operationList, int backReferenceIndex) {
            // 我沒看懂這個(gè)函數(shù)要干嘛,時(shí)間有限,先不改了。
        }

        /** end implementing EntryElement */



        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (!(obj instanceof CallDatetimeData)) {
                return false;
            }
            CallDatetimeData datetimeData = (CallDatetimeData) obj;
            return TextUtils.equals(mCallDatetime, datetimeData.mCallDatetime);
        }

        @Override
        public int hashCode() {
            return mCallDatetime != null ? mCallDatetime.hashCode() : 0;
        }

        @Override
        public String toString() {
            return "call datetime: " + mCallDatetime;
        }

        public String getCallDatetime() {
            return mCallDatetime;
        }
    }

最后是在構(gòu)造 VCardEntry 對(duì)象的時(shí)候,將這個(gè)字段添加進(jìn)來:
VCardEntry#addProperty() 中,添加:

if (propertyName.equals(VCardConstants.PROPERTY_X_IRMC_CALL_DATETIME)) {
            mCallDatetimeData = new CallDatetimeData(propValue);  
}

然后在 VCardEntry 中添加一個(gè) getter 就完事了:

    public final String getCallDatetime() {
        return mCallDatetimeData != null ? mCallDatetimeData.mCallDatetime : null;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,765評(píng)論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,046評(píng)論 4 61
  • 有沒有不自私的愛情? 沒有。 愛情就是從對(duì)方那里各取所需 我要你愛我 我要你陪伴我 這就是索取 說什么無私的愛 沒...
    禾豆閱讀 853評(píng)論 1 1
  • 近十年的光陰,即使是曾經(jīng)分秒難熬的低谷,回憶起來也是寥寥字?jǐn)?shù)一恍而過。再追溯回更早的起初,也仿佛就在觸手可及的昨天...
    藍(lán)得出奇閱讀 409評(píng)論 0 0

友情鏈接更多精彩內(nèi)容