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()
La même erreur se produit lors de l'utilisation d'une méthode différente de android.view.Window
:
CurrentActivity = autoclass('org.kivy.android.PythonActivity').mActivity
WindowManager = autoclass('android.view.WindowManager$LayoutParams')
CurrentActivity.getWindow().addFlags(WindowManager.FLAG_KEEP_SCREEN_ON)
Kivy 1.10.1
Python 3.6
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)
L'erreur signifie essentiellement que vous exécutez PyJNIus, et votre application, dans un Thread
non principal qui est le comportement par défaut pour Android, je crois. Corrige moi si je me trompe.
Imaginez-le comme une boucle principale Kivy qui interroge divers événements et ce que vous essayez de faire est comme sleep(1)
. Par défaut, vous gèleriez votre interface utilisateur dans Kivy à moins d'utiliser kivy.clock.Clock
, mais ce que fait Android, c'est qu'il ne vous permet pas de faire quelque chose comme ça. Vous devrez exécuter explicitement votre code sur le Thread
via java.lang.Runnable
et android.app.Activity.runOnUiThread
, par exemple comme cet exemple .
Ou, vous pouvez simplement importer le comportement du package android
dans android.runnable.run_on_ui_thread
, mais n'oubliez pas de l'ajouter également à vos exigences !
Commentaire le plus utile
L'erreur signifie essentiellement que vous exécutez PyJNIus, et votre application, dans un
Thread
non principal qui est le comportement par défaut pour Android, je crois. Corrige moi si je me trompe.Imaginez-le comme une boucle principale Kivy qui interroge divers événements et ce que vous essayez de faire est comme
sleep(1)
. Par défaut, vous gèleriez votre interface utilisateur dans Kivy à moins d'utiliserkivy.clock.Clock
, mais ce que fait Android, c'est qu'il ne vous permet pas de faire quelque chose comme ça. Vous devrez exécuter explicitement votre code sur leThread
viajava.lang.Runnable
etandroid.app.Activity.runOnUiThread
, par exemple comme cet exemple .Ou, vous pouvez simplement importer le comportement du package
android
dansandroid.runnable.run_on_ui_thread
, mais n'oubliez pas de l'ajouter également à vos exigences !