问题点11手机发送文件时,车机会弹出提示菜单,其实现flow是;

----实测发现,当demo车机显示是否接受或拒绝OPP时,其已经收到了第一包

OBEX_OPCODE_PUT进而触发onPut;

-->当操作Demo 车机UI选择拒接时,车机出现的第一个log是:

BluetoothOppReceiver: Receiver ACTION_DECLINE

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_车载android系统怎么关闭

通过反推确认” Constants.ACTION_DECLINE”具体的发送者是方法

updateIncomingFileConfirmNotification(参考问题点10,查看此API的执行flow)

Attention:这个方法实现了系统级的Nitofication,当点击”DECLINE” 或”ACCEPT”时,其会对应的发出广播” Constants.ACTION_DECLINE”或Constants.ACTION_ACCEPT;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_车载android系统怎么关闭_02

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_API_03

问题点12:local device OPP Server在点击确认接收文件后, 车机会显示文件接收进度;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_API_04

----核心实现API是:updateActiveNotification;显示进度条的实现是setProgress

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_java_05

延伸问题点:接收进度条与BluetoothOppObexServerSession的方法onPut关系;

---通过实测发现,进度条的进度显示并不是随着onPut的周期调用而变化;

如当前车机从OPPO 手机端接收一张1,35MB的图片;

其实际应该是:onPut先把data接收完成并通过

” getContentResolver().insert(BluetoothShare.CONTENT_URI”写入了URI中;然后在监听线程BluetoothShareContentObserver中的方法onChange执行updateNotification 发出

NOTIFY;最后在updateActiveNotification中周期读取BluetoothShare.CONTENT_URI中的内容;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_开发语言_06

 问题点13local device 当文件接收完成时,在屏幕最底下显示文件接收完成及具体的存储路径;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_进度条_07

--核心API:updateCompletedNotification,通过Notification发出系统通知,只看到了显示接收完成的Toast通知(如上图);

需注意的是:此API 也负责主动发送完成时的系统通知;

实测log显示:此API执行会比较频繁,其通过API 内部的outboundNum和inboundNum来管控是否发出系统通知;

延伸问题点:显示接收完成的Toast是在哪里发出的;

---基于显示特定格式“Bluetooth share: Received”, 我们找到其对应的资源为

“R.string.notification_received”

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_车载android系统怎么关闭_08

 Code 中tracing 发现其实在收到广播

“BluetoothShare.TRANSFER_COMPLETED_ACTION” 后进行的发出;

-->倒推广播BluetoothShare.TRANSFER_COMPLETED_ACTION的发送;

-->sendIntentIfCompleted 发出广播;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_API_09

-->updateShareStatus中执行sendIntentIfCompleted;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_进度条_10

-->类BluetoothOppObexServerSession中方法onPut中(第二位置)执行updateShareStatus;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_车载android系统怎么关闭_11

延伸问题点:如截图所示,当OPP 文档接收完成时,本地存储路径是如何确定的;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_进度条_12

--> else if (action.equals(BluetoothShare.TRANSFER_COMPLETED_ACTION))

如截图,其本地路径是“transInfo.mFileName”栏位,

其通过“BluetoothOppUtility.queryRecord”的静态方法获取到

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_进度条_13

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_进度条_14

-->BluetoothOppUtility.queryRecord

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_java_15

-->执行到BluetoothOppUtility的静态方法fillRecord,进行内容填充;

对应的log打印是“Get data from db:”

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_进度条_16

通过实际log反向追溯,发现第一个出现以上路径的log是“Generated received filename”

-->通过“Generated received filename”定位到类BluetoothOppReceiveFileInfo中方法

generateFileInfo;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_进度条_17

base.getPath() + File.separator + filename;”得到全路径名称,然后通过方法chooseUniquefilename来确认当前名称唯一(如之前已有相同名称,则后缀+序号);最终更新文件名称到“BluetoothShare.FILENAME_HINT”栏位,同时generateFileInfo返回一个带全路径名称;

-->当前generateFileInfo是在BluetoothOppObexServerSession的方法processShareInfo中被调用;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_车载android系统怎么关闭_18

-->倒推到BluetoothOppObexServerSession中方法addShare调用processShareInfo;

对应log是:“addShare for id”

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_开发语言_19

Note:此时全路径资讯被赋值到类BluetoothOppObexServerSession 的mFileInfo中;

-->倒推到类BluetoothOppTransfer中方法processCurrentShare调用addShare;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_进度条_20

-->通过实际log倒推到类BluetoothOppTransfer中方法 startObexSession中调用processCurrentShare;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_API_21

-->通过Log “Create handler thread for batch”倒推到BluetoothOppTransfer中方法start执行startObexSession;

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_开发语言_22

-->通过log “Service start server transfer new Batch”倒推到类BluetoothOppService中方法insertShare执行的“mServerTransfer.start();”

车载android系统怎么关闭 安卓车机怎么关闭蓝牙_开发语言_23

所以实现全路径名称问询的起始在方法insertShare;