From 07f56acf27ea6e9590c08b3d2190f456d1380001 Mon Sep 17 00:00:00 2001 From: nk Date: Sun, 7 Jun 2026 14:42:00 +0300 Subject: [PATCH] =?UTF-8?q?fix(player):=20=D1=84=D0=BE=D0=BD=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=B3=D0=BB=D0=BE=D1=85=D0=BD=D0=B5=D1=82=20=E2=80=94?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=20=D1=83=D0=B2=D0=B5?= =?UTF-8?q?=D0=B4=D0=BE=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B9=20+=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B1=D0=B0=D1=82=D0=B0=D1=80=D0=B5=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit На OnePlus/ColorOS радио глохло в фоне даже с wake mode. Причины: POST_NOTIFICATIONS не выдан (медиа-уведомление не показывалось → foreground-сервис хрупкий) и приложение не в вайтлисте Doze. MainActivity на старте запрашивает POST_NOTIFICATIONS (13+), затем системный диалог REQUEST_IGNORE_BATTERY_OPTIMIZATIONS (один раз). v1.4 / versionCode 5 (clean-сборка). --- app/build.gradle.kts | 4 +- app/src/main/AndroidManifest.xml | 2 + app/src/main/java/com/radiola/MainActivity.kt | 42 +++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f73afa8..1db7806 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -15,8 +15,8 @@ android { applicationId = "com.radiola" minSdk = 26 targetSdk = 34 - versionCode = 4 - versionName = "1.3" + versionCode = 5 + versionName = "1.4" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e76813..e6377e0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,8 @@ + + = 33 && + checkSelfPermission(android.Manifest.permission.POST_NOTIFICATIONS) != + android.content.pm.PackageManager.PERMISSION_GRANTED + ) { + // После ответа (в колбэке) попросим про батарею — не два диалога разом. + notifPermLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS) + } else { + maybeRequestBatteryExemption() + } + } + + private fun maybeRequestBatteryExemption() { + val pm = getSystemService(Context.POWER_SERVICE) as android.os.PowerManager + if (pm.isIgnoringBatteryOptimizations(packageName)) return + // Спрашиваем один раз на установку, чтобы не надоедать. + val prefs = getSharedPreferences("radiola_prefs", MODE_PRIVATE) + if (prefs.getBoolean("battery_opt_asked", false)) return + prefs.edit().putBoolean("battery_opt_asked", true).apply() + runCatching { + startActivity( + Intent( + android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, + android.net.Uri.parse("package:$packageName") + ) + ) + } + } }