我目前正在尝试在软件中设置 Android 系统时间。是的,我知道很多人都尝试过——但像我现在一样失败了。 :-)
但我也知道可以在 ROOTED 手机上设置 Android 系统时间。我测试了一个名为 ClockSync 的应用程序,它确实可以做到这一点。
所以我想要了解如何在 ROOTED 设备上设置系统时间。请不要说不可能。 :-)
到目前为止,我尝试的是设置以下权限:
<uses-permission android:name="android.permission.SET_TIME_ZONE"/>
<uses-permission android:name="android.permission.SET_TIME"/>
然后在我的代码中:
AlarmManager a = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
long current_time_millies = System.currentTimeMillis();
try {
a.setTime((long)current_time_millies+10000);
} catch (Exception e) {
// Why is this exception thrown?
}
但我总是遇到以下异常:
java.lang.SecurityException: setTime: Neither user 10054 nor current process has android.permission.SET_TIME.
我正在使用 ClockSync 完美运行的同一台设备上对其进行测试。那么 - 我做错了什么?或者更好:你能提供经过测试的有效代码吗?
最佳答案
更新:此方法不再适用于最新的 Android 版本。我知道的唯一其他方法是使用 date 命令设置时间。请注意,命令格式可能因 Android 版本和安装的第三方工具而异(date 的 BusyBox 版本不支持时区)。
// Android 6 and later default date format is "MMDDhhmm[[CC]YY][.ss]", that's (2 digits each)
// month, day, hour (0-23), and minute. Optionally century, year, and second.
private static final SimpleDateFormat setDateFormat = new SimpleDateFormat("MMddHHmmyyyy.ss", Locale.US);
// Standard Android date format: yyyymmdd.[[[hh]mm]ss]
// http://stackoverflow.com/questions/5300999/set-the-date-from-a-shell-on-android
private static final SimpleDateFormat setDateFormat = new SimpleDateFormat("yyyyMMdd.HHmmss", Locale.US);
// BusyBox date format:
// [[[[[YY]YY]MM]DD]hh]mm[.ss]
// but recent versions also accept MMDDhhmm[[YY]YY][.ss]
private static final SimpleDateFormat bbSetDateFormat = new SimpleDateFormat("yyyyMMddHHmm.ss", Locale.US);
首先,我是 ClockSync 的开发者。我知道一些关于在 Android 上设置时间的知识。
恐怕Violet Giraffe 提供的答案是不正确的。问题是普通用户应用程序无法访问 SET_TIME 权限。此权限只能由作为 ROM 的一部分安装或使用与 ROM 本身相同的 key 签名的系统应用程序使用(取决于供应商)。使用这种方法的应用程序之一是 NTPc .它使用 AOSP key 签名,可以安装在基于 AOSP 的 Android ROM 上,例如 CyanogenMod。请注意,Google 最近已从 Market 禁止 AOSP key ,并且作者将永远无法更新他的应用程序。 NTPc 无法安装在大多数手机使用的常规 ROM 上。
如果您需要详细信息,请务必阅读著名的问题 4581 的评论:Allow user apps to set the system time .请注意,该问题已被 Google 拒绝,并附有以下评论:
Hi, it is by design that applications can not change the time. There are many subtle aspects of security that can rely on the current time, such as certificate expiration, license management, etc. We do not want to allow third party applications to globally disrupt the system in this way.
如何在 root 设备上设置时间:
什么ClockSync设置时间所做的是更改 /dev/alarm 设备的权限。本质上,它在根 shell 中运行 chmod 666/dev/alarm。一旦此设备对所有用户具有写入权限,SystemClock. setCurrentTimeMillis(...)调用会成功。一些应用程序使用另一种方法,它们在带有适当参数的根 shell 中运行 date 命令,但是它容易出错并且不太准确,因为 super 用户 shell 和命令执行可能需要几秒钟。此类应用的一个示例是 Sytrant .
默认情况下,ClockSync 仅在 /dev/alarm 尚未可写时设置 666 权限。这节省了 CPU/电池,因为 su/Superuser.apk 执行相对昂贵。如果你担心安全问题,有Restore Permission选项,设置时间后报警器权限为664。
为了更轻松地从应用程序访问 root shell,我使用了自己的帮助程序类:ShellInterface .另一种选择是使用 RootTools图书馆。
这里是基于 ShellInterface 的示例代码类:
public void setTime(long time) {
if (ShellInterface.isSuAvailable()) {
ShellInterface.runCommand("chmod 666 /dev/alarm");
SystemClock.setCurrentTimeMillis(time);
ShellInterface.runCommand("chmod 664 /dev/alarm");
}
}
请随时查看与设置时间相关的其他 Android 问题:
如果您需要应用程序中的精确时间而不使用 root 和更改系统时间,您可以拥有自己的计时器,例如基于 Joda Time .您可以使用来自 Apache commons-net 的 NTP 客户端从 NTP 服务器获取时间。图书馆。
关于android - 设置ROOTED手机的系统时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8739074/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r
其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时