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) + } +}