diff --git a/app/src/main/java/io/legado/app/base/BaseService.kt b/app/src/main/java/io/legado/app/base/BaseService.kt index b97bf219b..342cb566a 100644 --- a/app/src/main/java/io/legado/app/base/BaseService.kt +++ b/app/src/main/java/io/legado/app/base/BaseService.kt @@ -71,12 +71,15 @@ abstract class BaseService : LifecycleService() { } /** - * 检测通知权限 + * 检测通知权限和后台权限 */ private fun checkNotificationPermission() { PermissionsCompat.Builder() - .addPermissions(Permissions.POST_NOTIFICATIONS) - .rationale(R.string.notification_permission_rationale) + .addPermissions( + Permissions.POST_NOTIFICATIONS, + Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS + ) + .rationale(R.string.service_permission_rationale) .onGranted { if (lifecycleScope.isActive) { startForegroundNotification() diff --git a/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt b/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt index a20eb2bee..a937f28a7 100644 --- a/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt +++ b/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt @@ -1,5 +1,6 @@ package io.legado.app.lib.permission +import android.annotation.SuppressLint import android.content.Intent import android.net.Uri import android.os.Build @@ -24,6 +25,7 @@ class PermissionActivity : AppCompatActivity() { finish() } + @SuppressLint("BatteryLife") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val rationale = intent.getStringExtra(KEY_RATIONALE) @@ -72,6 +74,16 @@ class PermissionActivity : AppCompatActivity() { } } } + + Request.TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -> showSettingDialog( + permissions, rationale + ) { + kotlin.runCatching { + val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) + intent.setData(Uri.parse("package:$packageName")) + settingActivityResult.launch(intent) + } + } } onBackPressedDispatcher.addCallback(this) { diff --git a/app/src/main/java/io/legado/app/lib/permission/Permissions.kt b/app/src/main/java/io/legado/app/lib/permission/Permissions.kt index 873ddfdc3..4801b1dab 100644 --- a/app/src/main/java/io/legado/app/lib/permission/Permissions.kt +++ b/app/src/main/java/io/legado/app/lib/permission/Permissions.kt @@ -43,6 +43,9 @@ object Permissions { const val ACCESS_MEDIA_LOCATION = "android.permission.ACCESS_MEDIA_LOCATION" + const val REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = + "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" + object Group { val STORAGE = if (isManageExternalStorage()) { arrayOf(MANAGE_EXTERNAL_STORAGE) diff --git a/app/src/main/java/io/legado/app/lib/permission/Request.kt b/app/src/main/java/io/legado/app/lib/permission/Request.kt index b919b0333..036e4a712 100644 --- a/app/src/main/java/io/legado/app/lib/permission/Request.kt +++ b/app/src/main/java/io/legado/app/lib/permission/Request.kt @@ -9,6 +9,7 @@ import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat import io.legado.app.utils.startActivity import splitties.init.appCtx +import splitties.systemservices.powerManager @Suppress("MemberVisibilityCanBePrivate") internal class Request : OnRequestPermissionsResultCallback { @@ -73,6 +74,10 @@ internal class Request : OnRequestPermissionsResultCallback { } } else if (deniedPermissions.contains(Permissions.POST_NOTIFICATIONS)) { toNotificationSetting() + } else if (deniedPermissions.contains(Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + toIgnoreBatterySetting() + } } else if (deniedPermissions.size > 1) { appCtx.startActivity { putExtra(PermissionActivity.KEY_RATIONALE, rationale) @@ -98,6 +103,7 @@ internal class Request : OnRequestPermissionsResultCallback { deniedPermissionList.add(permission) } } + Permissions.MANAGE_EXTERNAL_STORAGE -> { if (Permissions.isManageExternalStorage()) { if (!Environment.isExternalStorageManager()) { @@ -105,6 +111,15 @@ internal class Request : OnRequestPermissionsResultCallback { } } } + + Permissions.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (!powerManager.isIgnoringBatteryOptimizations(appCtx.packageName)) { + deniedPermissionList.add(permission) + } + } + } + else -> { if ( ContextCompat.checkSelfPermission(appCtx, permission) @@ -165,6 +180,18 @@ internal class Request : OnRequestPermissionsResultCallback { } } + private fun toIgnoreBatterySetting() { + appCtx.startActivity { + putExtra(PermissionActivity.KEY_RATIONALE, rationale) + putExtra( + PermissionActivity.KEY_INPUT_REQUEST_TYPE, + TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS + ) + putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS_CODE, requestCode) + putExtra(PermissionActivity.KEY_INPUT_PERMISSIONS, deniedPermissions) + } + } + override fun onRequestPermissionsResult( permissions: Array, grantResults: IntArray @@ -196,5 +223,6 @@ internal class Request : OnRequestPermissionsResultCallback { const val TYPE_REQUEST_SETTING = 2 const val TYPE_MANAGE_ALL_FILES_ACCESS = 3 const val TYPE_REQUEST_NOTIFICATIONS = 4 + const val TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = 5 } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 645beb341..4dc07d870 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -538,7 +538,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { override fun onCleared() { super.onCleared() - if (BaseReadAloudService.pause) { + if (BaseReadAloudService.isRun && BaseReadAloudService.pause) { ReadAloud.stop(context) } } diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index d2c63102c..4b743553b 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1147,4 +1147,5 @@ 中/粗/细 继续滑动以加载下一章… 启用绘制优化 + 阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 28bebda8b..67f020594 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1150,4 +1150,5 @@ 中/粗/细 继续滑动以加载下一章… 启用绘制优化 + 阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 031b31456..326a7fac5 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1150,4 +1150,5 @@ 中/粗/细 继续滑动以加载下一章… 启用绘制优化 + 阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行 diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index fd4d35476..84e1c2375 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1146,4 +1146,5 @@ Còn 中/粗/细 继续滑动以加载下一章… 启用绘制优化 + 阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 8ab918b32..81a0219fe 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1147,4 +1147,5 @@ 中/粗/细 继续滑动以加载下一章… 启用绘制优化 + 阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 16f6373e9..8a507d76e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1149,4 +1149,5 @@ 中/粗/细 继续滑动以加载下一章… 启用绘制优化 + 阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index c571e020a..9e0135114 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1149,4 +1149,5 @@ 中/粗/细 继续滑动以加载下一章… 启用绘制优化 + 阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d9351d72c..777ff8bb0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1150,4 +1150,5 @@ N/B/L Keep swiping to load the next chapter… 启用绘制优化 + 阅读需要发送通知来显示朗读控制和下载进度、请求后台权限以保持服务正常运行