文章

Flutter 錄音應用中的權限請求問題

在開發 Flutter 錄音應用時,除了在 AndroidManifest.xml 中正確聲明必要權限外,還必須在程式執行期間動態請求權限,才能順利使用錄音功能。隨著 Android 系統版本的演進,各個版本對權限管理的要求也有所不同。本文將重點說明以下三個部分: 動態請求權限的重要性 Android 版本差異對權限請求的影響 完整範例程式碼的逐步解析 一、為什麼需要動態請求權限? 從 Android 6.0(API 23)開始,許多敏感權限(如錄音、存取檔案)必須在應用運行時向使用者動態請求。如果僅在 AndroidManifest.xml 中聲明權限,而不在程式碼中實際請求,則應用將無法使用這些功能。 常見的權限包括: 錄音權限 : RECORD_AUDIO 檔案存取權限 : Android 12 及以下: READ_EXTERNAL_STORAGE  和  WRITE_EXTERNAL_STORAGE Android 13+: READ_MEDIA_AUDIO (在 Flutter 的 permission_handler 套件中使用  Permission.audio  來請求) 前台服務權限(Android 14+) :例如  FOREGROUND_SERVICE_MICROPHONE ,用於需要前台服務的長時間錄音 二、Android 版本差異與權限請求 隨著 Android 版本的更新,權限管理也在發生變化: Android 6.0+(API 23) 需要動態請求  RECORD_AUDIO  權限。 Android 13+(API 33) 存取錄音檔案的權限由原本的  READ_EXTERNAL_STORAGE  轉換為  READ_MEDIA_AUDIO ,因此在 Flutter 中請求存取權限時應使用  Permission.audio 。 Android 14+(API 34) 如果應用採用前台服務錄音(例如長時間錄音),則可能需要額外的前台服務權限(如  FOREGROUND_SERVICE_MICROPHONE )來保證服務正常運作。 根據這些版本差異,我們需要在程式碼中根據當前設備的 Android 版本動態調整請求權限的...

AWS ECS + Fargate Spot:打造經濟實惠的定期任務執行方案

今天要跟各位分享一個超實用的 AWS 服務組合:ECS (Elastic Container Service) + Fargate Spot。這個組合特別適合執行定期任務,而且還能大幅降低成本。不論是數據處理、系統備份,還是定期報表生成,都非常適合! 為什麼選擇這個方案? 想像一下,如果你需要一個程式每三小時執行一次,每次只需要 2 分鐘,你會怎麼做?傳統做法可能是開一台 24 小時運作的伺服器,但這樣其實浪費了大量資源。而 ECS + Fargate Spot 方案的優勢在於: 按需使用:只在需要時才啟動容器 成本優勢:使用 Spot 機制可節省高達 70% 的費用 全託管:完全無需管理伺服器 完整建置步驟 步驟一:準備 Docker 映像 首先,我們需要把應用程式打包成 Docker 映像並上傳到 ECR: # 建立 ECR 倉庫 aws ecr create-repository --repository-name my-periodic-task # 登入 ECR aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012 .dkr.ecr.ap-northeast-1.amazonaws.com # 建立並推送映像 docker build -t my-periodic-task . docker tag my-periodic-task:latest 123456789012 .dkr.ecr.ap-northeast-1.amazonaws.com/my-periodic-task:latest docker push 123456789012 .dkr.ecr.ap-northeast-1.amazonaws.com/my-periodic-task:latest 步驟二:建立 ECS 集群 接下來,建立一個使用 Fargate Spot 的 ECS 集群: aws ecs create-cluster \ --cluster-name my-periodic-cluster \ --capacity-providers FARGATE_SPOT \...

如何創建並推送 Docker 映像檔至 AWS ECR

 今天我們來聊聊如何將 Docker 映像檔推送到 AWS 的 Elastic Container Registry (ECR) 前期準備 在開始之前,我們需要確保已完成以下準備: 安裝 AWS CLI :確保你的電腦上已安裝並配置好 AWS CLI。 安裝 Docker :確保 Docker 已安裝並正在運行。 創建 ECR 儲存庫 :你需要在 AWS 賬戶中創建一個 ECR 儲存庫。 發生的問題 在創建 ECR 儲存庫時,你可能會遇到以下錯誤訊息: not authorized to perform: ecr:CreateRepository 這表示當前的 AWS Identity and Access Management (IAM) 用戶或角色缺乏必要的權限。 如何解決權限問題 要解決這類問題,你需要更新 IAM 用戶或角色的權限。下面是詳細步驟: 更新 IAM 權限政策 : 我們需要為 IAM 用戶或角色添加一個政策,允許他們創建 ECR 儲存庫。你可以創建如下的新政策: json { "Version" : "2012-10-17" , "Statement" : [ { "Effect" : "Allow" , "Action" : [ "ecr:CreateRepository" , "ecr:DescribeRepositories" , "ecr:ListImages" , "ecr:DeleteRepository" , "ecr:DeleteRepositoryPolicy" , "ecr:DescribeImages" , "ecr:GetDownloadUrlForLayer" , "ecr:BatchGetImage" , "ecr:P...

Flutter開發疑難解析:Dart SDK損毀問題完整解決方案

在Flutter開發過程中,有時會遇到一些令人困擾的錯誤訊息。今天要和大家分享我遇到的一個案例,希望能幫助遇到相似問題的開發者。 問題描述 在開發過程中,我遇到了以下幾個錯誤: Flutter框架找不到: Copy ld: framework 'Flutter' not found clang: error: linker command failed with exit code 1 Xcode建置設定檔案缺失: Copy raise "#{generated_xcode_build_settings_path} must exist..." 最關鍵的錯誤提示: Copy Failed to start the Dart CLI isolate. Could not resolve DartDev snapshot or kernel. 原因分析 經過排查,發現問題的根源在於Dart SDK損毀。這可能是由於安裝過程中的意外中斷,或是系統更新導致的檔案不完整。 解決方案 解決方法其實很簡單,只需要: 找出現有的Dart SDK位置: bash Copy which dart 移除損毀的SDK: bash Copy rm -rf < dart安裝路徑 > 重新安裝Dart SDK: Mac用戶可使用Homebrew: bash Copy brew tap dart-lang/dart brew install dart 驗證安裝成功: bash Copy dart --version 心得分享 這個案例告訴我們,有時看似複雜的錯誤,解決方法可能很簡單。當遇到Flutter或Dart相關的問題時,不要忘記檢查SDK的完整性,這往往是問題的關鍵所在。

Chrome 擴充功能開發:解密 Content Security Policy 的安全限制

在開發 Chrome 擴充功能時,你可能會遇到一些看似莫名其妙的錯誤訊息,尤其是關於 Content Security Policy(CSP)的警告。今天,讓我們一起來了解這些安全限制,並學習如何正確處理它們! 問題場景 想像一下,你正在開發一個簡單的 Chrome 擴充功能,需要使用外部的 JavaScript lib。你可能會寫出這樣的程式碼: html Copy < script src = " https://cdnjs.cloudflare.com/some-library.js " > </ script > < button onclick = " doSomething ( ) " > 點擊我 </ button > 然後.......控制台就開始噴錯了... Copy Refused to load the script because it violates the Content Security Policy directive: "script-src 'self'" 什麼是 Content Security Policy? CSP 是一種安全機制,用來防止跨站腳本攻擊(XSS)和其他程式碼注入攻擊。在 Chrome 擴充功能中,CSP 預設採用嚴格的安全設定,主要限制包括: 只能載入擴充功能目錄內的腳本文件(script-src 'self') 不允許使用內嵌腳本(比如 onclick="...") 不允許直接從外部 CDN 載入資源 常見錯誤和解決方案 1. 外部腳本載入錯誤 ❌ 問題程式碼: html Copy < script src = " https://cdnjs.cloudflare.com/some-library.js " > </ script > ✅ 解決方案: 下載lib的文件到你的擴充功能目錄 使用相對路徑引用 html Copy < script src = " library.js " > </ script > 2. 內嵌腳本錯誤 ❌ 問題程式碼: ht...

使用 Serverless Framework 4 及其在 CI/CD 中的認證方式

 隨著 Serverless Framework 4 的推出,開發者需要進行身份驗證才能使用這個強大的工具。本文將介紹如何在 CI/CD 環境中設置並使用  SERVERLESS_ACCESS_KEY ,以便順利執行部署。 為何需要認證? Serverless Framework 4 要求用戶在使用框架的某些功能(如部署、函數管理等)之前進行登錄或提供授權金鑰。這一變更是為了保護用戶資源並增強服務的安全性。 設置 SERVERLESS_ACCESS_KEY 在 CI/CD 環境中,您需要配置  SERVERLESS_ACCESS_KEY  環境變量,以便無需手動登錄即可運行 Serverless 命令。以下是設置步驟: 1. 獲取 Access Key 首先,您需要登錄 Serverless Dashboard 並獲取您的 Access Key: 訪問  Serverless Dashboard 。 登錄到您的帳戶。 在組織設定中,找到並複製您的 Access Key。 2. 在 GitLab 中設置環境變量 接下來,您需要將  SERVERLESS_ACCESS_KEY  添加到 GitLab CI/CD 中: 登錄到您的 GitLab 項目。 點擊左側邊欄的  Settings 。 展開  CI/CD  部分。 在  Variables  下,點擊  Add Variable 。 輸入以下資訊: Key :  SERVERLESS_ACCESS_KEY Value : 您從 Serverless Dashboard 獲得的 Access Key。 可選:勾選  Protected ,以便該變量僅在受保護的分支中可用,或者勾選  Masked ,以隱藏值於作業日誌中。 點擊  Add Variable  以保存。 3. 在  .gitlab-ci.yml  中使用 Access Key 一旦設置完成,您可以在  .gitlab-ci.yml  文件中使用  SERVERLESS_ACCESS_KEY  變量。以下是一個範...

[ 讀書分享] 知識複利 - 斜槓的 IPOD 法則

圖片
 經過疫情的洗禮, 原本以爲根深蒂固的工作模式徹底被改變... 打開 Linkin 越來越多工作寫著 Remote or Hybrid 新聞也不斷報導著各大公司對於不願意回到辦公司的員工祭出懲處,但是成效不彰 舊金山的辦公大樓空租率越來越高.... 這些訊息不斷地提醒著我們,  以後的工作將不會被綁在某一個地方 當工作模式發生改變, 省去了通勤以及閒聊的時間.... 如果你擅長時間管理, 將會發現多出了不少的時間 我們可以好好利用時間來充實自己或是發展斜槓事業 這樣的安排可以讓自己的職涯和收入多元化, 分散風險, 同時也為自己的人生創造主動權 書中提到的IPOD 模型可以幫助我們發展斜槓的事業 Interest and Passion  興趣熱情 Professional  專業技能 Outcome to based solution 解決方案 Decent Value 相應價值 主要的思考方向是多元收入, 但不只是收入, 更重要的是開創我們的第二人生 斜槓的本質是保有熱情且能延伸應用的專業 斜槓並非一系之間: 創造價值, 讓議題成熟, 成為共識 你最喜歡的東西也許一開始不會讓你賺到錢,  但是在沒有賺錢的前提下, 你還能堅持做下去的東西也只有興趣熱情所在的地方 興趣不能當飯吃? 最重要的是透過不斷地練習,讓你成為這個領域的高手 只要你在這個領域可以幫助到別人, 他就可以去教別人, 進而變成服務方案 我們常常會懷疑說....我真的有能力或是夠資格教別人嗎? 每個領域都有不同階段的學習者, 只要是程度比別人好一點, 你就可以教別人 在教學的過程中, 你也會不斷地成長精進, 這樣才有辦法一直教別人 接著就可以想著有哪些人也有著相同的困擾, 他們有什麼痛點? 我們就可以反思自己的專業技能可以怎麼幫助他們? 將知識慢慢淬煉成可以幫助別人的解決方案 接著就可以轉換成 " 知識化產品 "