優化Android搜尋藍牙裝置方式(API 21)

Android 6.0(API 21)以後, 搜尋藍芽裝置的方式改成:

BluetoothAdapter.startScan (ScanCallback callback)

這種方式我一直用了很久, 也沒遇到問題.

直到有一個需求是隨時監控廣播封包,

這種寫法就會遇到問題, 無法快速取得周遭藍牙廣播資料, 因此需要修改寫法, 把能下的藥都下下去(但耗電):

final List<ScanFilter> filters = new ArrayList<>();
ScanFilter filter = new ScanFilter.Builder().build();
filters.add(filter);

final ScanSettings scanSettings =
        new ScanSettings.Builder() .setNumOfMatches(ScanSettings.MATCH_NUM_MAX_ADVERTISEMENT).setMatchMode(ScanSettings.MATCH_MODE_STICKY).setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES).setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();


BluetoothAdapter.getBluetoothLeScanner().startScan(filters,scanSettings,mLeScanCallback);

Android NFC啟用 小工具 NfcToggler

咖啡偶手機小米6原本刷成 LineageOS 15.1 , 但後來為了使用NFC-SIM 悠遊卡 , 只好捨去 LOS , 改刷成小米國際版, 這個版本可以讓NFC功能從Google Pay的HCE功能, 切換 SIM 錢包(也就是nfc-sim)功能.

但是問題來了, 我認為 NFC 平常要關閉,

原本 LOS 15.1內建快速切換工具, 滑下來按一下就可以啟用與停用.

但小米的國際版本不行, 只能選來選去然後停用, 因此寫了一隻小工具widget (需要ROOT) , 按一下就可以方便的啟用與停用, 有興趣可以點選這裡參考看看.

#android

#taiwan

#nfc

 

ubuntu 無法辨識android裝置no permissions

ubuntu連線到android裝置很方便, 安裝程式很簡單:

sudo apt install android-tools-adb android-tools-fastboot

但是常常卡到執行指令 adb devices 想要列出手機時, 出現 no premissions的錯誤

List of devices attached 
????????????    no permissions

原來是要設定usb連線權限
1. 找出google 的裝置

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 8087:0a2b Intel Corp. 
Bus 001 Device 002: ID 05c8:03a2 Cheng Uei Precision Industry Co., Ltd (Foxlink) 
Bus 001 Device 006: ID 18d1:4ee7 Google Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

2. 將該device加到 /etc/udev/rules.d/70-android.rules
70代號可改, 無此檔案也可自行新增
新增內容如下:

SUBSYSTEM=="usb",ATTRS{idVendor}=="18d1",ATTRS{idProduct}=="4ee7",MODE="0666"

3. 重開

  sudo /etc/init.d/udev restart 

PS.

手機不同狀態下(sideload , recovery , system) 都可能有不同的usb id , 因此可能要設定多次

android 刷機好法子"側邊載入(sideload)"

咖啡偶的目前手機是小米6, 因為常常刷機, 版本差異又大,每次刷機,必須重新格式化手機,

因此會用到usb otg, 把要刷的rom放到usb磁碟上, 當手機進入 recovery 的時候, 就可以放心格式化手機, 並且把usb上的rom刷入手機.

但是這方式有點麻煩,需要準備平時也用不著的usb ota,

所以很久以前android就發展sideload的方式刷機, 電腦直接刷rom進去手機, 這就方便多了.

1.手機進入recovery的sideload等待畫面

 

 

 

 

 

 

 

 

 

2.電腦使用adb sideload 指令刷入rom

Android ConstraintLayout 如何置中

請參考紅色部份

<android.support.constraint.ConstraintLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        ...>
  <textview ...>
  app:layout_constraintTop_toTopOf="parent"
  app:layout_constraintBottom_toBottomOf="parent"
  </textview>

</ConstraintLayout>

藍牙罩門UUID

關於藍芽SDP UUID解釋
需要到 www.bluetooth.org  裡面尋找有關 Service Discovery Protocol訊息

https://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm

裡面提到 UUID分成BASE UUID 128bits 與 SHORT UUID(32bits, 16bits)

BASE UUID 格式如下:
00000000-0000-1000-8000-00805F9B34FB

SHORT UUID 再分成 UUID32(2的32次方) 與 UUID16(2的16次方)

UUID32 、UUID16 都是短款的格式

為了相容以往舊款 SDP UUI D格式
在BASE UUID前32bits即是UUID32 , 接下來16bits即UUID16

因此重看BASE UUID:
00000000-0000-1000-8000-00805F9B34FB
桃紅色加上綠色為UUID32, 綠色為UUID16

接下來我們想要使用程式註冊SPP, 透過serial port連線,
根據 www.bluetooth.org 的規範, 須將UUID改成
00001101-0000-1000-8000-00805F9B34FB

1 2