前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android6.0蓝牙协议之OPP

Android6.0蓝牙协议之OPP

作者头像
fanfan
发布2018-01-24 18:02:32
1.9K0
发布2018-01-24 18:02:32
举报
文章被收录于专栏:编程思想之路编程思想之路

因为毕设做了蓝牙通信相关的,所以工作后让我负责蓝牙模块。但是有bug的时候才发现对蓝牙协议的了解少之又少,现在先分析一个文件传输协议

Chapter One,简单介绍

1,OPP:Object push profile 面向对象传输协议,用于传输文件。

2,代码所在目录为\android\packages\apps\Bluetooth\src\com\android\bluetooth\opp。对于手机是否支持OPP,目前我所接触到的有3处

第一,首先系统方案提供商的蓝牙文档是否支持OPP,OPP有client和server之分

第二,在底层代码中修改,禁止掉该协议。要修改的文件为

代码语言:javascript
复制
android/device/qcom/common/rootdir/etc/init.qcom.bt.sh

要修改的内容为

代码语言:javascript
复制
  setprop ro.qualcomm.bluetooth.opp false

也就是说设置一个系统属性字段 ro.qualcomm.bluetooth.opp为false,即可禁止对opp的支持

第三,在上层的配置文件中修改,要修改的文件目录为

代码语言:javascript
复制
android\android\packages\apps\Bluetooth\res\values\config.xml

要修改的内容为

代码语言:javascript
复制
<bool name="profile_supported_opp">false</bool>

Chapter Two,接收文件流程

当已配对蓝牙设备发来文件时,本机手机会显示是否接收文件,然后显示进度,之后可以在蓝牙传输历史中看到该文件,过程如下:

这些我们都是能看到的,当然用sdk的工具也可以看到这些activity的名称,

首先,是否要接受文件界面时为BluetoothOppIncomingFileConfirmActivity.java

紧接着可以从状态栏进入到文件传输界面为 BluetoothOppTransferActivity.java

蓝牙传输历史界面为BluetoothOppTransferHistory.java

界面信息是依靠sdk下的工具hierarchyviewer获取到的,该工具对更改ui有很大的帮助。这些界面是看到了,可是他们是怎么启动的呢?为什么有文件传输时就会有通知呢???带着这个疑问进行探究。最终有一些收获。

Chapter Three,代码分析

1,重中之重:BluetoothOppReceiver.java。该receiver注册了蓝牙状态改变的广播

代码语言:javascript
复制
 <receiver
            android:process="@string/process"
            android:exported="true"
            android:name=".opp.BluetoothOppReceiver"
            android:enabled="@bool/profile_supported_opp">
            <intent-filter>
                <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
                <!--action android:name="android.intent.action.BOOT_COMPLETED" /-->
                <action android:name="android.btopp.intent.action.OPEN_RECEIVED_FILES" />
            </intent-filter>
        </receiver>

在蓝牙打开时会开启BluetoothOppService服务

代码语言:javascript
复制
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
            if (BluetoothAdapter.STATE_ON == intent.getIntExtra(
                    BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)) {
                if (V) Log.v(TAG, "Received BLUETOOTH_STATE_CHANGED_ACTION, BLUETOOTH_STATE_ON");
                context.startService(new Intent(context, BluetoothOppService.class));
...
...
...
...

因为任务需要,暂缓更新,未完待续

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-11-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档