Pyjnius: 1.3.0 unterbricht die request_permission von Android

Erstellt am 22. Mai 2020  ·  23Kommentare  ·  Quelle: kivy/pyjnius

von einem Benutzer gemeldet (Matrix0206 auf Discord).

from android import request_permission, Permission

request_permissions([Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE])
05-22 20:08:20.301 10976 11090 I python  :  Traceback (most recent call last):
05-22 20:08:20.301 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/app/main.py", line 300, in <module>
05-22 20:08:20.301 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/kivy/app.py", line 949, in run
05-22 20:08:20.302 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/kivy/app.py", line 919, in _run_prepare
05-22 20:08:20.302 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/app/main.py", line 132, in build
05-22 20:08:20.302 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/kivy/uix/relativelayout.py", line 274, in __init__
05-22 20:08:20.303 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/kivy/uix/floatlayout.py", line 65, in __init__
05-22 20:08:20.303 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/kivy/uix/layout.py", line 76, in __init__
05-22 20:08:20.303 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/kivy/uix/widget.py", line 359, in __init__
05-22 20:08:20.304 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/kivy/uix/widget.py", line 463, in apply_class_lang_rules
05-22 20:08:20.304 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/kivy/lang/builder.py", line 539, in apply
05-22 20:08:20.304 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/kivy/lang/builder.py", line 661, in _apply_rule
05-22 20:08:20.304 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/kivy/lang/builder.py", line 661, in _apply_rule
05-22 20:08:20.305 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/kivy/lang/builder.py", line 657, in _apply_rule
05-22 20:08:20.305 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/app/screens/main_screen/home.py", line 36, in __init__
05-22 20:08:20.305 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/android/permissions.py", line 570, in request_permissions
05-22 20:08:20.305 10976 11090 I python  :    File "/run/media/matrix/New_Volume/Developments/kivy-music-player/.buildozer/android/platform/build-arm64-v8a/build/python-installs/music_player/android/permissions.py", line 513, in request_permissions
05-22 20:08:20.306 10976 11090 I python  :    File "jnius/jnius_export_class.pxi", line 1134, in jnius.jnius.JavaMultipleMethod.__call__
05-22 20:08:20.306 10976 11090 I python  :  jnius.jnius.JavaException: No methods matching your arguments, requested: (['android.permission.READ_EXTERNAL_STORAGE', 'android.permission.WRITE_EXTERNAL_STORAGE'],), available: []

während dies in 1.2.1 funktionierte.

Alle 23 Kommentare

hallo leute ich habe das gleiche problem, wie kann man es lösen? Ist es möglich, einen älteren Pyjnius im Buildozer-Build zu verwenden? Danke!

hallo leute ich habe das gleiche problem, wie kann man es lösen? Ist es möglich, einen älteren Pyjnius im Buildozer-Build zu verwenden? Danke!

Das Anheften der Version mit requirements = pyjnius==1.2.1,... sollte funktionieren.

Ich bin keine Kivy-Person, aber kann jemand einen Link zum relevanten Quellcode einfügen?

hallo leute ich habe das gleiche problem, wie kann man es lösen? Ist es möglich, einen älteren Pyjnius im Buildozer-Build zu verwenden? Danke!

Das Anheften der Version mit requirements = pyjnius==1.2.1,... sollte funktionieren.

danke, es hat tatsächlich funktioniert!

Während das Verknüpfen der Pyjnius-Version mit 1.2.1 dafür funktionieren könnte, hat v1.2.1 andere Einschränkungen, also sollte dies idealerweise in Zukunft angegangen werden ....

das wäre da https://github.com/kivy/python-for-android/blob/develop/pythonforandroid/recipes/android/src/android/permissions.py#L513 Entschuldigung, ich habe mir nicht die Zeit genommen, dies zu untersuchen überhaupt.

Dies wird erschwert, da wir nicht leicht erkennen können, wie der Name der Aktivitätsklasse lautet

Es sieht so aus, als ob python_activity.requestPermissions eine nicht statische Methode ist. Aber es wird aufgerufen, als ob es statisch wäre. Was aus irgendeinem Grund früher mit älteren Versionen von pyjnius funktionierte. Die Verwendung python_activity.mActivity.requestPermissions scheint stattdessen mit 1.3.0 zu funktionieren.

Es sieht also so aus, als wäre es stattdessen ein Fehler in der android -Bibliothek von p4a.

Gute Stelle. In der Tat; Wie in Java würde der Compiler das Aufrufen einer nicht statischen Methode für ein statisches Objekt nicht zulassen. @obfusk kannst du https://github.com/kivy/python-for-android/issues/2304 aktualisieren?

Ich denke, der Pyjnius-Fehler könnte auch klarer sein - dh der Name der Methode wurde nicht gefunden und in welchem ​​​​Objekt!

Ich bin ziemlich überrascht, dass das früher funktioniert hat. ~Welche Instanz wurde aufgerufen? Ein Nullzeiger? Oder eine tatsächliche Instanz der Klasse?~

Ich denke, der Pyjnius-Fehler könnte auch klarer sein - dh der Name der Methode wurde nicht gefunden und in welchem ​​​​Objekt!

:+1:

Ich denke, der Pyjnius-Fehler könnte auch klarer sein - dh der Name der Methode wurde nicht gefunden und in welchem ​​​​Objekt!

👍

PR gesendet - siehe Nr. 558.

Also die Zusammenfassung für alle, die dies in Zukunft lesen:

Der Patch wurde zusammengeführt

Noch nicht; aber genehmigt :)

Ich denke, diese FIXME s sind tatsächlich verwandt. Da __get__ j_self setzt, anstatt eine gebundene Methode zurückzugeben, und einfach self zurückgibt, wenn es für eine Klasse statt für eine Instanz aufgerufen wird, wird das Aufrufen einer nicht statischen Methode für eine Klasse Verwenden Sie die letzte Instanz, in der es aufgerufen wurde (falls vorhanden). Natürlich hätte das Aufrufen einer nichtstatischen Methode für eine Klasse niemals erlaubt werden dürfen (und ist es nicht mehr).

Ich denke, diese FIXME s sind tatsächlich verwandt. Da __get__ j_self setzt, anstatt eine gebundene Methode zurückzugeben, und einfach self zurückgibt, wenn es für eine Klasse statt für eine Instanz aufgerufen wird, wird das Aufrufen einer nicht statischen Methode für eine Klasse Verwenden Sie die letzte Instanz, in der es aufgerufen wurde (falls vorhanden). Natürlich hätte das Aufrufen einer nichtstatischen Methode für eine Klasse niemals erlaubt werden dürfen (und ist es nicht mehr).

Können Sie einen einfacheren Testfall zeigen, und dann machen wir ein neues Problem?

Können Sie einen einfacheren Testfall zeigen, und dann machen wir ein neues Problem?

Mit 1.2.1:

>>> from jnius import autoclass
>>> s = autoclass("java.lang.String")
>>> s.toString()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "jnius/jnius_export_class.pxi", line 755, in jnius.JavaMethod.__call__
  File "jnius/jnius_export_class.pxi", line 699, in jnius.JavaMethod.ensure_method
jnius.JavaException: Unable to find a None method!
classname: None, definition: ()Ljava/lang/String;
>>> s("foo").toString()
'foo'
>>> s.toString()
'foo'

Mit 1.3.0:

>>> from jnius import autoclass
>>> s = autoclass("java.lang.String")
>>> s("foo").toString()
'foo'
>>> s.toString()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "jnius/jnius_export_class.pxi", line 1134, in jnius.JavaMultipleMethod.__call__
jnius.JavaException: No methods matching your arguments, requested: (), available: []

Da der Aufruf einer nicht statischen Methode auf einer Klasse nicht mehr funktioniert, wurde das Problem bereits behoben.
Und jetzt verstehen wir die Ursache des Problems.
Ich glaube also nicht, dass wir eine neue Ausgabe brauchen.

Oder: Da niemand zu wissen scheint, wie dies in 1.3.0 behoben wurde, fügen wir einen Testfall hinzu, um eine zukünftige Regression zurück zum vorherigen Verhalten zu verhindern. Der Testfall kann im obigen Fall mit der Ausnahme rechnen.

Und können wir die FIXMEs dann entfernen?

Oder: Da niemand zu wissen scheint, wie dies in 1.3.0 behoben wurde, fügen wir einen Testfall hinzu, um eine zukünftige Regression zurück zum vorherigen Verhalten zu verhindern. Der Testfall kann im obigen Fall mit der Ausnahme rechnen.

Ich habe es jetzt tatsächlich kapiert. Und das Problem wurde nur teilweise behoben :sweat_smile :. Siehe Nr. 567

Und können wir die FIXMEs dann entfernen?

Noch nicht denke ich. Siehe #563.

Nur eine Anmerkung, ich habe meinen p4a-Zweig auf „Entwickeln“ geändert und hatte immer noch dieses Problem. Ich habe meinen .buildozer-Ordner gelöscht und neu erstellt, und der Zweig „develop“ wird ohne Verknüpfungsfehler nicht neu für mich erstellt (2020-12-13, 16:22 -0500) (BEARBEITEN: Entschuldigung, das war ein anderes Problem. Ich kann buildozer derzeit überhaupt nicht erfolgreich auf meinem System ausführen.)

Ich denke, der Weg, um dies in Client-Apps zu umgehen, besteht darin, den Pyjnius-Aufruf manuell durchzuführen, damit die Client-Codebasis auf den verschiedenen Versionen gleich gut funktioniert. Offensichtlich werden hier Releases dringend benötigt, die dies beheben.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen