有没有办法检测用户在Android中重置Android系统时钟的时间?
我正在设计一个应用程序,它使用系统时间来确定用户何时在特定时间某个地点,并且我不想在此时依赖网络可用性.显然,知道用户何时更改系统时钟是很好的,因此他们不能"作弊".
mat*_*784 50
就在这里.的ACTION_TIME_CHANGED意图时,该设备的时间被改变为广播,并且可以具有检测到这种意图时将触发的方法.
这个意图自API级别1以来一直在Android中,因此它应该可以在您可能需要兼容的任何平台上运行.
您需要使用以下方法处理广播BroadcastReceiver:
public class TimeChangedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Do whatever you need to
}
}
Run Code Online (Sandbox Code Playgroud)
你还需要在你的Manifest中添加这样的东西:
<receiver android:name=".TimeChangedReceiver">
<intent-filter>
<action android:name="android.intent.action.TIME_SET" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
这将让Android知道在检测到此类意图时触发您的接收器.
看起来似乎不关心谁编辑时间,但是当您与网络同步时也不会触发自动调整.但是,如果您失去网络并重新获得它,那么这可能会因为您的时间略有不同(假设您正在使用自动网络时间)而触发.
然而,虽然手机上的时钟不是特别准确(因为它们通常依赖于与它们接收的时间信号同步),但根据我的经验,它们绝对不应该在绝对最大值下每小时损失超过30秒或一分钟,所以如果时间变化很小,你可以假设它是自动的.闰秒,当它们被添加时,也可能产生时间变化信息,尽管这些信息显然很小并且很少发生.
你可以ConnectivityManager用来跟踪手机是否有连接,你可以根据它改变行为(即只要有网络连接,时间是自动/网络时间,忽略时间变化等)但是我找不到关于丢失/重新获得网络连接的任何意图,因此您可能不得不使用轮询方法.
Opi*_*chs 20
对于matt5784的回答有点注意:我发现在Android 4.1.2上,意图动作不可用,不知道这是适用于所有Android版本还是只适用于我的版本.代替
"android.intent.action.ACTION_TIME_CHANGED"
Run Code Online (Sandbox Code Playgroud)
使用
"android.intent.action.TIME_SET"
Run Code Online (Sandbox Code Playgroud)
And*_*yld 14
System.currentTimeMillis()如果用户调整了时钟,系统时间()会改变,但是自启动(SystemClock.elapsedRealtime())之后经过的时间有希望不会.通过跟踪这两者之间的差异,可以检测用户对系统时钟的主要变化.
重要的是不要跟踪网络更新系统时钟可能导致的微小变化.我会假设,就我的目的而言,任何大约半小时的变化都无关紧要; 系统时间不应随着Locale国家的变化而变化,但也可能值得消除.
经过的实时显然会在启动时重置,所以我应该包括一个BroadcastReceiver在接收时重置差异android.intent.action.BOOT_COMPLETED.
我们可以同时使用TIME_SET和TIMEZONE_CHANGED。
<application
...>
<receiver android:name=".TimeChangedReceiver">
<intent-filter>
<action android:name="android.intent.action.TIME_SET"/>
<action android:name="android.intent.action.TIMEZONE_CHANGED"/>
</intent-filter>
</receiver>
</application>
Run Code Online (Sandbox Code Playgroud)
TimeChangedReceiver.java
public class TimeChangedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "time change " + intent.getAction(), Toast.LENGTH_SHORT).show();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26971 次 |
| 最近记录: |