发明内容
本发明的目的在于提供一种获取智能终端电话本信息的方法及装置,以解决现有Android智能终端不能通过蓝牙方式主动获取其他智能终端电话本信息的技术问题。
为达此目的,本发明采用以下技术方案:
本发明一方面提供了一种获取智能终端电话本信息的方法,包括:
第一智能终端通过蓝牙搜索第二智能终端,并与第二智能终端进行蓝牙配对;
第一智能终端向已完成蓝牙配对的第二智能终端发送蓝牙连接请求,建立与第二智能终端的蓝牙连接;
第一智能终端向第二智能终端发送对象交换协议OBEX连接请求,建立与第二智能终端的OBEX连接;
第一智能终端基于蓝牙电话本访问协议向第二智能终端发送获取第二智能终端电话本中联系人信息的请求,并接收第二智能终端返回的对应的联系人信息,将所述联系人信息添加到本地电话本中。
其中,所述第一智能终端接收第二智能终端返回的对应的联系人信息,将所述联系人信息添加到本地电话本中之后,还包括:
第一智能终端向第二智能终端发送OBEX断开连接请求,断开与第二智能终端的所述OBEX连接;
第一智能终端关闭蓝牙套接字,断开与第二智能终端的蓝牙连接。
其中,所述第一智能终端向已完成蓝牙配对的第二智能终端发送蓝牙连接请求,建立与第二智能终端的蓝牙连接,包括:
第二智能终端采用蓝牙电话本访问协议创建一个BluetoothServerSocket,通过该BluetoothServerSocket监听第一智能终端的蓝牙连接请求;
第一智能终端向第二智能终端发送蓝牙连接请求,创建一个客户端BluetoothSocket;
第二智能终端BluetoothServerSocket监听到所述第一智能终端发出的蓝牙连接请求并接受该蓝牙连接请求,获得一个服务器端BluetoothSocket;
基于所述客户端BluetoothSocket和服务器端BluetoothSocket建立所述第一智能终端和第二智能终端的蓝牙连接。
其中,所述第一智能终端基于蓝牙电话本访问协议向第二智能终端发送获取第二智能终端电话本中联系人信息的请求,并接收第二智能终端返回的对应的联系人信息,将所述联系人信息添加到本地电话本中,包括:
第一智能终端基于蓝牙电话本访问协议向第二智能终端发送获取第二智能终端电话本中联系人总数的指令,接收第二智能终端返回的电话本联系人总数;
第一智能终端基于蓝牙电话本访问协议向第二智能终端逐一发送获取第二智能终端电话本中各个联系人信息的指令,并接收第二智能终端返回的电话本中对应的联系人信息,将接收到的联系人信息添加到本地电话本中。
其中,所述第一智能终端接收第二智能终端返回的电话本中对应的联系人信息,将接收到的联系人信息添加到本地电话本中,具体为:
第一智能终端逐一接收第二智能终端返回的电话本中对应的联系人信息,并将接收到的联系人信息保存为.vcf格式文件;
第一智能终端逐一解析所述.vcf格式文件获得对应的联系人信息,将获得的联系人信息添加到本地电话本中。
其中,所述第一智能终端和第二智能终端均为安卓系统的智能终端。
本发明另一方面还提供了一种获取智能终端电话本信息的装置,包括:
蓝牙配对模块,用于通过蓝牙搜索第二智能终端,并与第二智能终端进行蓝牙配对;
蓝牙连接模块,用于发送蓝牙连接请求,建立与第二智能终端的蓝牙连接;
OBEX连接模块,用于发送对象交换协议OBEX连接请求,建立与第二智能终端的OBEX连接;
获取电话本模块,用于基于蓝牙电话本访问协议发送获取第二智能终端电话本中联系人信息的请求,并接收第二智能终端返回的对应的联系人信息,将所述联系人信息添加到本地电话本中。
其中,所述OBEX连接模块,还用于发送OBEX断开连接请求,断开与第二智能终端的所述OBEX连接;
所述蓝牙连接模块,还用于关闭蓝牙套接字,断开与第二智能终端的蓝牙连接。
其中,所述蓝牙连接模块具体用于:
向第二智能终端发送蓝牙连接请求;若该蓝牙连接请求被第二智能终端的BluetoothServerSocket接受,建立与第二智能终端的蓝牙连接;
其中,第二智能终端采用蓝牙电话本访问协议创建一个BluetoothServerSocket,通过该BluetoothServerSocket监听进入的蓝牙连接请求。
其中,所述获取电话本模块,具体用于:
基于蓝牙电话本访问协议向第二智能终端发送获取第二智能终端电话本中联系人总数的指令,接收第二智能终端根据该指令返回的电话本联系人总数;以及,
基于蓝牙电话本访问协议向第二智能终端逐一发送获取第二智能终端电话本中各个联系人信息的指令,并接收第二智能终端返回的电话本中对应的联系人信息,将接收到的联系人信息保存为.vcf格式文件;以及,
解析所述.vcf格式文件获得联系人信息,将获得的第联系人信息添加到本地电话本中。
实施本发明实施例,具有如下有益效果:
本发明实施例基于Android系统,利用蓝牙PBAP(Phone Book AccessProfile:电话本访问协议)协议,并使用对象交换协议(OBEX:Object Exchange)实现了Android系统的PBAP服务的客户端功能,使得Android智能终端可通过蓝牙方式主动获取其他智能终端的电话本信息,为用户提供了方便。
具体实施方式
下面结合本发明的附图对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
Android系统在2.0之后开始支持新的蓝牙PBAP,在蓝牙协议栈中,PBAP是专门为蓝牙车载设备自动下载手机内的电话本而定义的一套协议,其构建在对象交换协议OBEX基础上,PBAP是基于类似的底层API接口和调用路径实现的。由于基于OBEX协议,PBAP的实现包括Server服务器端和Client客户端两端,目前的Android系统本身只实现了PBAP的Server端,对Client端并没有实现。因此,现有的Android智能终端无法通过蓝牙请求获得其他设备的电话本信息。
本发明实施例是基于Android系统,利用蓝牙PBAP协议开发的客户端程序,以在Android智能终端设备中实现PBAP客户端功能,能让具有该功能的智能终端设备可通过蓝牙主动获取对方设备的联系人信息。更因为现在市面上Android手机版本都在2.3以上,所以本发明实现之后,具有较大的应用空间。
本发明实施例中,智能终端可以包括:PC、平板电脑、手机、PDA(PersonalDigital Assistant,掌上电脑)、电子阅读器、笔记本电脑、智能电视、车载终端等可以建立电话本的智能终端,并且所述智能终端基于Android系统。较佳地,若无具体说明,本实施例中的智能终端指安卓系统的智能手机。
下面将结合附图1-附图4,对本发明实施例提供的获取智能终端电话本信息的方法进行详细介绍。
请参见图1,图1是本发明一种获取智能终端电话本信息的方法的实施例的流程示意图,该方法具体包括如下步骤S1-S4:
步骤S1,第一智能终端通过蓝牙搜索第二智能终端,并与第二智能终端进行蓝牙配对。
具体实施时,可预先在第一智能终端和第二智能终端定制对应的PBAP应用程序,包括一些界面控件的处理等。接收用户操作指令初始化第一智能终端的该应用程序之后,还需检测第一智能终端和第二智能终端的蓝牙是否均开启,如果没有,则需先开启第一智能终端和第二智能终端的蓝牙。
关于第一智能终端与第二智能终端进行蓝牙配对属于现有技术,可参考现有的蓝牙配对方法执行,在此不再赘述。
步骤S2,第一智能终端向已完成蓝牙配对的第二智能终端发送蓝牙连接请求,建立与第二智能终端的蓝牙连接。具体为,第一智能终端向已完成蓝牙配对的第二智能终端发送蓝牙连接请求,若所述蓝牙连接请求被第二智能终端接受,则建立第一智能终端与第二智能终端的蓝牙连接,否则,第一智能终端继续发送蓝牙连接请求。
本发明实施例是利用蓝牙PBAP协议,在OBEX协议基础上在Android智能终端设备中开发实现PBAP的client客户端功能。首先需要建立两台智能终端的蓝牙连接。为了在两台智能终端上创建一个蓝牙连接,必须在软件上实现服务器端和客户端的机制,它们之间使用BluetoothSocket类的不同方法来获取数据。只有当服务器端和客户端都有一个BluetoothSocket时,它们之间才能建立一个蓝牙连接,才能够开始数据传输。
因此,当想要蓝牙连接两个安卓智能终端时,将其中一个智能终端作为客户端,本实施例中第一智能终端作为客户端,将其中另外一个智能终端作为服务器端,本实施例中第二智能终端作为服务器端。并且在服务器端通过蓝牙PBAP专有的UUID(Universally Unique Identifier,通用唯一识别码)创建一个Bluetooth Server Socket,打开该Bluetooth Server Socket监听进入的蓝牙连接请求。客户端和服务器端的蓝牙连接过程如下。
首先,客户端发送一个到已完成蓝牙配对的服务器端的蓝牙连接请求,即在客户端创建了一个BluetoothSocket。
具体的,为了初始化一个到服务器端的蓝牙连接,客户端必须首先获得一个BluetoothSocket并初始化一个连接,基本过程如下:
客户端蓝牙设备调用createRfcommSocketToServiceRecord(UUID)以获得一个客户端的BluetoothSocket。此处传入的参数UUID必须和服务器端打开BluetoothServerSocket时使用的UUID匹配。
然后,客户端调用connect()方法以初始化一个蓝牙连接请求。通过调用connect()方法系统将执行SDP查找远程蓝牙设备以匹配UUID。仅当客户端蓝牙设备发出的蓝牙连接请求包含UUID与正在监听的BluetoothServerSocket所注册的UUID匹配时蓝牙连接请求才可能被服务器端接受。
如果查找成功并且服务器端的蓝牙设备接受了该连接,则connect()将返回一个BluetoothSocket,即客户端获得一个BluetoothSocket。connect()方法是一个阻塞调用。任何原因的连接失败或超时(大约在12秒)都将抛出一个异常。
进一步的,服务器端监听到来自客户端发送的蓝牙连接请求,若接受,则向客户端返回一个对应的应答消息通知客户端当前的蓝牙连接被接受。当服务器端接受来自客户端发送的蓝牙连接请求时,在服务器端将产生一个BluetoothSocket。至此,客户端和服务器端均有一个BluetoothSocket,默认为客户端和服务器端的蓝牙连接成功,客户端和服务器端便可通过该蓝牙连接进行数据传输。
具体的,作为服务器端的第二智能终端通过BluetoothServerSocket并接受一个蓝牙连接的基础过程为:
首先,调用listenUsingRfcommWithServiceRecord(String,UUID)获得一个BluetoothServerSocket。其中,字符串参数UUID是服务器端的蓝牙设备的标识名,系统将自动将这个标识名写到设备上一个新的Service DiscoveryProtocol(SDP:蓝牙设备发现协议)数据库条目中。UUID也会被包含在这个新的SDP条目中,并作为与客户端的蓝牙设备建立蓝牙连接的基础。
其次,服务器端调用accept()方法开始监听来自客户端的蓝牙连接请求。当服务器端接受了一个客户端的蓝牙连接请求时,accept()方法将返回一个服务器端的BluetoothSocket,即服务器端获得一个BluetoothSocket。至此,可基于所述客户端Bluetoothsocket和服务器端BluetoothSocket建立所述第一智能终端和第二智能终端的蓝牙连接,客户端和服务器端的蓝牙连接成功。
因为accept()方法是一个阻塞调用,因此不应该在主Activity UI线程中执行,一般使用Bluetooth Server Socket或者BluetoothSocket进行相关工作时都是在一个新的线程中执行。为了避免调用诸如accept()这样的阻塞调用,针对来自其他线程的Bluetooth Server Socket或者BluetoothSocket调用close()将会使阻塞调用立即返回。
客户端和服务器端的蓝牙连接成功之后,服务器端通常调用close()方法关闭BluetoothServerSocket,以释放BluetoothServerSocket和它占用的所有资源,但不关闭accept()返回的已连接的BluetoothSocket。即服务器端创建了一个蓝牙连接的socket之后立即调用close()来关闭服务器端的BluetoothServerSocket,即停止监听第一智能终端的蓝牙连接请求。
需要说明的是:本实施例所述的蓝牙连接实际为蓝牙socket连接。由于连接是Broken方法,因此需要放入Thread中处理,等待蓝牙连接成功,如果成功连接则说明第一智能终端和第二智能终端已经建立了蓝牙的PBAP连接。
需要说明的是,如果所述第一智能终端和第二智能终端在建立蓝牙连接之前没有进行蓝牙配对,那么在建立蓝牙连接的过程中,Android系统将自动给出一个蓝牙配对请求的提示信息或者一个对话框。只有当用户确认蓝牙配对之后,设备之间的RFCOMM连接才会继续进行,否则蓝牙连接失败。
步骤S3,第一智能终端向第二智能终端发送对象交换协议OBEX连接请求,建立与第二智能终端的OBEX连接。具体为:第一智能终端向第二智能终端发送对象交换协议OBEX连接请求,若接收到第二智能终端返回的与所述OBEX连接请求对应的应答指令,建立第一智能终端与第二智能终端的OBEX连接,即启动第一智能终端和第二智能终端的PBAP服务。
请参阅图2,该步骤具体实施过程为:
步骤21,客户端100向服务端发送OBEX连接请求,指令码为0X80,并带入参数TAGET UUID,取值与第二智能终端的UUID匹配,等待服务200进行响应。
步骤22,服务器端200收到所述OBEX连接请求,若接受客户端100的OBEX连接请求,则返回响应指令,指令码为0X A0,通知客户端100OBEX连接请求被接受。
至此,即客户端100和服务器端200的OBEX连接成功。客户端100记录服务器端返回数据中分配给当前连接的标识CONNECT ID,然后执行下一步。除了0XA0以外的任何服务器应答码均为错误,执行最后一步退出程序。
步骤S4,第一智能终端基于PBAP向第二智能终端发送获取第二智能终端电话本中联系人信息的请求,并接收第二智能终端返回的与所述PBAP请求指令对应的联系人信息,将所述联系人信息添加到本地电话本中。
PBAP对电话本同步操作在OBEX之上是采用GET命令便能实现。PBAP在OBEX上的适配非常简单,首先它把电话本文件封装为MIME(MultipurposeInternet Mail Extensions,多用途互联网邮件扩展)类型为"x-bt/phonebook"的文件,而且文件名也已经固定好了,比如SIM卡的电话本文件为SIM1/telecom/pb.vcf。这样PBAP的客户端(第一智能终端)和服务器端(第二智能终端)建立连接后,客户端发起GET命令,请求该类型的该文件便可获得服务器端的电话本信息。
PBAP采用文件的形式将同类型的电话号码条目组装在一起,定义了五种文件类型:local phone电话本、sim卡电话本、dialed call、missed call、received call,这些文件有特定的文件名。具体电话条目的封装规范基于VCARD(电子名片的文件格式标准,可作为各种应用或系统之间的交换格式)。
请参见图2,本实施例中,客户端100第一智能终端通过PBAP服务发送获取服务器端200第二智能终端电话本中联系人信息的请求指令,并接收第二智能终端返回的对应的联系人信息,将所述联系人信息添加到本地电话本中具体包括如下步骤:
步骤23,客户端100发送基于PBAP的获取电话本联系人总数的请求指令,本实施例中指令码为0X83。具体按照图3所示的格式来进行构造请求指令的各个字段并发送。其中MLC字段必须设置为0,表示需要服务器端200返回电话本联系人总数。
步骤24,服务端200收到客户端100的包含指令码0X83的请求后,查询本地电话本获取联系人总数N,返回携带了联系人总数N信息的响应指令码0XA0给客户端100。
步骤25,若客户端100收到服务端200响应的0XA0指令,则记录服务器端200电话本联系人总数N,并执行一步步骤,否则退出程序。
步骤26,客户端100发送获取服务器端200电话本中单个联系人的指令,请求获取服务器端200电话本中单个联系人信息。所述指令详细按照图3的格式来进行构造指令的各个字段并发送,其中MLC字段设置为1,LOS字段字段依次从0递增到N-1,NAME字段设置服务器端电话本文件的名字为telecom/pb/0.vcf。
步骤27,服务器端200向客户端100返回对应的单个联系人信息。本实施例中,服务器端返回的联系人信息的格式为.vcf格式。
步骤28,客户端100后调用Android系统vcard import api解析所述.vcf格式文件获得对应的联系人信息,将获得的联系人信息插入到本地电话本中。
循环N次执行步骤26-步骤28,客户端100逐一获取服务器端200电话本中的各个联系人信息,并将各个联系人信息添加到客户端100电话本中。
例如,客户端100请求获取服务器端200电话本中第一个联系人,则对应的请求指令中的MLC字段设置为1,LOS字段字段为0,NAME字段设置服务器端电话本文件的名字为telecom/pb/0.vcf。对应的,服务器端200返回电话本中的第一个联系人信息vcard_0,客户端100解析vcard_0将对应的联系人信息插入到本地电话本中。客户端100请求获取服务器端200电话本中第N个联系人,则对应的请求指令中的MLC字段设置为1,LOS字段字段为N-1,NAME字段设置服务器端电话本文件的名字为telecom/pb/0.vcf。对应的,服务器端200返回电话本中的第N个联系人信息vcard_N,客户端100解析vcard_N将对应的联系人信息插入到本地电话本中。
客户端100获取到服务器端200电话本中全部联系人信息后,发送OBEX断开连接请求,若接收到服务器端200返回的断开应答指令,断开客户端100与服务器端200的OBEX连接。本实施例中,客户端100发送OBEX断开连接请求的指令码为0X81,服务器端200返回的断开应答指令的指令码为0XA0。
需要说明的是,本发明上述实施例中客户端智能终端通过蓝牙主动请求获取了服务器端智能终端的电话本中的全部联系人信息,基于相似的原理,客户端智能终端还可以通过蓝牙主动请求获取了服务器端智能终端的电话本中的部分的联系人信息,或者某一个特定联系人的信息,其实现的原理和过程可参照本发明上述实施例,在此不再赘述。
通过上述实施例的获取智能终端电话本信息的方法,基于Android系统,利用蓝牙PBAP协议,并使用对象交换协议OBEX实现了Android系统的PBAP服务的客服端功能,使得Android智能终端可通过蓝牙方式主动获取其他智能终端的电话本信息,为用户提供了方便。
为了更详细的解释本发明的一种获取智能终端电话本信息的方法,本发明还提供了一种获取智能终端电话本信息的方法的具体流程图,请参见图4,包括如下步骤30-步骤39。
首先,开启第一智能终端和第二智能终端的PBAP应用程序,其中,第一智能终端和第二智能终端已完成了蓝牙配对。
步骤S30,检测第一智能终端的蓝牙是否开启,若是,执行下一步,否则提示用户开启蓝牙,重新执行该步骤。
步骤31,搜索附近的蓝牙设备,是否搜索到第二智能终端的蓝牙设备,若是执行下一步,否则转入错误处理步骤。
步骤32,第一智能终端发送蓝牙连接请求给第二智能终端,若该蓝牙连接请求被第二智能终端接受则执行下一步,否则转入错误处理步骤。
步骤33,第一智能终端发送OBEX连接请求给第二智能终端,若该OBEX连接请求被第二智能终端接受则执行下一步,否则转入错误处理步骤。
步骤34,第一智能终端发送获取电话本联系人总数的指令给第二智能终端,若接受到第二智能终端返回的电话本联系人总数则执行下一步,否则转入错误处理步骤。
步骤35,第一智能终端发送获取电话本单一联系人的指令给第二智能终端,若接受到第二智能终端返回的电话本中对应的联系人信息则执行下一步,否则转入错误处理步骤。
步骤36,第一智能终端将获得的联系人信息保存为.vcf格式文件。
第一智能终端循环发送获取电话本单一联系人的指令给第二智能终端,以逐一获取第二智能终端电话本中的联系人信息。
步骤37,第一智能终端解析所述.vcf格式文件获得联系人信息,将获得的第联系人信息添加到本地电话本中。
步骤38,第一智能终端发送OBEX断开连接请求给第二智能终端,若接收到第二智能终端返回的断开应答指令,断开第一智能终端与第二智能终端的OBEX连接。
步骤39,第一智能终端关闭蓝牙套接字,断开第一智能终端与第二智能终端的蓝牙连接。
最后,第一智能终端完成对第二智能终端电话本的请求操作,根据用户操作指令分别退出第一智能终端和第二智能终端的PBAP应用程序。
通过本实施例的获取智能终端电话本信息的方法,基于Android系统,利用蓝牙PBAP协议,并使用对象交换协议OBEX实现了Android系统的PBAP服务的客服端功能,使得Android智能终端可通过蓝牙方式主动获取其他智能终端的电话本信息,为用户提供了方便。
以下为本发明实施例提供的获取智能终端电话本信息的装置的实施例。装置的实施例与上述的方法实施例属于同一构思,在装置的实施例中未详尽描述的细节内容,可以参考上述阅方法实施例。
下面将结合附图5,对本发明实施例提供的获取智能终端电话本信息的装置进行详细介绍。
请参见图5,本实施例的获取智能终端电话本信息的装置包括:
蓝牙配对模块510,用于通过蓝牙搜索第二智能终端,并与第二智能终端进行蓝牙配对。具体如图1及其实施例所述。
蓝牙连接模块520,用于向第已配对的第二智能终端发送蓝牙连接请求,建立与第二智能终端的蓝牙连接。其中,所述第二智能终端作为蓝牙连接的服务器端。具体如上述实施例所述。
OBEX连接模块530,用于向第二智能终端发送OBEX连接请求,建立与第二智能终端的OBEX连接。具体如上述实施例所述。
获取电话本模块540,用于基于蓝牙电话本访问协议向第二智能终端发送获取第二智能终端电话本中联系人信息的请求,并接收第二智能终端返回的对应的联系人信息,将所述联系人信息添加到本地电话本中。
较佳地,所述OBEX连接模块530,还用于向第二智能终端发送OBEX断开连接请求,断开与第二智能终端的所述OBEX连接。具体如上述实施例所述,不再赘述。
较佳地,所述蓝牙连接模块520,还用于关闭蓝牙套接字,断开与第二智能终端的蓝牙连接。具体如上述实施例所述,不再赘述。
进一步地,所述蓝牙连接模块520可具体用于:向第二智能终端发送蓝牙连接请求;若该蓝牙连接请求被第二智能终端BluetoothServerSocket监听到并接受,建立与第二智能终端的蓝牙连接;其中,第二智能终端采用蓝牙电话本访问协议规范创建一个BluetoothServerSocket,通过该BluetoothServerSocket监听进入的蓝牙连接请求。具体如上述实施例所述,不再赘述。
进一步地,所述获取电话本模块540可具体用于:基于电话本访问协议向第二智能终端发送获取第二智能终端电话本中联系人总数的指令,接收第二智能终端根据该指令返回的联系人总数;以及,基于电话本访问协议向第二智能终端逐一发送获取第二智能终端电话本中各个联系人信息的指令,并接收第二智能终端返回的对应联系人,将接收到的联系人信息保存为.vcf格式文件;以及,解析所述.vcf格式文件获得联系人信息,将获得的第联系人信息添加到本地电话本中。具体如上述实施例所述,不再赘述。
通过实施本发明的上述实施例,基于Android系统,利用蓝牙PBAP协议并使用对象交换协议OBEX,实现了Android系统的PBAP服务的客服端功能,使得Android智能终端可通过蓝牙方式主动获取其他智能终端的电话本信息,为用户提供了方便。
本领域普通技术人员可以理解实现上述实施例方法中的全部或者部分流程,是可以通过计算机程序指令相关的硬件来完成,所述的程序可存储于一计算机可读存取介质中,该程序执行时,可包括上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(random access memory,RAM)等。
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利要求范围,因此,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,仍属本发明所涵盖的范围。