我的应用程序应该在一段时间后(几小时或几天)进行一些更改,我想测试一下。
我尝试在单元测试中使用SystemClock.setCurrentTimeMillis()来模拟时间/日期的变化,但没有任何运气。
我在应用程序和测试应用程序的清单中声明了<uses-permission android:name="android.permission.WRITE_SETTINGS" />
,但没有改变任何内容。
目前,我正在模拟器上运行这些测试,如果这有任何区别......
编辑:在Nick的帮助下,还请求了SET_TIME权限:
<uses-permission android:name="android.permission.SET_TIME" />
但是现在,logcat显示:
WARN/PackageManager(59): Not granting permission android.permission.SET_TIME to package com.matthieu.tests (protectionLevel=3 flags=0xbe46)
另一个编辑:使用dtmilano的答案......
在我的测试中添加了此代码(使用正确的try / catch):
Runtime.getRuntime().exec("date \"$((10800 + $(date +%s)))\"").waitFor();
当我继续使用shell时,我可以毫无问题地运行该命令,并且我在模拟器中看到时间正在变化(我试图添加3个小时)。当我用我的代码运行测试时,时间根本不会改变......?
我在命令行上做的是:
date "$((10800 + $(date +%s)))"
我怀疑我需要在Runtime.exec中添加“adb shell”部分...
似乎这是在正确的道路上,但仍然无法让它运行。它也可能与尼克指出的一样,它需要是一个能够改变时间的系统过程......?
答案 0 :(得分:2)
如果您需要更改时区,请将android.permission.SET_TIME_ZONE添加到您的清单
然后从您的活动(或您需要它的任何地方......但您需要获取适当的上下文..)
Context context = getContext(); // or (Context) this, or whatever depending on where you are
AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mgr.setTimeZone(timezoneid); // replace timezoneid with the time zone you need e.g. "pacific/Auckland"
mgr.setTime(timeinmillis); // replace timeinmillis with the time you need in millis, probably from a Date or Calendar object... but watch the timezone in the calendar ;-)
重点是AlarmManager系统服务包含用于设置系统时间和时区的成员。
答案 1 :(得分:1)
http://developer.android.com/reference/android/Manifest.permission.html#SET_TIME
我在权限页面上搜索了“android权限”,找到了“时间”这个词。如果你已经过了api等级8,我会建议你请求这个许可。
更新:根据this链接,我认为无法从用户空间应用设置系统时间。出于测试目的,您可能需要手动更改模拟器上的时间。我找到的唯一其他选项需要构建和签署自己的Android版本。
答案 2 :(得分:1)
从您的主机(假设您使用的是Linux),您可以运行:
$ adb shell date $(date --date='2011-06-11 12:10:10' +%s.0)
主要是if是模拟器。用所需的值替换日期和时间。 您应该找到一种方法来将此更改与您的测试同步,或者您甚至可以使用Runtime.exec()从测试中运行它。