refactor(activity): 重构 BaseActivity 权限管理和页面跳转功能

- 在 BaseActivity 中新增权限请求和页面跳转的通用方法
- 移除 InitActivity 中原有的相机权限请求相关代码
- 使用 BaseActivity 的通用权限请求方法替代原有实现
- 添加网络连接检测工具类 NetworkUtils
- 在 WiFi 设置页面返回后重新检查网络连接状态
- 优化按钮可见性控制逻辑
This commit is contained in:
2026-03-30 14:01:13 +08:00
parent 10d1f966da
commit 5c230e38c3
3 changed files with 103 additions and 38 deletions
@@ -1,6 +1,7 @@
package com.sw.dualscreen.activity package com.sw.dualscreen.activity
import android.content.Context import android.content.Context
import android.content.Intent
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.hardware.display.DisplayManager import android.hardware.display.DisplayManager
import android.os.Bundle import android.os.Bundle
@@ -182,4 +183,52 @@ abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
} }
return super.dispatchKeyEvent(event) return super.dispatchKeyEvent(event)
} }
private var permissionCallback: ((isGranted: Boolean) -> Unit)? = null
private var activityCallback: ((intent: Intent?) -> Unit)? = null
fun requestMultiplePermissions(
permissions: Array<String>,
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)
}
} }
@@ -4,22 +4,21 @@ import android.Manifest
import android.content.Intent import android.content.Intent
import android.os.CountDownTimer import android.os.CountDownTimer
import android.provider.Settings import android.provider.Settings
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.sw.dualscreen.GlobalData import com.sw.dualscreen.GlobalData
import com.sw.dualscreen.GlobalKey
import com.sw.dualscreen.databinding.ActivityInitBinding import com.sw.dualscreen.databinding.ActivityInitBinding
import com.sw.dualscreen.dialog.RemindDialog import com.sw.dualscreen.dialog.RemindDialog
import com.sw.dualscreen.ext.clickWithDebounce import com.sw.dualscreen.ext.clickWithDebounce
import com.sw.dualscreen.ext.invisible
import com.sw.dualscreen.ext.visible import com.sw.dualscreen.ext.visible
import com.sw.dualscreen.model.response.FoodVector import com.sw.dualscreen.model.response.FoodVector
import com.sw.dualscreen.objbox.Food import com.sw.dualscreen.objbox.Food
import com.sw.dualscreen.objbox.FoodModule import com.sw.dualscreen.objbox.FoodModule
import com.sw.dualscreen.objbox.ObjectBox import com.sw.dualscreen.objbox.ObjectBox
import com.sw.dualscreen.utils.L 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.BaseViewModel
import com.sw.dualscreen.viewmodel.UserViewModel import com.sw.dualscreen.viewmodel.UserViewModel
import com.sw.plate.utils.AppUtil import com.sw.plate.utils.AppUtil
@@ -33,27 +32,6 @@ class InitActivity : BaseActivity<ActivityInitBinding>() {
private val userViewModel by viewModels<UserViewModel>() private val userViewModel by viewModels<UserViewModel>()
private var pageNum = 1 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 { override fun getViewModel(): BaseViewModel {
return userViewModel return userViewModel
} }
@@ -152,6 +130,7 @@ class InitActivity : BaseActivity<ActivityInitBinding>() {
} }
private fun getCollectedFoodVector() { private fun getCollectedFoodVector() {
binding.okButton.invisible()
showWaitingDialog2("加载中……") showWaitingDialog2("加载中……")
lifecycleScope.launch { lifecycleScope.launch {
FoodModule.init(this@InitActivity) { FoodModule.init(this@InitActivity) {
@@ -173,30 +152,30 @@ class InitActivity : BaseActivity<ActivityInitBinding>() {
finish() finish()
} }
// 检查相机权限 private fun hasCameraPermission(): Boolean {
private fun checkCameraPermissionAndGo() { return ContextCompat.checkSelfPermission(
val hasCameraPermission = ContextCompat.checkSelfPermission(
this, this,
Manifest.permission.CAMERA Manifest.permission.CAMERA
) == android.content.pm.PackageManager.PERMISSION_GRANTED ) == android.content.pm.PackageManager.PERMISSION_GRANTED
}
if (hasCameraPermission) { // 检查相机权限
private fun checkCameraPermissionAndGo() {
val isGrantedCameraPermission = hasCameraPermission()
if (isGrantedCameraPermission) {
// 有权限,直接打开 MainActivity // 有权限,直接打开 MainActivity
goMainActivity() goMainActivity()
} else { } else {
// 无权限,请求相机权限 // 无权限,请求相机权限
requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA) requestPermission(Manifest.permission.CAMERA) { isGranted ->
checkCameraPermission(isGranted)
}
} }
} }
// 从设置页面返回后检查权限 // 从设置页面返回后检查权限
private fun checkCameraPermissionAfterSettings() { private fun checkCameraPermission(isGranted: Boolean) {
val hasCameraPermission = ContextCompat.checkSelfPermission( if (isGranted) {
this,
Manifest.permission.CAMERA
) == android.content.pm.PackageManager.PERMISSION_GRANTED
if (hasCameraPermission) {
// 权限已授予,打开 MainActivity // 权限已授予,打开 MainActivity
goMainActivity() goMainActivity()
} else { } else {
@@ -215,7 +194,11 @@ class InitActivity : BaseActivity<ActivityInitBinding>() {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = android.net.Uri.fromParts("package", packageName, null) data = android.net.Uri.fromParts("package", packageName, null)
} }
startSettingsLauncher.launch(intent) startActivity(intent) {
// 从设置页面返回,重新检查权限
val isGrantedCameraPermission = hasCameraPermission()
checkCameraPermission(isGrantedCameraPermission)
}
} }
).show() ).show()
} }
@@ -246,7 +229,16 @@ class InitActivity : BaseActivity<ActivityInitBinding>() {
context = context, context = context,
content = "网络连接异常,请检查WiFi连接状态后重试", content = "网络连接异常,请检查WiFi连接状态后重试",
confirmBlock = { 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() }).show()
} }
@@ -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)
}
}