Android应用强制使用网络时间时区,禁止手动模式并拦截使用求完整示例
Android 检测自动时间/时区并限制应用使用完整实现
一、核心检测逻辑
先封装工具类判断系统是否开启自动时间与自动时区,这是功能的核心基础。
1. 系统设置检测工具类
创建SystemTimeChecker类,统一处理检测逻辑:
import android.content.Context import android.provider.Settings object SystemTimeChecker { // 检测自动时间是否开启 fun isAutoTimeEnabled(context: Context): Boolean { return try { Settings.Global.getInt(context.contentResolver, Settings.Global.AUTO_TIME) == 1 } catch (e: Settings.SettingNotFoundException) { false } } // 检测自动时区是否开启 fun isAutoTimeZoneEnabled(context: Context): Boolean { return try { Settings.Global.getInt(context.contentResolver, Settings.Global.AUTO_TIME_ZONE) == 1 } catch (e: Settings.SettingNotFoundException) { false } } // 综合校验:自动时间和时区都开启才算符合要求 fun isSystemTimeValid(context: Context): Boolean { return isAutoTimeEnabled(context) && isAutoTimeZoneEnabled(context) } }
二、弹窗提示与应用限制
当检测到手动模式时,弹出类似WhatsApp的提示,同时阻止用户进入应用主界面,引导前往系统设置开启自动模式。
1. 全局检测的BaseActivity
让所有业务页面继承这个基类,实现统一校验:
import android.app.AlertDialog import android.content.Intent import android.os.Bundle import android.provider.Settings import androidx.appcompat.app.AppCompatActivity abstract class BaseTimeValidActivity : AppCompatActivity() { private var timeCheckDialog: AlertDialog? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) checkSystemTimeValid() } override fun onResume() { super.onResume() checkSystemTimeValid() } private fun checkSystemTimeValid() { if (!SystemTimeChecker.isSystemTimeValid(this)) { showTimeInvalidDialog() } else { dismissTimeCheckDialog() } } private fun showTimeInvalidDialog() { if (timeCheckDialog?.isShowing == true) return timeCheckDialog = AlertDialog.Builder(this) .setTitle("日期不准确") .setMessage("为了正常使用应用,请开启自动日期和时间设置。") .setCancelable(false) // 禁止用户取消弹窗 .setPositiveButton("去设置") { _, _ -> // 跳转至系统日期时间设置页 startActivity(Intent(Settings.ACTION_DATE_SETTINGS)) } .create() timeCheckDialog?.show() } private fun dismissTimeCheckDialog() { timeCheckDialog?.takeIf { it.isShowing }?.dismiss() timeCheckDialog = null } override fun onDestroy() { super.onDestroy() dismissTimeCheckDialog() } }
2. 主页面继承基类
你的主Activity直接继承BaseTimeValidActivity即可:
class MainActivity : BaseTimeValidActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 你的主界面业务逻辑 } }
三、关键说明
- 权限无需额外声明:读取系统自动时间/时区设置属于默认允许的操作,不需要在Manifest中添加权限。
- 弹窗不可取消:设置
setCancelable(false)确保用户无法绕过提示直接使用应用,必须完成设置调整。 - onResume重检:在页面恢复时再次校验,保证用户从设置页返回后,应用能自动恢复正常使用。
- 兼容性:
AUTO_TIME和AUTO_TIME_ZONE是Android标准常量,适配绝大多数主流设备与ROM。
四、可选优化:Application启动时检测
如果需要在应用启动阶段就拦截,可以在自定义Application中实现:
import android.app.Application import android.content.Intent class MyApp : Application() { override fun onCreate() { super.onCreate() if (!SystemTimeChecker.isSystemTimeValid(this)) { val intent = Intent(Settings.ACTION_DATE_SETTINGS) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(intent) } } }
记得在Manifest中注册自定义Application:
<application android:name=".MyApp" ...> ... </application>
内容的提问来源于stack exchange,提问作者Abm
相关产品推荐
相关产品推荐

