Jeremy Huang

Welcome to my blog

【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】系統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)