如何以编程方式设置设备时间

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 使用 @JaswantSingh 不理解您的编辑或评论。在答案中,该人(不是我)显示了SET_TIME 权限的&lt;permission&gt; 定义。他没有说你应该使用那个声明。在我看来,您的编辑令人困惑,应该删除。无论如何,即使您使用&lt;uses-permission&gt;,除非您的应用程序是系统应用程序,否则您仍然不会被授予该权限。我的意见不变。【参考方案3】:

简答:

如果您打算将您的应用放在应用商店中,或者将时间更新为服务器时间,则您不能这样做

您需要SignatureOrSystem 权限才能更改时间 根据服务器的日期。

您可能必须root您的设备,然后实施更改。

这个thread 应该对你有很大帮助,更好地理解它。

【讨论】:

【参考方案4】:

我已经做了两个星期完全一样的事情,现在我得到了一个有根设备的解决方案

    获取服务器时间

&lt;?php echo date("Ymd.His "); ?&gt;

    在你的 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

以上是关于如何以编程方式设置设备时间的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式检查设备是不是在 iOS 中设置振动模式?

如何在 iOS 8.0+ 中以编程方式打开设备设置应用程序而不是应用程序设置

如何以编程方式设置 UILabel 位置 iOS 7

如何在iOS 7中以编程方式设置设备方向?

ios icloud 在设备中以编程方式设置开/关

您如何以编程方式将图像设置为在每个设备上具有相同的相对大小和位置?