印出 API 的 Log--OkHttp HttpLoggingInterceptor (Retrofit 適用)

介紹 以往為了檢查 API 呼叫的 Request 或 Response 是否正確,都是土法煉鋼式的自行加註 Log。後來改用 Retrofit 之後,發現要加 Log 變得好麻煩,這才發現原來有 HttpLoggingInterceptor 可以自動印 Log 。 Java Doc: HttpLoggingInterceptor How to log request and response body with Retrofit-Android? 👀 OkHttp 的 Interceptors 介面有許多實作的類別,可以針對 API 呼叫做很多不一樣的事情,有興趣的讀者可以多利用這個關鍵字下去尋找相關的資料,本篇文章就不贅述。 使用 1. add gradle dependency 1 implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0' 🚨 注意! 套件引用的版本,請以官方最新版本為準。 2. 新增 HttpLoggingInterceptor 到 OkHttpClient 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 private fun getOkHttpClient(): OkHttpClient { val loggingInterceptor: HttpLoggingInterceptor = HttpLoggingInterceptor().setLevel( if (BuildConfig.DEBUG) { // Debug 模式下才開啟 HttpLoggingInterceptor.Level.BODY } else { HttpLoggingInterceptor.Level.NONE } ) return OkHttpClient.Builder() .addInterceptor(loggingInterceptor) // ... .build() } 3. 正常呼叫 API Logcat 就會出現相關的 Log 囉 Level.NONE 什麼都不印 ...

March 14, 2024 · 2 min · 308 words · Daniel Huang

Android 開發|一鍵清除 App 資料,還原初始狀態的實作方法

問題說明 前陣子剛好海巡到 一則 iT 邦幫忙上的技術提問,大略找了一下資料,發現實作細節不難就順手回了一下。對方最後成功地完成他預期的需求,很高興能夠幫到對方的忙~ 提問問題如下: 📢 App 需要新增一個刪除帳號的功能,需求方期望按下刪除鈕後,App 能夠回到初始安裝的狀態。等同於用戶直接到手機系統設定的應用程式清單中,按下清除資料。 解決方案 Android 4.4 以後請用: ActivityManager.clearApplicationUserData() 根據文件的說明,呼叫 ActivityManager.clearApplicationUserData() 等同使用者於設定中按下清除資料。 Android API 19 以上可用。 內部 (Internal) 與外部 (External) 的應用程式私有資料都會被清除。 所有已取得的動態請求權限都會被撤銷。 1 2 val activityManager = application.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager activityManager.clearApplicationUserData() 📢 注意: 呼叫此方法後 App 會強制退出,使用者需要自行重新開啟 App。 Android 4.4 以前請用: Runtime.exec() 透過 Runtime 執行 ADB 指令 pm clear packageName。 1 Runtime.getRuntime().exec("pm clear ${applicationContext.packageName}") Reference: StackOverflow: Clear Application’s Data Programmatically 💡 延伸討論: 開發過程中完整清除 App 資料 有時候在開發或測試 App 的時候,也會需要還原 App 的初始狀態。 這時候可以改在 ADB 環境下,執行前述 Runtime 執行的清除指令。 ...

December 5, 2023 · 1 min · 113 words · Daniel Huang

Android 動態更改應用程式圖標 App Icon

一、問題描述 最近使用 Todoist 做任務管理時發現,App 內有提供自選圖標的功能,也就是動態更換 App 的 Launcher Icon。 Step 0 Step 1 Step 2 Step 3 按下按鈕啟用自選圖標功能。 原本 App 預設是紅色的 App Icon。 在 App 內設定指定的 Icon 後。 Launcher 上的 Todoist Icon 就真的換剛才所選的 App Icon 了! 另外一個 App DuckDuckGo 也有一樣的功能。不過操作流程上不太一樣。DuckDuckGo 不需要特別啟用自選圖標,但在每次更換 Icon 時,App 都會在設定完成後自動關閉,使用者必須自動重啟 App 才能繼續使用。 🚩 兩者使用體驗差異整理: Todoist: 首次使用必須啟用功能。 啟用功能後 App 會自行關閉,需要使用者自行重開 App。 重開後就可以使用自選圖標的功能,而且往後的更換行為 App 都不會再自動關閉。 DuckDuckGo: 不須特別啟用功能。 每次更換圖標都會自動關閉 App,使用者要自己重開。 ==如果想直接看怎麼做,可以跳到 三、解決方案。== 二、研究歷程 2-1 問題釐清 搜尋幾個關鍵字其實滿快就找到相關的解法了,基本上分成使用 AndroidManifest.xml 的 activity-alias 更換 App 進入點的參數,或是使用 App Shortcuts。 ...

November 23, 2023 · 7 min · 1349 words · Daniel Huang

Android UI 日期時間選擇 DatePicker

簡介 Android 原生提供的日期時間選擇 UI。 官方推薦使用 Material Design 的 API MaterialDatePicker (Dialog) 日期區間選擇 DateRangePicker Kotlin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import com.google.android.material.datepicker.MaterialDatePicker val datePicker = MaterialDatePicker.Builder.dateRangePicker() .setTitleText("選擇調查日期區間") .setSelection(Pair(startPeriod, endPeriod)) .build() datePicker.show(childFragmentManager, TAG_DATE_RANGE_PICKER) datePicker.addOnPositiveButtonClickListener { startPeriod = it.first endPeriod = it.second setTvStartAndEnd() } Java 1 2 3 4 5 6 7 8 9 10 11 12 import androidx.core.util.Pair; import com.google.android.material.datepicker.MaterialDatePicker; MaterialDatePicker<Pair<Long, Long>> dateRangePicker = MaterialDatePicker.Builder.dateRangePicker() .setTitleText(R.string.date_filter) .setSelection(Pair.create(startTime, endTime)) .build(); dateRangePicker.addOnPositiveButtonClickListener(selection -> mMainViewModel.setFilterPeriod(selection)); dateRangePicker.show(getChildFragmentManager(), TAG_DATE_PICKER); 使用 MaterialDatePicker.Builder.dateRangePicker 建立,可設定 UI 上的標題 (setTitleText()) 與預選的日期區間 (setSelection)。 dateRangePicker 是泛型 Pair<Long, Long>,Pair 中儲存的是開始日期與結束日期的 UNIX時間(milliseconds)。 ...

October 31, 2023 · 2 min · 425 words · Daniel Huang

Android BuildConfig 消失了?

問題 最近開新專案的時候,發現寫 BuildConfig 都沒有出現 prompt,後來才發現是新的專案要另外開設定。 什麼是 BuildConfig BuildConfig 是 Gradle 在編譯時期自動建立的類別,裡面包含目前建製版本的相關資訊,開發者也可以自行加入客製化的欄位資料。 為什麼會有這個問題? 根據 解決 Android Studio 中的 BuildConfig 找不到問題 與 Fixing the “Build Type contains custom BuildConfig fields, but the feature is disabled” error w/ buildConfigField的資訊,可以知道 Gradle 8.0.0 後的版本,預設 BuildConfig 是關閉的。 解法 在 module 的 build.gradle 中新增以下程式碼,在重新 build project 即可。 1 2 3 4 5 6 7 8 9 10 // (app) build.gradle android { // 略... buildFeatures { // 開啟 buildConfig true } }

June 30, 2023 · 1 min · 75 words · Daniel Huang