=MIN(IF(A1:A10<>0, A1:A10))
我的實用小技巧筆記本
如何設定,能在excel點選某一格時,自動將那格的行列都自動反白?
為何出現此錯誤訊息?Use the existing version catalog reference (libs.google.play.app.update) instead
📌 錯誤原因
你的 build.gradle.kts 檔案(Kotlin DSL)可能使用了 版本目錄(Version Catalogs),所以無法直接使用:
kotlinimplementation("com.google.android.play:app-update:2.1.0")
implementation("com.google.android.play:app-update-ktx:2.1.0")
🔹 Gradle 提示你應該使用 libs.google.play.app.update 這類的 版本目錄引用方式。
🛠 解決方案
🔹 方法 1:改用 libs 版本目錄
如果你的專案 已啟用 libs.versions.toml 來管理依賴,請改成:
kotlinimplementation(libs.google.play.app.update) implementation(libs.google.play.app.update.ktx)
✅ 這樣可以確保依賴是從 gradle/libs.versions.toml 管理的。
🔹 方法 2:手動新增 libs.versions.toml 設定
如果你沒有 libs.versions.toml,但希望使用版本目錄,可以這樣做:
-
打開
gradle/libs.versions.toml(如果沒有,請自行建立)。 -
新增 Play Core Library 的依賴:
toml[versions] google-play = "2.1.0" [libraries] google-play-app-update = { module = "com.google.android.play:app-update", version.ref = "google-play" } google-play-app-update-ktx = { module = "com.google.android.play:app-update-ktx", version.ref = "google-play" } -
然後在
build.gradle.kts使用:kotlinimplementation(libs.google.play.app.update) implementation(libs.google.play.app.update.ktx)
🔹 方法 3:關閉版本目錄,直接使用原本的 implementation
如果你不想使用 版本目錄,你可以手動關閉這個功能,在 settings.gradle.kts 移除:
kotlinenableFeaturePreview("VERSION_CATALOGS")
然後就可以直接使用:
kotlinimplementation("com.google.android.play:app-update:2.1.0")
implementation("com.google.android.play:app-update-ktx:2.1.0")
⚠ 注意:這樣做可能不符合 Gradle 的推薦設定,長遠來看不建議這樣處理。
🔹 結論
✅ 最佳做法:如果你的專案已經啟用了 libs.versions.toml,應該使用 方法 1 或 2。
⚠ 如果你想繼續使用傳統 implementation("xxx"),則可以 使用方法 3 來關閉版本目錄功能。
為何出現此錯誤訊息?Call requires API level 23 (current min is 21): android.app.AlarmManager#setAndAllowWhileIdle
你的 minSdkVersion 設定為 21 (Android 5.0 Lollipop),但 setAndAllowWhileIdle() 需要 API 23 (Android 6.0 Marshmallow),因此編譯時會報錯。
解決方法
1. 加入 API 檢查 (Build.VERSION.SDK_INT)
你可以加上條件判斷,讓 API 23 以上 使用 setAndAllowWhileIdle(),而 API 21-22 則使用 setExact():
kotlinif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23+
alarmManager.setAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
triggerTime,
pendingIntent
)
} else { // API 21-22
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
triggerTime,
pendingIntent
)
}
🔹 這樣可以確保 低於 API 23 的裝置仍然可以執行鬧鐘。
2. (可選) 提高 minSdkVersion 至 23
如果你的應用 不需要支援 Android 5 (Lollipop),可以直接在 build.gradle 修改 minSdkVersion:
gradleandroid { defaultConfig { minSdkVersion 23 // 提高最低版本至 Android 6.0 } }
🔹 這樣就可以直接使用 setAndAllowWhileIdle(),不需要額外的 API 檢查。
最佳解法
如果你 希望支援 API 21 (Android 5),又要在 API 23 以上降低耗電,建議這樣寫:
kotlinif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12+ 需要特別權限
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
if (!alarmManager.canScheduleExactAlarms()) {
val intent = Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM)
startActivity(intent)
}
}
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23+
alarmManager.setAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
triggerTime,
pendingIntent
)
} else { // API 21-22
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
triggerTime,
pendingIntent
)
}
🔹 這樣可以:
-
✅ API 21-22:使用
setExact(),保證準時執行 -
✅ API 23+:使用
setAndAllowWhileIdle(),允許低耗電模式 -
✅ API 31+ (Android 12+):自動請求
SCHEDULE_EXACT_ALARM權限
這樣你的鬧鐘就能在 各個 Android 版本 上正常運作 🎯
為何出現此錯誤訊息?Setting Exact alarms with setExact requires the SCHEDULE_EXACT_ALARM permission or power exemption from user; it is intended for applications where the user knowingly schedules actions to happen at a precise time such as alarms, clocks, calendars, etc. Check out the javadoc on this permission to make sure your use case is valid.
你的 setExact() 需要 SCHEDULE_EXACT_ALARM 權限,因為 Android 12 (API 31) 之後,精確鬧鐘 (Exact Alarm) 需要特別授權。你可以用以下方式解決這個錯誤。
解決方案
1. 在 AndroidManifest.xml 內加入 SCHEDULE_EXACT_ALARM 權限
在 AndroidManifest.xml 檔案內加入:
xml<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
🔹 這允許應用使用 精確鬧鐘,但 Android 12+ 仍需要使用者手動授權。
2. 確保使用者已授權 SCHEDULE_EXACT_ALARM
在 MainActivity 或 Application 啟動時檢查:
kotlinif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12+
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
if (!alarmManager.canScheduleExactAlarms()) {
val intent = Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM)
startActivity(intent)
}
}
🔹 這段程式碼會引導使用者進入 系統設定頁面,手動允許應用程式使用精確鬧鐘。
3. 使用 setAndAllowWhileIdle() 來替代 (Android 6+ 可用)
如果你的鬧鐘不需要 極度精準的時間,可以改用:
kotlinalarmManager.setAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent )
🔹 這樣就 不需要 SCHEDULE_EXACT_ALARM 權限,但 Android 6+ 進入 Doze 模式時,可能有誤差。
結論
| 方法 | 需要權限 | 進入 Doze 模式後可用 | 適用版本 |
|---|---|---|---|
setExact() | ✅ SCHEDULE_EXACT_ALARM | ❌ 可能不執行 | Android 5+ |
setAndAllowWhileIdle() | ❌ 不需要權限 | ✅ 允許低耗電模式 | Android 6+ |
setExactAndAllowWhileIdle() | ✅ SCHEDULE_EXACT_ALARM | ✅ 允許低耗電模式 | Android 6+ |
👉 建議方案:
-
如果你 需要超精準的鬧鐘 → 使用
setExact()+SCHEDULE_EXACT_ALARM並提示使用者授權 -
如果 允許些微時間誤差 → 直接使用
setAndAllowWhileIdle(),不需要額外權限 🎯
為何出現此錯誤訊息?No value passed for parameter 'appUpdateType'
這個錯誤是因為在使用 AppUpdateOptions 時,未正確傳遞 appUpdateType 參數。從你提供的錯誤信息來看,你在創建 AppUpdateOptions 時需要傳遞一個 appUpdateType。
在最新的 AppUpdateManager API 中,更新流程的構建需要明確指定更新類型。你應該在構建 AppUpdateOptions 時傳遞 appUpdateType 參數。
修正方案:
你應該像這樣設置 appUpdateType,使用 AppUpdateType.IMMEDIATE 或者 AppUpdateType.FLEXIBLE 來指定更新的類型。
修改後的代碼:
kotlinprivate fun handleAppUpdate(appUpdateInfo: AppUpdateInfo) {
val currentVersionCode = getCurrentAppVersionCode()
// 檢查更新狀態,並比較版本碼
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&
appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) &&
appUpdateInfo.availableVersionCode() > currentVersionCode
) {
try {
// 創建 AppUpdateOptions,並設置更新類型
val appUpdateOptions = AppUpdateOptions.newBuilder()
.setAppUpdateType(AppUpdateType.IMMEDIATE) // 設定即時更新
.build()
// 使用 AppUpdateOptions 配置來進行即時更新
appUpdateManager.startUpdateFlow(
appUpdateInfo, // 傳遞更新資訊
this, // 傳遞 Activity
appUpdateOptions // 傳遞 AppUpdateOptions
)
} catch (e: Exception) {
// 處理錯誤
Toast.makeText(this, "啟動更新時發生錯誤: ${e.message}", Toast.LENGTH_LONG).show()
}
}
}
主要更新:
-
appUpdateOptions現在明確設置了appUpdateType參數,這樣可以正確傳遞更新類型。
注意:
-
AppUpdateType.IMMEDIATE是即時更新,表示應用會強制更新並中斷當前操作。如果你希望使用彈性更新(即不強制要求用戶立刻更新),可以使用AppUpdateType.FLEXIBLE。
為何出現此錯誤訊息?Type mismatch: inferred type is Int but Activity was expected。Type mismatch: inferred type is MainActivity but AppUpdateOptions was expected
這兩個錯誤是由於 startUpdateFlow() 方法的參數類型不匹配引起的。下面我會針對這兩個錯誤進行修正。
錯誤 1: Type mismatch: inferred type is Int but Activity was expected
-
這個錯誤是由於傳遞的參數
AppUpdateType.IMMEDIATE應該是更新類型,而startUpdateFlow()需要傳遞一個Activity作為參數。通常這個錯誤會出現在startUpdateFlow()的方法調用中,你可能錯誤地傳遞了錯誤的類型。
錯誤 2: Type mismatch: inferred type is MainActivity but AppUpdateOptions was expected
-
第二個錯誤是由於
AppUpdateManager.startUpdateFlow()方法需要使用AppUpdateOptions,而不是傳遞Activity作為參數。這是因為新版的 API 使用AppUpdateOptions來處理更新的配置。
修改方案:
-
錯誤 1:確保你正確傳遞了
Activity類型,而不是錯誤的參數。 -
錯誤 2:需要創建
AppUpdateOptions來配置更新選項。
修正後的代碼:
kotlinprivate fun handleAppUpdate(appUpdateInfo: AppUpdateInfo) {
val currentVersionCode = getCurrentAppVersionCode()
// 檢查更新狀態,並比較版本碼
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&
appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) &&
appUpdateInfo.availableVersionCode() > currentVersionCode
) {
try {
// 創建 AppUpdateOptions 來配置更新選項
val appUpdateOptions = AppUpdateOptions.newBuilder()
.setAppUpdateType(AppUpdateType.IMMEDIATE) // 設定即時更新
.build()
// 使用 AppUpdateOptions 配置來進行即時更新
appUpdateManager.startUpdateFlow(
appUpdateInfo, // 傳遞更新資訊
this, // 傳遞 Activity
appUpdateOptions // 配置 AppUpdateOptions
)
} catch (e: Exception) {
// 處理錯誤
Toast.makeText(this, "啟動更新時發生錯誤: ${e.message}", Toast.LENGTH_LONG).show()
}
}
}
主要更改:
-
創建
AppUpdateOptions:-
我們使用
AppUpdateOptions.newBuilder()來構建更新配置,並設置更新類型(這裡使用IMMEDIATE即時更新)。
-
-
傳遞
AppUpdateOptions參數:-
在
startUpdateFlow()方法中,我們需要傳遞AppUpdateOptions作為一個參數,這樣可以正確啟動更新流程。
-
測試更新:
-
嘗試這樣的修改後,再次測試你的應用,看看是否能夠正確啟動更新流程。如果還有其他錯誤或疑問,請告訴我,我將幫助你進一步調整!
excel 最大值用max,取最小值但要排除0,要怎麼寫?
=MIN(IF(A1:A10<>0, A1:A10))
-
在 Excel 中,若你希望「點選某一格時,該格所在的整列與整欄都自動反白(例如變色)」,可以透過 條件格式 + VBA 來實現這個功能。以下是完整做法: ✅ 步驟一:打開 VBA 編輯器 按下 Alt + F11 開啟 VBA 編輯器。 在左側「工作簿名稱」下,雙擊你要設定...
-
縮網址賺錢實測評比:穩定出金的好選擇 縮網址服務不僅能將冗長的網址簡化,還能透過廣告收益為使用者創造額外收入。在用戶點擊短網址進入預定網頁的同時,廣告商會投放廣告,網站從中賺取廣告費,並回饋部分收益給縮網址用戶。 目前市面上提供縮網址服務的平台非常多,以下介紹幾個我長期使用且...
-
「網路賺錢」不靠挖礦!這個方法到底是真是假?實測告訴你! (適用於 Android / Windows / macOS) 這個「掛網就能賺錢」的方式,並不依賴挖礦,而且相當知名,網路上一搜尋就能找到許多相關介紹文章。 它的名字叫做 Honeygain( https://ww...