如何以编程方式设置设备时间
Posted
技术标签:
【中文标题】如何以编程方式设置设备时间【英文标题】:How to set time to device programmatically 【发布时间】:2013-07-30 03:50:25 【问题描述】:我创建了一个应用程序,将当前显示时间替换为服务器时间。我已经尝试了很多,但我没有找到解决方案。如何将其设置到我的设备?
我知道如何在我的 android 设备上获取服务器时间。是否可以实时进行,尤其是在 Android 上?
服务器时间在我的按钮单击事件中自动设置到我的设备。【问题讨论】:
只有系统应用程序可以更改您设备的日期和时间。您的应用程序无权更改您设备的日期时间。 ***.com/q/2918624/752320的可能重复 您不能以编程方式更改系统时间。 SET_TIME 是仅授予使用系统签名签名的应用程序的权限 【参考方案1】:试试这个:
你可以使用下一个命令:
adb shell date -s YYYYMMDD.HHmmss
例子:
adb shell date -s 20120423.130000
将日期设置为 2012 年 4 月 23 日星期一 13:00:00 IST
或者你也可以试试这个:
startActivity(new Intent(android.provider.Settings.ACTION_DATE_SETTINGS));
希望对你有帮助!!
【讨论】:
请注意,“adb”工具不能从设备到自身使用,至少除非您有不寻常的设备,或者已经在 USB 主机上使用 adb 将设备从 USB 切换到模式转换为 TCP 模式。虽然此处与 adb 一起使用的命令是 shell 命令,但应用程序代码无法以具有足够工作权限的用户身份运行它们。date
现在似乎采用了不同的参数:adb shell date MMDDhhmm[[CC]YY][.ss] set
将日期设置为给定时间。 adb shell date -h
显示完整的使用信息。【参考方案2】:
如果您拥有正确的权限(见下文),您可以使用AlarmManager
执行此操作。例如,要将时间设置为 2013/08/15 12:34:56,您可以这样做:
Calendar c = Calendar.getInstance();
c.set(2013, 8, 15, 12, 34, 56);
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
am.setTime(c.getTimeInMillis());
您需要SET_TIME
的权限才能执行此操作。不幸的是,这是signatureOrSystem
权限。
AndroidManifest.xml:中的定义
<!-- Allows applications to set the system time -->
<permission android:name="android.permission.SET_TIME"
android:protectionLevel="signature|system"
android:label="@string/permlab_setTime"
android:description="@string/permdesc_setTime" />
唯一可以使用此权限的应用是:
使用系统映像签名 安装到/system/
文件夹
除非您构建自定义 ROM,否则您对第一个 ROM 不走运。
第二个,这取决于你在做什么。
如果您正在构建一个广泛分发的应用程序(Google Play 等),您可能不应该这样做。它只是 root 用户的一个选项,您只能手动安装它。任何市场都不会将其安装到正确的位置。
如果您正在为自己构建一个应用程序(或者只是作为一个学习练习),那就去做吧。不过,您需要一部有根电话,所以请先这样做。然后,您可以使用ADB 或文件管理器将应用程序直接安装到/system/app/
。详情请参阅文章like this。
最后一点:SET_TIME
权限和AlarmManager#setTime()
是在 Android 2.2 (API 8
) 中添加的。如果您尝试在以前的版本上执行此操作,我不确定它是否会起作用。
编辑。 使用
<uses-permission> instead of <permission>
【讨论】:
我总是得到一个异常说:“java.lang.SecurityException:setTime:用户10041和当前进程都没有android.permission.SET_TIME。”我在我的清单中设置了权限:“android.permission.SET_TIME”。有人可以证实吗? @Geobits 它是作为系统应用安装的吗? 您将始终收到此安全异常,因为即使您在清单中请求了android.permission.SET_TIME
,系统不会授予您的应用此权限,除非它是系统应用 .基本上,简而言之,除非您有根电话或您自己的自定义 ROM,否则您无法在设备上设置时间。时期。故事结束。
@DavidWasser 使用 SET_TIME
权限的<permission>
定义。他没有说你应该使用那个声明。在我看来,您的编辑令人困惑,应该删除。无论如何,即使您使用<uses-permission>
,除非您的应用程序是系统应用程序,否则您仍然不会被授予该权限。我的意见不变。【参考方案3】:
简答:
如果您打算将您的应用放在应用商店中,或者将时间更新为服务器时间,则您不能这样做。
您需要SignatureOrSystem 权限才能更改时间 根据服务器的日期。
您可能必须root您的设备,然后实施更改。
这个thread 应该对你有很大帮助,更好地理解它。
【讨论】:
【参考方案4】:我已经做了两个星期完全一样的事情,现在我得到了一个有根设备的解决方案
-
获取服务器时间
<?php echo date("Ymd.His "); ?>
在你的 onClick 方法中
Process loProcess = Runtime.getRuntime().exec("su");
DataOutputStream loDataOutputStream = new DataOutputStream(loProcess.getOutputStream());
//loDataOutputStream.writeBytes("date -s 20120419.124012; \n");
loDataOutputStream.writeBytes("date -s" + theStringReturnedValue+ "; \n");
请注意,StringReturnedValue 必须具有这种格式 20150216.124012,这与 php 中返回的格式相同
【讨论】:
您没有提到这需要根设备和您的应用的根权限。你也没有关闭OutputStream
。以上是关于如何以编程方式设置设备时间的主要内容,如果未能解决你的问题,请参考以下文章