MAP协议
使用场景:智能车载中同步短信,彩信等信息
1 协议概述
协议代码路径:
frameworks\opt\bluetooth\src\android\bluetooth\client\ map这个包中
Jar包名称,android.bluetooth.client. map
所以进行开发时,在mk文件中需要添加这个包,
并且,在AndroidManifest文件中必须导入Obex库,<uses-libraryandroid:name="javax.obex" />
map这个包中文件如下,
MAP和PBAP协议开发流程以及细节几乎完全一样。
2开发步骤
1) 构造BluetoothMasClient对象,
2) 调用BluetoothMasClient对象方法,处理对应的回调消息。
3详细开发过程
3.1构造BluetoothMasClient
BluetoothMasClient的构造方法如下,
public BluetoothMasClient(BluetoothDevice device, SdpMasRecord mas, Handler callback) {
mDevice = device;
mMas = mas;
mCallback = callback;
mPath = new ArrayDeque<String>();
}
有三个参数, device当然是远程蓝牙设备了,这个很容易获取,
mas 是远程蓝牙设备的一个mas代理,是如何获取的呢?
Callback 是Handler对象,主要用于一些消息的回调.
通过注册广播,接收广播可以获取SdpMasRecord对象,
注册广播
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_SDP_RECORD);
registerReceiver(mReceiver, filter);
接收广播
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(BluetoothDevice.ACTION_SDP_RECORD)){
BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
ParcelUuid uuid = intent.getParcelableExtra(BluetoothDevice.EXTRA_UUID);
if(uuid.equals(BluetoothUuid.MAS)){
SdpMasRecord masrec =
intent.getParcelableExtra(BluetoothDevice.EXTRA_SDP_RECORD);
BluetoothMasClient mapclient = new BluetoothMasClient(mDevice, masrec,
mMapHandler);
}
};
3.2方法以及回调处理
客户端BluetoothMasClient的主要方法以及对应的回调消息如下,
方法
回调消息
connect
连接设备
EVENT_CONNECT
setFolderRoot
设置路径/
根目录/子目录/父目录
EVENT_SET_PATH
setFolderUp
setFolderDown
getMessagesListing
获取短信
EVENT_GET_MESSAGES_LISTING
getMessagesListingSize
短信条数
EVENT_GET_MESSAGES_LISTING_SIZE
getMessage
获取当前文件短信
EVENT_GET_MESSAGE
setMessageReadStatus
设置短信是否已读
EVENT_SET_MESSAGE_STATUS
setMessageDeletedStatus
设置短信是否删除
EVENT_SET_MESSAGE_STATUS
pushMessage
新建短信
EVENT_PUSH_MESSAGE
updateInbox
更新短信箱
EVENT_UPDATE_INBOX
已读短信/未读短信/草稿箱通过setFolderRoot方法来设置,路径分别如下,
String inbox = "telecom/msg/inbox";
String outbox = "telecom/msg/outbox";
String draft= "telecom/msg/draft";
可以通过setMessageReadStatus方法设置同步的短信的状态(已读/未读)
可以通过setMessageDeletedStatus方法设置同步的短信的状态(删除/不删除)
还有通过pushMessage来新建短信,通过updateInbox来更新短信箱。
同步短信的详细开发如下,
1,首先连接设备,调用connect方法,
mapclient. connect()
2,设置路径,调用setFolderRoot方法,还需要处理EVENT_SET_PATH消息
mapclient. setFolderRoot()
3,调用getMessagesListing 方法同步短息
mapclient.getMessagesListing()
4,处理EVENT_GET_MESSAGES_LISTING回调消息
ArrayList<BluetoothMapMessage> getMessagesListing; // 保存同步短信
BluetoothMapBmessage getMessage; //保存同步短信
private final Handler mMapHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case BluetoothMasClient.EVENT_GET_MESSAGES_LISTING:
getMessagesListing = (ArrayList< BluetoothMapMessage >) msg.obj;
break;
}
};
到此, getMessagesListing就保存了同步的短信,后续就可以进行处理了。
4流程图
同步的方法调用流程几乎是一模一样的,所以以getMessagesListing方法为例,
流程图比同步联系人更简单,每条短信对应一个BluetoothMapMessage对象。同步完之后, BluetoothMasClient中的SessionHandler对象首先获取BluetoothMapMessage数组,然后通过EVENT_GET_MESSAGES_LISTING消息将BluetoothMapMessage发出,因此在开发时处理该消息就可以获取同步的短信。
5 BluetoothMapMessage简析
查看BluetoothMapMessage源码,可以看到同步短信所保存的信息,
private final String mHandle;
private final String mSubject;
private final Date mDateTime;
private final String mSenderName;
private final String mSenderAddressing;
private final String mReplytoAddressing;
private final String mRecipientName;
private final String mRecipientAddressing;
private final Type mType;
private final int mSize;
private final boolean mText;
private final ReceptionStatus mReceptionStatus;
private final int mAttachmentSize;
private final boolean mPriority;
private final boolean mRead;
private final boolean mSent;
private final boolean mProtected;
对应的get方法如下,
每条短信的信息都在BluetoothMapMessage构造方法中赋值,并且每个字符/boolean值都有对应的获取/判断方法,一一对应,相对来说,比pbap协议的要简单得多。
————————————————
版权声明:本文为CSDN博主「Achillisjack」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012439416/article/details/54349812