refactor(activity): 重构 BaseActivity 权限管理和页面跳转功能
- 在 BaseActivity 中新增权限请求和页面跳转的通用方法 - 移除 InitActivity 中原有的相机权限请求相关代码 - 使用 BaseActivity 的通用权限请求方法替代原有实现 - 添加网络连接检测工具类 NetworkUtils - 在 WiFi 设置页面返回后重新检查网络连接状态 - 优化按钮可见性控制逻辑
This commit is contained in:
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user