From 5c230e38c30f4b9705934610af21d6b4ffe81977 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Mon, 30 Mar 2026 14:01:13 +0800 Subject: [PATCH] =?UTF-8?q?refactor(activity):=20=E9=87=8D=E6=9E=84=20Base?= =?UTF-8?q?Activity=20=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86=E5=92=8C?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E8=B7=B3=E8=BD=AC=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 BaseActivity 中新增权限请求和页面跳转的通用方法 - 移除 InitActivity 中原有的相机权限请求相关代码 - 使用 BaseActivity 的通用权限请求方法替代原有实现 - 添加网络连接检测工具类 NetworkUtils - 在 WiFi 设置页面返回后重新检查网络连接状态 - 优化按钮可见性控制逻辑 --- .../sw/dualscreen/activity/BaseActivity.kt | 49 +++++++++++++ .../sw/dualscreen/activity/InitActivity.kt | 68 ++++++++----------- .../com/sw/dualscreen/utils/NetworkUtils.kt | 24 +++++++ 3 files changed, 103 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/com/sw/dualscreen/utils/NetworkUtils.kt diff --git a/app/src/main/java/com/sw/dualscreen/activity/BaseActivity.kt b/app/src/main/java/com/sw/dualscreen/activity/BaseActivity.kt index 89f6778..2b79a1d 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/BaseActivity.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/BaseActivity.kt @@ -1,6 +1,7 @@ package com.sw.dualscreen.activity import android.content.Context +import android.content.Intent import android.graphics.drawable.ColorDrawable import android.hardware.display.DisplayManager import android.os.Bundle @@ -182,4 +183,52 @@ abstract class BaseActivity : AppCompatActivity() { } return super.dispatchKeyEvent(event) } + + private var permissionCallback: ((isGranted: Boolean) -> Unit)? = null + private var activityCallback: ((intent: Intent?) -> Unit)? = null + + fun requestMultiplePermissions( + permissions: Array, + callback: (isGranted: Boolean) -> Unit + ) { + this.permissionCallback = callback + requestMultiplePermissionsLauncher.launch(permissions) + } + + fun requestPermission(permission: String, callback: (isGranted: Boolean) -> Unit) { + this.permissionCallback = callback + requestPermissionLauncher.launch(permission) + } + + val requestMultiplePermissionsLauncher = registerForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { permissions -> + var isGranted = true + permissions.entries.forEach { + if (!it.value) { + isGranted = false + } + } + permissionCallback?.invoke(isGranted) + } + + // 权限请求回调 + val requestPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted -> + permissionCallback?.invoke(isGranted) + } + + fun startActivity(intent: Intent, callback: (Intent?) -> Unit) { + this.activityCallback = callback + startActivityLauncher.launch(intent) + } + + // activity页面返回的回调 + private val startActivityLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { + activityCallback?.invoke(it.data) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/sw/dualscreen/activity/InitActivity.kt b/app/src/main/java/com/sw/dualscreen/activity/InitActivity.kt index edcbfad..b5bc433 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/InitActivity.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/InitActivity.kt @@ -4,22 +4,21 @@ import android.Manifest import android.content.Intent import android.os.CountDownTimer import android.provider.Settings -import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import com.sw.dualscreen.GlobalData -import com.sw.dualscreen.GlobalKey import com.sw.dualscreen.databinding.ActivityInitBinding import com.sw.dualscreen.dialog.RemindDialog import com.sw.dualscreen.ext.clickWithDebounce +import com.sw.dualscreen.ext.invisible import com.sw.dualscreen.ext.visible import com.sw.dualscreen.model.response.FoodVector import com.sw.dualscreen.objbox.Food import com.sw.dualscreen.objbox.FoodModule import com.sw.dualscreen.objbox.ObjectBox import com.sw.dualscreen.utils.L -import com.sw.dualscreen.utils.SPUtil +import com.sw.dualscreen.utils.NetworkUtils import com.sw.dualscreen.viewmodel.BaseViewModel import com.sw.dualscreen.viewmodel.UserViewModel import com.sw.plate.utils.AppUtil @@ -33,27 +32,6 @@ class InitActivity : BaseActivity() { private val userViewModel by viewModels() private var pageNum = 1 - // 相机权限请求回调 - private val requestCameraPermissionLauncher = registerForActivityResult( - ActivityResultContracts.RequestPermission() - ) { isGranted -> - if (isGranted) { - // 权限请求成功,打开 MainActivity - goMainActivity() - } else { - // 权限请求失败,显示弹窗 - showPermissionDeniedDialog() - } - } - - // 设置页面返回的回调 - private val startSettingsLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult() - ) { - // 从设置页面返回,重新检查权限 - checkCameraPermissionAfterSettings() - } - override fun getViewModel(): BaseViewModel { return userViewModel } @@ -152,6 +130,7 @@ class InitActivity : BaseActivity() { } private fun getCollectedFoodVector() { + binding.okButton.invisible() showWaitingDialog2("加载中……") lifecycleScope.launch { FoodModule.init(this@InitActivity) { @@ -173,30 +152,30 @@ class InitActivity : BaseActivity() { finish() } - // 检查相机权限 - private fun checkCameraPermissionAndGo() { - val hasCameraPermission = ContextCompat.checkSelfPermission( + private fun hasCameraPermission(): Boolean { + return ContextCompat.checkSelfPermission( this, Manifest.permission.CAMERA ) == android.content.pm.PackageManager.PERMISSION_GRANTED + } - if (hasCameraPermission) { + // 检查相机权限 + private fun checkCameraPermissionAndGo() { + val isGrantedCameraPermission = hasCameraPermission() + if (isGrantedCameraPermission) { // 有权限,直接打开 MainActivity goMainActivity() } else { // 无权限,请求相机权限 - requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA) + requestPermission(Manifest.permission.CAMERA) { isGranted -> + checkCameraPermission(isGranted) + } } } // 从设置页面返回后检查权限 - private fun checkCameraPermissionAfterSettings() { - val hasCameraPermission = ContextCompat.checkSelfPermission( - this, - Manifest.permission.CAMERA - ) == android.content.pm.PackageManager.PERMISSION_GRANTED - - if (hasCameraPermission) { + private fun checkCameraPermission(isGranted: Boolean) { + if (isGranted) { // 权限已授予,打开 MainActivity goMainActivity() } else { @@ -215,7 +194,11 @@ class InitActivity : BaseActivity() { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { data = android.net.Uri.fromParts("package", packageName, null) } - startSettingsLauncher.launch(intent) + startActivity(intent) { + // 从设置页面返回,重新检查权限 + val isGrantedCameraPermission = hasCameraPermission() + checkCameraPermission(isGrantedCameraPermission) + } } ).show() } @@ -246,7 +229,16 @@ class InitActivity : BaseActivity() { context = context, content = "网络连接异常,请检查WiFi连接状态后重试", confirmBlock = { - startActivity(Intent("android.settings.WIFI_SETTINGS")) + val intent = Intent("android.settings.WIFI_SETTINGS") + startActivity(intent) { + // 从设置页面返回,重新检查网络连接状态 + val isConnected = NetworkUtils.isNetworkConnected(this@InitActivity) + if (isConnected.not()) { + loadNetworkErrorDialog() + return@startActivity + } + getCollectedFoodVector() + } }).show() } diff --git a/app/src/main/java/com/sw/dualscreen/utils/NetworkUtils.kt b/app/src/main/java/com/sw/dualscreen/utils/NetworkUtils.kt new file mode 100644 index 0000000..4a49fb6 --- /dev/null +++ b/app/src/main/java/com/sw/dualscreen/utils/NetworkUtils.kt @@ -0,0 +1,24 @@ +package com.sw.dualscreen.utils + +import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities + +/** + * 网络连接检测工具类 + * 提供检测设备网络连接状态的功能 + */ +object NetworkUtils { + + /** + * 检测设备是否连接到网络 + * @param context 应用上下文 + * @return true 表示已连接网络,false 表示未连接 + */ + fun isNetworkConnected(context: Context): Boolean { + val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val network = connectivityManager.activeNetwork ?: return false + val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false + return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + } +}