Jeremy Huang

Welcome to my blog

【Android】Kotlin Coroutines
Android

【Android】Kotlin Coroutines

從前在處理異步的時候,會需要自己開 thread 來進行操作。而在 Kotlin 裡則可以透過 Coroutines 來處理,可以簡單地理解成 Coroutines 是拿來取代 thread 的。根據 Android Developers 官網上所提及的, Coroutines 有輕量、減少記憶體洩漏、內建支援取消及整合 Jetpack 等好處。 引入 Coroutines 套件要在 Android 中使用 Coroutines ,首先先確定專案的 Gradle 版本是否高於 5.3 ,若是的話 Gradle 會自動幫我們處理掉;若版本低於 5.3 我們則需要先在 app 層級的 build.gradle 引入其套件: dependencies { implementation 'org.

【Android】讓Android 4.4支援TLSv1.3
Android

【Android】讓Android 4.4支援TLSv1.3

想不到吧,在2022年的這個時空竟然還有文章要寫關於Android 4.4的相關議題,現在 Android 都來到了 13 了。儘管在新裝置上 Android 4.4 已然銷聲匿跡,但打開家中那些白牌的機上盒,插在電視 USB 孔上的電視棒,還有許多裝置上面跑的是 Android 4.4 的版本。在當時的時空下,使用 Android 4.4 當然是沒有什麼問題的,但物換星移,來到了現在的時空,各大網站的安全性提升,原本的 SSL 也早已變成了 TLS,版本還來到了 1.3,若不針對 Android 4.4 加以處理,那麼則會因為不支援加密規格的問題,而衍生出許多連線失敗的狀況,最主要就是因為 Android 4.4

【Android】對Resources資源加密
Android

【Android】對Resources資源加密

有一個很神秘的需求,需要對專案內的圖檔進行加密,但又不能影響到專案的開發。於是在 Github 上發現了一個看似可用的解決方案,下面就來說說這是怎麼做到的。 原理在 Android Studio 當中,要透過 gradle 打包 apk 的時候,我們可以透過 addBuildListener 來監聽整個打包的過程。在 addBuildListener 這個 Listener 裡面,有幾個方法: settingsEvaluated()、 projectsLoaded()、projectsEvaluated()、 buildFinished() 。這邊我們專注在projectsEvaluated()、 buildFinished() 這兩個方法,其中projectsEvaluated() 會是在打包 apk 前執行的,而buildFinished() 則是會在打包完成後執行。因此我們可以利用這兩個方法,來對圖檔進行加密,在要打包成 apk 時,我們將圖檔們加密並放入 apk 中,等打包結束後,我們在把原檔還原回來。 至於 apk

【Android 】利用Ktor建立FileServer
Android

【Android 】利用Ktor建立FileServer

最近有個需求,需要利用WebView來播放本地端的檔案,看似簡單的需求,但卻會被Chromium給擋掉,原因是因為Chromium不允許直接讀取本地檔案。為了解決這件事情,讓WebView可以順利讀取到本地檔案,那就直接在App裏開啟一個HttpServer讓WebView透過HttpServer來讀取檔案。 找了很多套件,試了很多方式,最後才跟Ktor相見恨晚啊!Ktor是什麼呢?這是一個專門為Kotlin打造的網路相關套件,你可以透過Ktor來建立Server端或是Client端的程式。而且真的算是蠻簡單的,官方也提供了範例程式,基本上只需要小改一下就可以直些使用了。 引入套件// Ktor的核心包 implementation "io.ktor:ktor-server-core:2.0.1" // 供Ktor使用的引擎包,另外有Jetty, Tomcat, CIO可用 implementation "io.ktor:ktor-server-netty:2.0.1" // 用於印出Request及Response的log用 implementation "io.ktor:ktor-server-call-logging:2.0.1" // 用於支援PartialContent用 implementation "io.ktor:ktor-server-partial-content:

【Android】系統App靜默更新
Android

【Android】系統App靜默更新

純粹紀錄一下怕以後忘記,在開發系統App的時候,有時候會需要遠端更新App版本,這時候就可以發揮系統App的優勢,直接拿系統權限下Command把Apk蓋過去做升級的動作,下面勢力: String libs = "LD_LIBRARY_PATH=/vendor/lib:/system/lib "; String[] commands = new String[]{ libs + "mount -o rw,remount /", libs + "chmod 666 /system/app/{AppName}/{ApkName}.apk", libs + "rm /system/app/{AppName}/{ApkName}.apk", libs + "cp -rf " + {NewApkPath}/{ApkName}.apk /system/app/{AppName}/", libs + "chmod

【Android】各版本改動一覽
Android

【Android】各版本改動一覽

Google大哥每年都會對Android推出新的版本,一來感到興奮,不知道大哥又要端出什麼新玩意,但另一方面卻也感到害怕,不知道這次大哥又改動了什麼部分,要讓開發變得寸步難行(誤)。截至今日Android已經推進到第13個版本了,然版本破碎化的問題依舊存在,每開發一個新的App就要先問,需要支援的版本幅度,然後再看各個功能有沒有被拿掉,各種煩悶,所以這邊就來簡單整理一下各個版本間的變動及對開發者的影響。 Adnroid 12android:exported 它主要是設置Activity 是否可由其他應用的組件啟動, “true” 則表示可以,而“false”表示不可以。若為“false”,則Activity 只能由同一應用的組件或使用同一用戶ID 的不同應用啟動。當然不止是Activity, Service 和Receiver 也會有exported 的場景。一般情況下如果使用了intent-filter,則不能將exported 設置為“false”,不然在Activity 被調用時系統會拋出ActivityNotFoundException 異常。相反如果沒有intent-filter,那就不應該把Activity 的exported 設置為true ,這可能會在安全掃描時被定義為安全漏洞。而在Android 12 的平台上,也就是使用targetSdkVersion

【Flutter】iOS混搭Flutter
Flutter

【Flutter】iOS混搭Flutter

打從 Swift 出來之前(等等,明明是個 Android 工程師,怎麼跑來弄 Swift 呢?),就有許多的跨平台方案被提了出來,PhoneGap、Xamarin,等等的(完全暴露年紀),原先對這些方案都抱持著嗤之以鼻的態度,畢竟效能低落、開發成本也沒有比較低,對於雙平台還需各別處理一些東西,能省下的工其實也沒多少。直到最近碰上了 Flutter... 雖然說 Flutter 也不能解決所有跨平台的問題,但至少對於畫出雙平台一致的畫面,產生一樣的使用者經驗還是可以的,並且擁有豐富的套件庫,很多效果基本上不用自己硬寫,找一下套件修改一下就可以直接使用了。 這篇主要講的是如何把寫好的 Flutter 專案整合進 iOS 專案裡面,讓兩者可以交互使用,所以會先假設大家的環境都已配置完成,並有一個以可以執行的 Flutter 專案。那麼,就開始吧! #方案選擇根據 Flutter 官網,要將 Flutter 整合進 iOS 專案裡面有三種選擇

【JavaScript】實作前端錄音功能
JavaScript

【JavaScript】實作前端錄音功能

這次客戶有個需求需要做即時語音辨識,這個現在其實要做到很容易,像是 Google 、 Azure 都有提供相關的服務,而且整包 SDK 寫好給你,只要呼叫函式就可以使用了。但這次客戶要配合的語音辨識服務,僅提供 API 使用,沒有整包 SDK 可以用,而且僅支援 pcm-16,16kHz 格式的音訊,所以得自己從麥克風接音訊進來、轉檔、發送後端並取回資料。今天這篇就來講講要怎麼在前端透過 WebRTC 來取得麥克風音訊及處理的過程。 #取得麥克風音訊首先我們得先確定使用者用的瀏覽器有沒有支援 WebRTC ,若有才可以繼續進行後續動作,否則可能就得請使用者換個瀏覽器了。 if (navigator.mediaDevices) { console.log('getUserMedia supported.'); } else { console.log('getUserMedia not supported on your browser!'); }檢測瀏覽器是否支援

【.Net Core】將應用部署至Docker上
.Net Core

【.Net Core】將應用部署至Docker上

.Net Core的橫空出世,讓.Net擺脫以往只能在Windows系統上執行的情況,如今不論是Windows、Linux甚至是Mac上都可以執行,但當實際開發完成要進行部署後,才發現又是一個麻煩的開始,好加在他也支援部署到Docker上執行。 本文實作環境如下: Visual Studio Mac Version.Net Core 3.1Docker on Synology NAS#建立 Dockerfile在 Visual Studio 內對專案目錄點擊右鍵,選擇新增,會看到新增 Docker 支援。點選之後,IDE 會自動產出 Dockerfile 出來。 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base WORKDIR /app EXPOSE 80

【Android】 MVVM實作 - 使用ViewModel, LiveData, DataBinding
Android

【Android】 MVVM實作 - 使用ViewModel, LiveData, DataBinding

今天要利用Youbike場站資訊的OpenData來練習MVVM的架構,主要功能就是每30秒去抓一次資料然後顯示出來。這邊會拆分成幾個步驟來做,首先會先把資料的部分處理好,也就是Call API的部分;再來會實作LiveData及DataBinding的功能,那就來看看該怎麼做吧! 資料來源這次使用的是由台北市政府提供的「YouBike臺北市公共自行車即時資訊」 API名稱:YouBike臺北市公共自行車即時資訊 API網址:https://tcgbusfs.blob.core.windows.net/blobyoubike/YouBikeTP.json 引入套件由於會使用到KAPT(Kotlin的Annotation Processing),DataBinding,anko,recyclerView及lambda的寫法,所以需要對Gradle檔案做些修改。 KAPTapply plugin: 'kotlin-kapt' android { kapt { generateStubs = true } } dependencies { implementation 'androidx.activity:activity-ktx:1.1.0' }build.gradleDataBindingandroid { dataBinding { enabled true } } dependencies

【Android】 MVC, MVP, MVVM 到底是什麼 -  Android開發為例 ?
Android

【Android】 MVC, MVP, MVVM 到底是什麼 - Android開發為例 ?

從開始寫程式以來,雖然會自己把 Activity, Database 之類的用不同的資料夾來區分,也沒在管什麼MVC, MVP更不用講今天要提到的MVVM。但隨著Android Jetpack的推出,提供一些好用的方法來實現MVVM架構,這邊就來釐清一下到底什麼是MVC, MVP, MVVM。 設計架構MVC (Model / View / Controller)MVC架構中,把程式分成了三個層級: M:Model - 負責處理與資料相關的事情,包括取得資料、儲存資料等等。V:View - 如字面上所示,就是與介面相關的東西。C:Controller - 介於View及Model之間的橋樑,接收來自View的事件,去操控Model的資料。Android 中的 MVC在Android的世界中可以將Layout的XML視為View,data class視為Model,而Activity或Fragment則是Controller。 這樣的架構看似很完美,但其實執行起來有他的困難點,首先View上元件的操控通常會寫在Activity或Fragment當中,導致Activity或Fragment需同時負責View及Controller的事情,當介面越複雜、要處理的邏輯越多時,Activity或Fragment的程式碼就會變得又臭又長。 MVP (Model / View / Presenter)