Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 系统时钟冻结系统_Java_Android - Fatal编程技术网

Java 系统时钟冻结系统

Java 系统时钟冻结系统,java,android,Java,Android,在视图类中,我重写了onFinishInflate()以调用setupEventHandlers(),它定义了一些监听器。例如: setDate.setOnClickListener( new OnSingleClick() { @Override public void onSingleClick( final View v ) { controller.onSetDate(); } } } ); 在controller.onS

在视图类中,我重写了
onFinishInflate()
以调用
setupEventHandlers()
,它定义了一些监听器。例如:

setDate.setOnClickListener( new OnSingleClick() {
    @Override
    public void onSingleClick( final View v ) {
            controller.onSetDate();
        }
    }
} );
controller.onSetDate()
中,我有一个命令:

SystemClock.setCurrentTimeMillis(dateTime.getMillis());
dateTime
是一个
dateTime
对象)

调用此方法后,系统会冻结。听众停止了工作。当我单击附加的按钮时,什么也没有发生(在调试模式下也被选中-当单击按钮时,它不会进入侦听器)。 只有按下返回键(在android设备上)才能工作,然后系统会再次恢复正常(它会识别监听器)

为什么会这样

编辑:

我正在根设备上工作,所有权限都已设置

现在,我的代码如下所示:

AlarmManager alarm = (AlarmManager) MainApplication.getAppContext().getSystemService( Context.ALARM_SERVICE );
long time = dateTime.getMillis();
DateTimeZone zone = dateTime.getZone();
alarm.setTime( time );
alarm.setTimeZone( zone.toTimeZone().getID() );
TimeZone.setDefault( zone.toTimeZone() );
DateTimeZone.setDefault( zone );

只有当我尝试向后设置时间/日期时,问题才会出现。将其向前设置很好。

javadoc about
SystemClock.setCurrentTimeMillis
表明了这一点。快速查看代码显示,
SystemClock.setCurrentTimeMillis
最终调用了需要权限的程序:android.permission.SET\u TIME

您应该在清单中添加权限:

<uses-permission android:name="android.permission.SET_TIME"/>
评论您的评论:我不明白为什么运行
chmod 666/dev/alarm
会改变任何事情(除了这可能是为什么您的应用程序冻结而不是简单地返回
false

解决方案是:

设置日期/时间后重新充气视图:

dateAndTimeView = ( DateAndTimeSetupView ) View.inflate( DateAndTimeSetupController.this, R.layout.date_and_time_setup, null );
setContentView( dateAndTimeView );  

因为,我猜你的应用程序缺少这些权限。它没有。改变时间是有效的。在调用
SystemClock.setCurrentTimeMillis()
之前,我运行了
“chmod 666/dev/alarm”
,正如这个答案所指出的,无论清单中是否声明,第三方应用程序都无法使用该权限。如果不首先运行chmod,会发生什么情况,这确实是一个有趣的问题(这一步当然不可能在安全的消费设备上开始)。如果程序以更传统的方式失败,那么这个问题显然可以归咎于黑客入侵设备,允许不可行的程序流-除了权限之外,内部状态的许多方面只能与系统中的其他部分协调安全地修改。我从中获得了
chmod
方法。它是有效的。没有它,时间不会改变。@ben75顺便说一句,
permissionsettimegrated
给出了
false
值,尽管我在清单中有权限行,并且使用了
chmod 666
。2注意事项:1。时间变了,显然我有权限。2.我可以清楚地看到DDMS中的报警权限从
crw-rw-r-
更改为
crw-rw-rw-
应用
chmod 666
后,chmod方法不起作用-正如您的实验所示,在没有更广泛协调的情况下更改时间是不可行的。很可能你应该放弃这个项目(它无论如何都不会在最终用户的设备上工作),但至少你应该去寻找和研究AOSP资源中允许用户在不从网络派生的设备上设置时间的任何内容。时间变了,显然我有权限。。。不!这只意味着你找到了一种方法,可以在你的根设备上破解系统。看看你的日志。冻结时的输出是什么?
dateAndTimeView = ( DateAndTimeSetupView ) View.inflate( DateAndTimeSetupController.this, R.layout.date_and_time_setup, null );
setContentView( dateAndTimeView );