蓝牙map协议源码解析

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

### 蓝牙 MAP 协议详细介绍 #### 定义与基础架构 蓝牙消息访问配置文件 (Message Access Profile, MAP) 基于 OBEX(对象交换)协议工作,并采用了 Client-Server 模型[^1]。这种设计允许设备之间通过蓝牙连接来传输短消息服务(SMS),多媒体信息服务(MMS)以及其他类型的消息。 #### 实现方式 MAP 的实现位于 Android 系统框架中的特定位置,在 `frameworks/opt/bluetooth/src/android/bluetooth/client/map` 这个包内可以找到相关的源码实现[^4]。而在应用程序层面,则可以在 `packages/apps/Bluetooth/src/com/android/bluetooth/` 下发现更多有关此功能的服务路径和接口定义[^5]。 #### 功能特性 作为 Bluetooth Stack 中的一部分,MAP 支持多种通信场景下的消息管理操作,比如读取、写入、删除短信等基本动作;同时也支持更复杂的功能如同步未读通知状态或是查询新收到的信息列表等内容[^3]。 ```java // Java代码片段展示如何初始化一个MAP客户端实例 public class MapClient { private final BluetoothMapClient mService; public void initialize() { // 初始化过程... mService.connect(); } } ``` #### 应用案例 对于智能手机而言,MAP 主要用于与其他移动终端共享 SMS 或 MMS 数据流,使得用户能够在不同装置间无缝切换并保持一致的消息体验。例如当用户的手机靠近车载系统时,即可利用后者的大屏幕查看来自前者的新消息提醒。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值