Pyjnius - 尝试访问 android.view.Window 方法时出现'Only the original thread that created a view hierarchy can



在过去的三个小时里,我一直在努力寻找解决方案。其他答案提到这样做的原因是因为代码是在一个单独的线程中执行的,这是有道理的,但作为一个不懂Java的人,再加上很少的pyjnius文档,我不知道如何将这里列出的类翻译为"pyjnius":Android;只有创建视图层次结构的原始线程才能接触其视图">

from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from jnius import autoclass
CurrentActivity  = autoclass('org.kivy.android.PythonActivity').mActivity
view = CurrentActivity.getWindow().getDecorView()
view.setKeepScreenOn(True)
class Root(RelativeLayout):
def __init__(self):
super().__init__()
class SomeApp(App):
def build(self):
return Root()
SomeApp().run()

使用不同的android.view.Window:方法时会出现相同的错误

CurrentActivity  = autoclass('org.kivy.android.PythonActivity').mActivity
WindowManager = autoclass('android.view.WindowManager$LayoutParams')
CurrentActivity.getWindow().addFlags(WindowManager.FLAG_KEEP_SCREEN_ON)

adb logcat python:的输出

12-15 16:48:21.692 18623 18646 I python  :  Traceback (most recent call last):
12-15 16:48:21.692 18623 18646 I python  : WARNING:kivy:stderr: Traceback (most recent call last):
12-15 16:48:21.693 18623 18646 I python  :    File "main.py", line 20, in <module>
12-15 16:48:21.693 18623 18646 I python  : WARNING:kivy:stderr:   File "main.py", line 20, in <module>
12-15 16:48:21.694 18623 18646 I python  :      view.setKeepScreenOn(True)
12-15 16:48:21.694 18623 18646 I python  : WARNING:kivy:stderr:     view.setKeepScreenOn(True)
12-15 16:48:21.695 18623 18646 I python  :    File "jnius/jnius_export_class.pxi", line 734, in jnius.JavaMethod.__call__ (jnius/jnius.c:25894)
12-15 16:48:21.695 18623 18646 I python  : WARNING:kivy:stderr:   File "jnius/jnius_export_class.pxi", line 734, in jnius.JavaMethod.__call__ (jnius/jnius.c:25894)
12-15 16:48:21.697 18623 18646 I python  :    File "jnius/jnius_export_class.pxi", line 828, in jnius.JavaMethod.call_method (jnius/jnius.c:27082)
12-15 16:48:21.697 18623 18646 I python  : WARNING:kivy:stderr:   File "jnius/jnius_export_class.pxi", line 828, in jnius.JavaMethod.call_method (jnius/jnius.c:27082)
12-15 16:48:21.698 18623 18646 I python  :    File "jnius/jnius_utils.pxi", line 93, in jnius.check_exception (jnius/jnius.c:4012)
12-15 16:48:21.698 18623 18646 I python  : WARNING:kivy:stderr:   File "jnius/jnius_utils.pxi", line 93, in jnius.check_exception (jnius/jnius.c:4012)
12-15 16:48:21.699 18623 18646 I python  :  jnius.JavaException: JVM exception occurred: Only the original thread that created a view hierarchy can touch its views.
12-15 16:48:21.699 18623 18646 I python  : WARNING:kivy:stderr: jnius.JavaException: JVM exception occurred: Only the original thread that created a view hierarchy can touch its views.
12-15 16:48:21.822 18623 18646 I python  : Python for android ended.
12-15 16:48:21.830 18623 18623 V SDL     : onWindowFocusChanged(): false
12-15 16:48:21.833 18623 18623 V PythonActivity: onPause()
12-15 16:48:21.833 18623 18623 V SDL     : onPause()
12-15 16:48:21.833 18623 18623 V SDL     : nativePause()
12-15 16:48:21.833 18623 18623 F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 18623 (ample.myaasdqpp)

您需要以下内容(未测试(:

from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from jnius import autoclass
from android.runnable import run_on_ui_thread

class Root(RelativeLayout):
def __init__(self):
super().__init__()
class SomeApp(App):
def build(self):
self.do_window_stuff()
return Root()
@run_on_ui_thread
def do_window_stuff(self):
CurrentActivity  = autoclass('org.kivy.android.PythonActivity').mActivity
view = CurrentActivity.getWindow().getDecorView()
view.setKeepScreenOn(True)
SomeApp().run()

如果你只想为你的应用程序永久设置这个,你也可以通过buildozer.spec或--wakelockp4a参数启用唤醒锁。

相关内容

最新更新