android 蓝牙 pbap 获取通话记录以及通话日期时间

android 蓝牙 pbap 获取通话时间

之前,我们利用 pbap 协议获取到了用户的通讯录。那自然而然产生了衍生需求:能否获取通话记录?包括打电话记录(DIALED)、接电话记录(RECEIVED)、未接电话记录(MISSED)?
答案是肯定的。类比获取通讯录的方式,我们可以通过修改client.pullPhoneBook(BluetoothPbapClient.PB_PATH);中的PB_PATH参数,来获取其他的信息。比如:

    /**
     * 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 之后,我们发现获取的信息不完全。我们从控制台中输出的信息只有按时间顺序倒叙排列的一堆联系人信息(其实是VCardEntry对象,控制台输出的时候调用了VCardEntry#toString())。每一个联系人信息如下:

[[  
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]  
]]

问题来了,怎么没有时间信息?对于通话记录而言,时间信息还是比较重要的。那么,是 pbap 协议就不会给我们返回时间?还是我们解析时间数据的时候出了错误?或者是手机厂商在实现 pbap server 端的时候偷工减料了呢?

首先,先去蓝牙 pbap 协议中查看是否有通话记录对应的描述:

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:

看来,关于通话记录,PBAP 协议是有所规定的。所以,问题可能出在手机厂商的 pbap server 端或者是出在我们解析数据的时候。通过对VCardParserImp_V21进行深层次的调试,我们发现,X-IRMC-CALL-DATETIME参数是有输出的。那就说明是手机端的 pbap server 是没有问题的。问题出在我们的 pbap client 上。更具体的定位一下,是我们解析这个参数的时候出了问题,或者是根据解析出的参数构造VCardEntry的时候出了问题。

继续调试,在 VCardEntry#addProperty(VCardProperty property) 函数中,可以输出 property 并且也是有 X-IRMC-CALL-DATETIME 对应的数据的。那么,最终锁定了问题:我们构造 VCardEntry 的时候,没有把 X-IRMC-CALL-DATETIME 加进来。更本质的原因是,android sdk 23 的相关源码中,没有定义 X-IRMC-CALL-DATETIME 相关的字段。

找到了问题所在,改的时候就非常好改了。

首先,在 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 对应的类:

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) {
            // 我没看懂这个函数要干嘛,时间有限,先不改了。
        }

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

最后是在构造 VCardEntry 对象的时候,将这个字段添加进来:
VCardEntry#addProperty() 中,添加:

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

然后在 VCardEntry 中添加一个 getter 就完事了:

    public final String getCallDatetime() {
        return mCallDatetimeData != null ? mCallDatetimeData.mCallDatetime : null;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,614评论 4 59
  • 有没有不自私的爱情? 没有。 爱情就是从对方那里各取所需 我要你爱我 我要你陪伴我 这就是索取 说什么无私的爱 没...
    禾豆阅读 689评论 1 1
  • 近十年的光阴,即使是曾经分秒难熬的低谷,回忆起来也是寥寥字数一恍而过。再追溯回更早的起初,也仿佛就在触手可及的昨天...
    蓝得出奇阅读 368评论 0 0