Android:如何检测用户是否更改了系统时间,而不运行固定的服务来检查时间

Android:如何检测用户是否更改了系统时间,而不运行固定的服务来检查时间,android,security,datetime,time,Android,Security,Datetime,Time,在我的应用程序中,我想让用户能够免费离线使用7天,但希望他在7天完成后在线连接,然后购买订阅。所以基本上,我想在安装7天后把他关起来。问题是用户可以很好地更改系统时间并欺骗应用程序。此外,我不能使用服务器作为权限,因为该应用程序也应该完全脱机工作,除了购买订阅的时间 我可以运行后台服务来跟踪任何系统时间更改,但我希望避免这样做。 是否有一个简单的解决方案,即使设备完全离线7天也能正常工作。使用远程时钟,甚至可以简单地从移动设备读取所需时间间隔内的服务器时间,并将这些数字用于应用程序的时钟。您可以

在我的应用程序中,我想让用户能够免费离线使用7天,但希望他在7天完成后在线连接,然后购买订阅。所以基本上,我想在安装7天后把他关起来。问题是用户可以很好地更改系统时间并欺骗应用程序。此外,我不能使用服务器作为权限,因为该应用程序也应该完全脱机工作,除了购买订阅的时间

我可以运行后台服务来跟踪任何系统时间更改,但我希望避免这样做。
是否有一个简单的解决方案,即使设备完全离线7天也能正常工作。

使用远程时钟,甚至可以简单地从移动设备读取所需时间间隔内的服务器时间,并将这些数字用于应用程序的时钟。

您可以将当前时间保存在共享首选项中,并在每次采样时进行比较。如果你得到一个较旧的样本,用户会将时间向后更改。

所以我计划这样解决这个问题,虽然这不是牢不可破的,但对大多数用户都有效

因此,在签署试用版时,我会获取网络时间,并将其作为开始时间存储在首选项中。接下来,在每个应用程序启动和应用程序恢复时,我读取当前时间并写入prefs。一旦pref的当前时间大于设备时间,我们将锁定应用程序。一旦不存在首选项,我们会要求用户按照@Zach的建议在线

为了使首选项编辑对根设备的人来说有点不方便,我将数据以加密形式存储在prefs中


这仍然不是牢不可破的,因为人们可以反编译apk并读取模糊代码来猜测算法和密钥,但我猜应用程序中的内容价值对于经历如此痛苦的人来说并没有那么高。

该解决方案的可能副本将起作用,但基本上我不想跟踪所有的时间变化发生在设备中。此外,如果设备是根设备,并且用户从命令行更改,或者用户在安全模式下更改系统时间,则可能不会收到意图。如果我错了,请纠正我根设备不安全。时期如果你不相信我的话,看看xposed。这是个糟糕的解决方案。用户可以清除应用程序数据并获得另一个免费7天…@vilpe89如果用户清除应用程序数据,他将必须联机(并从服务器获取开始日期)才能继续使用该应用程序。这对我来说似乎是个好主意。我并不是说它牢不可破,共享引用是不安全的,可以被操纵。尽管如此,这是一个简单的解决方案,适用于普通用户,但用户可以离线使用该应用程序,因此在哪里可以获得开始日期,所以这也行不通。程序无法检查用户是否已清除数据。这是一个很好的解决方案。显然,在脱机情况下,没有100%的安全保证。所以,需要为7天的试用设置注册,其中他需要在线,并且需要将帐户信息存储在服务器上,以便同一用户在卸载后不会安装。一旦注册成功,我们将开始时间以某种加密形式存储在preferences中(对于根设备),在每次应用的onResume上,我们更新最后一个检查点时间,一旦当前时间小于检查点时间,我们锁定应用。我们甚至要求他在清除缓存时连接。是的,这是一个很好的解决方案,这是一个人可以为这种用例做的第一件事。这里的问题是,尽管应用程序需要离线工作,用户唯一需要在线的时间是他需要购买订阅的时间。所以,用户不连接到internet是允许的情况