Android:一种检测应用程序停止时用户是否更改系统时间的方法
我正在为某公司内部开发一个Android应用程序,它需要记录员工的工作时间。因此,系统时间的工作至关重要。我的应用程序迫切需要知道用户何时更改系统时间。大不了,你说,看看这个: 问题是,用户可能通过在更改时间之前强制停止应用程序来规避该解决方案。然后,应用程序将不会收到系统通知,这在此处进行了精彩的描述: 我不介意在下次启动应用程序时检查,但是我怎么可能知道用户是否更改了时间?我了解SystemClock.elapsedRealtime()。如果用户没有重新启动设备,我可以根据这些值的增量计算时间偏移,但这是我不确定的。我的应用程序已订阅BOOT_COMPLETED事件,但在应用程序处于停止状态时也不会收到该事件Android:一种检测应用程序停止时用户是否更改系统时间的方法,android,time,notifications,Android,Time,Notifications,我正在为某公司内部开发一个Android应用程序,它需要记录员工的工作时间。因此,系统时间的工作至关重要。我的应用程序迫切需要知道用户何时更改系统时间。大不了,你说,看看这个: 问题是,用户可能通过在更改时间之前强制停止应用程序来规避该解决方案。然后,应用程序将不会收到系统通知,这在此处进行了精彩的描述: 我不介意在下次启动应用程序时检查,但是我怎么可能知道用户是否更改了时间?我了解SystemClock.elapsedRealtime()。如果用户没有重新启动设备,我可以根据这些值的增量计算时
最重要的是,该公司的员工应该在没有网络接入的情况下工作,所以我不能依赖网络服务器。那么还有其他可能的方法吗?大多数情况下,从第三方服务器获取时间是不可靠的,其中一些是付费服务 如果您想获得准确的时间,并用手机检查时间是否正确,无论采用何种方式,您都可以使用以下简单技巧获取实际时间
private class GetActualTime extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
try {
HttpURLConnection urlConnection = null;
StringBuilder result = new StringBuilder();
try {
URL url = new URL(urls[0]);
urlConnection = (HttpURLConnection) url.openConnection();
int code = urlConnection.getResponseCode();
if (code == 200) {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = bufferedReader.readLine()) != null)
result.append(line);
in.close();
}
else {
return "error on fetching";
}
return result.toString();
} catch (MalformedURLException e) {
return "malformed URL";
} catch (IOException e) {
return "io exception";
} finally {
if (urlConnection != null) {urlConnection.disconnect();
}
}
} catch (Exception e) { return "null"; }
}
@Override
protected void onPostExecute(String time) {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat mdformat = new SimpleDateFormat("h:mm");
String times = mdformat.format(calendar.getTime());
try {
String areatime = time.substring(time.indexOf(String.valueOf(times)), time.indexOf(String.valueOf(times)) + 5).trim();
Toast.makeText(this, "The actual time is " + areatime, Toast.LENGTH_SHORT).show();
}
catch(IndexOutOfBoundsException e){
Toast.makeText(this, "Mobile time is not same as Internet time", Toast.LENGTH_SHORT).show();
}
}
}
}
所以这实际上是从谷歌那里得到的时间。这在我的项目中非常有效。为了检查系统时间是否错误,可以使用此技巧。你可以信任谷歌,而不是依赖时间服务器
由于它在检查时更加敏感,因此即使提前一分钟或延迟一分钟也会捕获异常。如果你想处理这个问题,你可以自定义代码。你有没有尝试过将服务与onStartCommand()中的START_STICKY结合使用,为时间变化的观察创造一个“不可改变”的环境?@Videndeta你能扩展一下你的建议吗?我无法想象该服务如何帮助对抗强制停止场景。即使在应用程序关闭后,服务也会运行。当然,您也可以通过TaskManager强制关闭服务,但是使用START\u STICKY属性,服务将再次被创建。@Videndeta我的问题与通过TaskManager强制关闭有关,否则广播接收器将仍然能够接收意图。在这种(强制关闭)情况下,开始粘性似乎不相关()。但是,即使它确实重新创建了该服务,我怎么知道系统时间在退出时是否发生了更改?可能是重复的,而不是对多个问题发布相同的答案,最好将问题标记为重复的(一旦你获得了足够的声誉)。更简单的方法
new GetActualTime().execute("https://www.google.com/search?q=time");