Pyjnius: 1.3.0 rompt le request_permission d'android

Créé le 22 mai 2020  ·  23Commentaires  ·  Source: kivy/pyjnius

rapporté par un utilisateur (Matrix0206 sur 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: []

alors que cela fonctionnait en 1.2.1.

Tous les 23 commentaires

Salut les gars, j'ai le même problème, comment le résoudre? il est possible d'utiliser un ancien pyjnius dans buildozer build ? Merci!

Salut les gars, j'ai le même problème, comment le résoudre? il est possible d'utiliser un ancien pyjnius dans buildozer build ? Merci!

Épingler la version à l'aide requirements = pyjnius==1.2.1,... devrait fonctionner.

Je ne suis pas une personne de Kivy, mais quelqu'un peut-il coller un lien vers le code source pertinent ?

Salut les gars, j'ai le même problème, comment le résoudre? il est possible d'utiliser un ancien pyjnius dans buildozer build ? Merci!

Épingler la version à l'aide requirements = pyjnius==1.2.1,... devrait fonctionner.

merci, en fait ça a marché !

Bien que le rattachement de la version Pyjnius à 1.2.1 puisse fonctionner pour cela, la v1.2.1 a d'autres limitations, donc idéalement, cela devrait être résolu à l'avenir....

C'est rendu difficile car nous ne pouvons pas voir facilement quel est le nom de la classe d'activité

je m'attendrais à ce que ce soit https://github.com/kivy/python-for-android/blob/develop/pythonforandroid/bootstraps/sdl2/build/src/main/java/org/kivy/android/PythonActivity.java# L42 mais cela peut être la classe équivalente dans un autre bootstrap (https://github.com/kivy/python-for-android/tree/develop/pythonforandroid/bootstraps)

Il semble que python_activity.requestPermissions soit une méthode non statique. Mais il est appelé comme s'il était statique. Qui, pour une raison quelconque, fonctionnait avec les anciennes versions de pyjnius. L'utilisation python_activity.mActivity.requestPermissions la place semble fonctionner avec 1.3.0.

Il semble donc que ce soit un bogue dans la bibliothèque android de p4a à la place.

Bon endroit. En effet; comme en Java, appeler une méthode non statique sur un objet statique ne serait pas autorisé par le compilateur. @obfusk pouvez-vous mettre à jour https://github.com/kivy/python-for-android/issues/2304 ?

Je pense que l'erreur Pyjnius pourrait également être plus claire - c'est-à-dire que le nom de la méthode n'a pas été trouvé et dans quel objet!

Je suis plutôt surpris que cela fonctionnait avant. ~ Dans quelle instance était-il appelé ? Un pointeur nul ? Ou une instance réelle de la classe ? ~

Je pense que l'erreur Pyjnius pourrait également être plus claire - c'est-à-dire que le nom de la méthode n'a pas été trouvé et dans quel objet!

:+1:

Je pense que l'erreur Pyjnius pourrait également être plus claire - c'est-à-dire que le nom de la méthode n'a pas été trouvé et dans quel objet!

👍

PR envoyé - voir #558.

Donc, le résumé pour tous ceux qui liront ceci à l'avenir:

le patch a été fusionné

Pas encore; mais c'est validé :)

Je pense que ces FIXME sont en effet liés. Étant donné que __get__ définit le j_self au lieu de renvoyer une méthode liée et renvoie simplement self lorsqu'il est appelé sur une classe au lieu d'une instance, appeler une méthode non statique sur une classe utilisez la dernière instance sur laquelle il a été appelé (le cas échéant). Bien sûr, appeler une méthode non statique sur une classe n'aurait jamais dû être autorisé (et ne l'est plus).

Je pense que ces FIXME sont en effet liés. Étant donné que __get__ définit le j_self au lieu de renvoyer une méthode liée et renvoie simplement self lorsqu'il est appelé sur une classe au lieu d'une instance, appeler une méthode non statique sur une classe utilisez la dernière instance sur laquelle il a été appelé (le cas échéant). Bien sûr, appeler une méthode non statique sur une classe n'aurait jamais dû être autorisé (et ne l'est plus).

Pouvez-vous montrer un cas de test plus simple, puis nous créerons un nouveau problème ?

Pouvez-vous montrer un cas de test plus simple, puis nous créerons un nouveau problème ?

Avec 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'

Avec 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: []

Étant donné que l'appel d'une méthode non statique sur une classe ne fonctionne plus, le problème a déjà été résolu.
Et maintenant nous comprenons la cause du problème.
Je ne pense donc pas que nous ayons besoin d'un nouveau numéro.

Ou : comme personne ne semble savoir comment cela a été corrigé dans la version 1.3.0, nous ajoutons un cas de test pour empêcher une future régression vers le comportement précédent. Le cas de test peut s'attendre à l'exception dans le cas ci-dessus.

Et pouvons-nous alors retirer les FIXME ?

Ou : comme personne ne semble savoir comment cela a été corrigé dans la version 1.3.0, nous ajoutons un cas de test pour empêcher une future régression vers le comportement précédent. Le cas de test peut s'attendre à l'exception dans le cas ci-dessus.

Je l'ai compris maintenant. Et le problème n'a été que partiellement résolu :sweat_ smile:. Voir #567

Et pouvons-nous alors retirer les FIXME ?

Pas encore je pense. Voir #563.

Juste une note, j'ai changé ma branche p4a en "développer" et j'avais toujours ce problème. J'ai effacé mon dossier .buildozer et reconstruit, et la branche "développer" ne se construira pas pour moi sans erreurs de liaison (2020-12-13, 16:22 -0500) (EDIT : désolé, c'était un problème différent. Je n'arrive pas à exécuter buildozer avec succès sur mon système, du tout, pour l'instant.)

Je pense que la solution pour contourner ce problème dans les applications clientes consiste à effectuer manuellement l'appel pyjnius, de sorte que la base de code client fonctionnera aussi bien sur les différentes versions. De toute évidence, des versions qui résolvent ce problème sont indispensables ici.

Cette page vous a été utile?
0 / 5 - 0 notes