Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:一种检测应用程序停止时用户是否更改系统时间的方法_Android_Time_Notifications - Fatal编程技术网

Android:一种检测应用程序停止时用户是否更改系统时间的方法

Android:一种检测应用程序停止时用户是否更改系统时间的方法,android,time,notifications,Android,Time,Notifications,我正在为某公司内部开发一个Android应用程序,它需要记录员工的工作时间。因此,系统时间的工作至关重要。我的应用程序迫切需要知道用户何时更改系统时间。大不了,你说,看看这个: 问题是,用户可能通过在更改时间之前强制停止应用程序来规避该解决方案。然后,应用程序将不会收到系统通知,这在此处进行了精彩的描述: 我不介意在下次启动应用程序时检查,但是我怎么可能知道用户是否更改了时间?我了解SystemClock.elapsedRealtime()。如果用户没有重新启动设备,我可以根据这些值的增量计算时

我正在为某公司内部开发一个Android应用程序,它需要记录员工的工作时间。因此,系统时间的工作至关重要。我的应用程序迫切需要知道用户何时更改系统时间。大不了,你说,看看这个:

问题是,用户可能通过在更改时间之前强制停止应用程序来规避该解决方案。然后,应用程序将不会收到系统通知,这在此处进行了精彩的描述:

我不介意在下次启动应用程序时检查,但是我怎么可能知道用户是否更改了时间?我了解SystemClock.elapsedRealtime()。如果用户没有重新启动设备,我可以根据这些值的增量计算时间偏移,但这是我不确定的。我的应用程序已订阅BOOT_COMPLETED事件,但在应用程序处于停止状态时也不会收到该事件


最重要的是,该公司的员工应该在没有网络接入的情况下工作,所以我不能依赖网络服务器。那么还有其他可能的方法吗?

大多数情况下,从第三方服务器获取时间是不可靠的,其中一些是付费服务

如果您想获得准确的时间,并用手机检查时间是否正确,无论采用何种方式,您都可以使用以下简单技巧获取实际时间

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");