優化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

 

android手機的NFC功能之一是可使用悠遊卡

台灣現在支付方式滿天飛, 只要有手機在, 隨便都可以在不需要帶現金的情況下, 用各種商家接受的付款方式付款,如街口支付, Line Pay , Samsung Pay , Apple Pay, Taiwan Pay , 歐付寶等等.

但是就只有一個情況下, 必須要用到android的NFC功能,  因為到目前為止:

捷運, 公車, ubike 或是某些商家的支付方式, 還僅限於悠遊卡/一卡通/iCash

像之前咖啡偶出門騎單車/跑步, 常常遇到網路不穩定, 電子支付方式無法成功,

或是遇到商家只接受悠遊卡, 可是又不想要出門時, 悠遊卡帶來帶去放在防水袋中, 然後運動完又要將卡放回去皮包, 有夠不方便的, 此時就需要手機兼具悠遊卡功能.

攻略如下:

  1. 到電信商將你的sim卡升級成NFC-SIM卡, 有些搭配聯名卡還能自動儲值
  2. 換一隻支援NFC-SIM卡的NFC手機(可問電信商直營店)

因為悠遊卡不需要網路暢通, 甚至無網路就能使用, 是很好的特性.如圖:

 

 

 

 

 

 

 

 

 

 

啊有人說貼一張悠遊卡就好了. 這作法當然可行, 可是就弱掉了, 好像貼一張狗皮藥膏, 卡卡的,也難看!
讓sim卡兼具悠遊卡功能多好啊, 而且還免費, 而且就算換了家電信商, 也還能繼續使用呢.

#nfc-sim

#android

#悠遊卡

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 

4. 拔掉usb線, 讓手機重新接受電腦連線

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

如果你的google play 商店顯示裝置未認證, 請記得註冊裝置的GSF ID

因為咖啡偶的小米6重新刷成 Lineage OS 15.1 (Android 8.1) , google play 商店顯示裝置未認證(但還是讓我能登入使用,真怪), Lineage 建議註冊一下手機 GSF ID, 作法如下:
1. 先在手機安裝獲取 GSF ID的app, 請搜尋 device id 安裝後取得 Google Service Framework ID
2. 到這個網站  https://www.google.com/android/uncertified/  輸入 GSF ID

到目前為止, 我輸入GSF ID 還是沒有用, 一樣出現裝置未認證的情形, 看來只能等待了

安卓開源分支lineageos , 擁有很棒的連續整合機制(CI)

安卓開源分支lineageos , 是一款很受歡迎的第三方ROM , 其實他也擁有很棒的連續整合機制(CI) .

咖啡偶最近購入小米6 , XDA 開發者Cozzmy13使用 lineage os 原始碼, 開發了小米6的Android 8.1 版本, 前幾天Cozzmy13決定讓自己的心血, 成為Lineage官方ROM.

Lineage同意後, 馬上加入Lineage自身的連續整合機制, 今天( 4/30 8:00 UTC ) 立馬啟動第一次自動編譯, 大家好興奮, 甚至等不及嚷嚷著要開Party呢!

這對於軟體工程來說實在很讚的作法;

反觀台灣, 咖啡偶敢肯定大部份的中小企業(含上市櫃公司) , 對於軟體, 韌體開發, 做不到連續整合機制(搭配版本控管), 原因當然很多. 我想最大的原因就是:

決策者對於軟體工程是沒有夢的!

決策者意指技術長, 資訊長或是安全長.

只要東西能跑, 有測試就好.

對於這些程式碼的管控, 部門間的整合測試, 根本不當作一回事,也怕麻煩.

因為一堆老將,新人要整合,最後老闆還狐疑你們這群人倒底再幹麻, 東西沒拿出多少, 但就是忙成一團, 技術長從不著眼未來, 也不想當老闆與技術熱愛者溝通的橋樑.

技術長普遍認為:

要讓自己身價高, 不被公司淘汰, 必須卡住一些知識, 才能屹立不搖!

好拉, 看到人家的進步, 反觀自己國家的衰弱, 真是有感而發, 不好意思啊!

拉回主題, 請大家參觀一下Lineage的連續整合機制:

Lineage 的 CI (Jenkins )

Lineage 的 Build

Lineage 的版本控管(github)

開發者 Cozzmy13 的XDA論壇(用於問題回報)

[OFFICIAL][8.1.0] LineageOS 15.1 for sagit

 

以下是build的截圖

1 2 3 4 5