You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:50:23