我意识到这个问题出现在SO的其他地方,但是我已经尝试了我可以在网站上找到的所有解决方案,但仍然遇到困难。这些问题(以及他们的答案)也已经存在了几年,而不是评论旧问题,我认为我会在这里为其他人整合信息,并调查当时和现在之间Android的潜在相关变化。尽管如此,如果您认为此问题符合重复条件,请将其标记为。
编辑:正如我所说的那样,关于SO的其他答案并没有解决问题。我不知道如何评论每一个可能的解决方案"没有"为我工作"有助于帮助自己和他人解决问题,但如果是这样,那就这样吧。作为参考,有3人将这些问题标记为this question的潜在副本,因此我将这些非工作答案添加到下面的列表中。
我的应用程序有一些非常具体的需求,但为了简洁起见,我们假设我需要手动将系统时间和日期设置为固定值。下面我详细介绍了我在尝试实现这一目标方面取得的进展。
该应用程序的最低SDK版本为,目标为24.其他人发现他们需要将版本增加到此级别。
设备已植根,应用程序正在安装到/ system / app,以便我可以更改日期/时间。
有些人评论说应用程序设置时间是不可能的,但是看看像ClockSync这样的应用程序,情况似乎并非如此。我知道我的应用程序将无法在Play商店中使用。
应用程序必须在没有用户输入的情况下自动设置日期/时间,因此使用以下代码使用户设置它将无济于事;
startActivity(new Intent(android.provider.Settings.ACTION_DATE_SETTINGS));
我以两种方式为清单添加了设置时间权限,单独使用,然后一起使用。我还尝试添加关于删除maxSDKversion的部分。
<uses-permission android:name="android.permission.SET_TIME" tools:remove="android:maxSdkVersion" />
<permission android:name="android.permission.SET_TIME"
android:protectionLevel="signature|system"/>
我读过某些权限不仅需要清单条目,还需要用户接受并允许它们。但是,SET_TIME未列在这些中。无论如何我确实尝试过这样做,但是我的权限请求被自动拒绝而没有显示确认框,可能是因为它实际上并没有首先要求。
我用来尝试设置时间的代码如下:
try {
Calendar c = Calendar.getInstance();
c.set(2017, 11, 21, 12, 32, 30);
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
am.setTime(c.getTimeInMillis());
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
此失败时我在Toast中收到的错误是:
java.lang.securityexception: setTime: neither user 10051 nor current process has android.permission.SET_TIME
我在上面的编辑中引用的问题中尝试了两个解决方案,这两个解决方案都涉及运行代码来设置日期:
Runtime.getRuntime().exec("su && date -s 20171122.153720");}
这两个答案都没有做任何事情 - 时间不会改变,也不会抛出任何异常。另一个答案需要访问互联网,这超出了我的问题范围。
考虑到上述所有问题,是否有任何关键步骤我在进行此项工作时遗漏,或者代码中的任何表示问题的任何内容?
答案 0 :(得分:1)
如果您需要设置第二个,请使用以下格式:MMddhhmmyy.ss
如果您的时间很长,请使用以下方法:
SimpleDateFormat dateFormat = new SimpleDateFormat("MMddhhmmyy.ss");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeValue);
Date date = calendar.getTime();
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
String command = "date " + dateFormat.format(date) + "\n";
os.writeBytes(command);
os.flush();
os.writeBytes("exit\n");
os.flush();
process.waitFor();
答案 1 :(得分:0)
事实证明,答案确实位于引用的问题found here中。但是,Android 7(可能还有6个,我还没有测试过)设备的命令不同。我没有在那里发表评论的声誉,所以如果有人希望在这个问题上粘贴/引用这个答案,那么就去吧。
我使用的日期代码格式为MMddhhmmyy,而不是yyyyMMdd.hhmmss;这适用于Android 7.我还删除了附加的&#39; -s&#39;。我用来设置系统时间的完整工作代码如下。同样需要注意的是,这需要对设备进行生根,因此仅在我的某些场景中有用。
try {
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
String command = "date 1123104017\n";
// Log.e("command",command);
os.writeBytes(command);
os.flush();
os.writeBytes("exit\n");
os.flush();
process.waitFor();
} catch (InterruptedException e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
为清楚起见,我输入的日期是2017年11月23日上午10:40。