Pyjnius: 1.3.0 ломает android request_permission

Созданный на 22 мая 2020  ·  23Комментарии  ·  Источник: kivy/pyjnius

сообщил пользователь (Matrix0206 в разногласиях).

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

в то время как это работало в 1.2.1.

Все 23 Комментарий

привет ребята у меня такая же проблема как решить? можно ли использовать более старый pyjnius в сборке buildozer? Спасибо!

привет ребята у меня такая же проблема как решить? можно ли использовать более старый pyjnius в сборке buildozer? Спасибо!

Закрепление версии с помощью requirements = pyjnius==1.2.1,... должно работать.

Я не человек Kivy, но может ли кто-нибудь вставить ссылку на соответствующий исходный код?

привет ребята у меня такая же проблема как решить? можно ли использовать более старый pyjnius в сборке buildozer? Спасибо!

Закрепление версии с помощью requirements = pyjnius==1.2.1,... должно работать.

спасибо, действительно получилось!

В то время как привязка версии Pyjnius к 1.2.1 может работать для этого, версия 1.2.1 имеет другие ограничения, поэтому в идеале это следует решить в будущем....

это было бы там https://github.com/kivy/python-for-android/blob/develop/pythonforandroid/recipes/android/src/android/permissions.py#L513 извините, я не нашел время, чтобы исследовать это вообще.

Это сложно, так как мы не можем легко увидеть, что такое имя класса Activity.

я ожидаю, что это будет https://github.com/kivy/python-for-android/blob/develop/pythonforandroid/bootstraps/sdl2/build/src/main/java/org/kivy/android/PythonActivity.java# L42 , но это может быть эквивалентный класс в другом бутстрапе (https://github.com/kivy/python-for-android/tree/develop/pythonforandroid/bootstraps)

Похоже, python_activity.requestPermissions — это нестатический метод. Но он вызывается так, как если бы он был статичным. Который по какой-то причине работал со старыми версиями pyjnius. Вместо этого использование python_activity.mActivity.requestPermissions похоже работает с 1.3.0.

Так что похоже, что это ошибка в библиотеке p4a android .

Хорошее место. Конечно; как и в Java, вызов нестатического метода для статического объекта не разрешен компилятором. @obfusk , вы можете обновить https://github.com/kivy/python-for-android/issues/2304?

Я думаю, что ошибка Pyjnius также могла бы быть более ясной - т.е. имя метода не было найдено и в каком объекте!

Я довольно удивлен, что это работало. ~ В каком экземпляре он вызывался? Нулевой указатель? Или какой-то реальный экземпляр класса?~

Я думаю, что ошибка Pyjnius также могла бы быть более ясной - т.е. имя метода не было найдено и в каком объекте!

:+1:

Я думаю, что ошибка Pyjnius также могла бы быть более ясной - т.е. имя метода не было найдено и в каком объекте!

👍

PR отправлен - см. #558.

Итак, резюме для тех, кто будет читать это в будущем:

патч был объединен

Еще нет; но одобрили :)

Я думаю, что эти FIXME действительно связаны. Поскольку __get__ устанавливает j_self вместо возврата связанного метода и просто возвращает self при вызове в классе вместо экземпляра, вызов нестатического метода в классе будет использовать последний экземпляр, на котором он был вызван (если есть). Конечно, вызов нестатического метода в классе никогда не должен был быть разрешен (и больше не разрешен).

Я думаю, что эти FIXME действительно связаны. Поскольку __get__ устанавливает j_self вместо возврата связанного метода и просто возвращает self при вызове в классе вместо экземпляра, вызов нестатического метода в классе будет использовать последний экземпляр, на котором он был вызван (если есть). Конечно, вызов нестатического метода в классе никогда не должен был быть разрешен (и больше не разрешен).

Можете ли вы показать более простой тестовый пример, а затем мы делаем новую проблему?

Можете ли вы показать более простой тестовый пример, а затем мы делаем новую проблему?

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

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

Поскольку вызов нестатического метода для класса больше не работает, проблема уже решена.
И теперь мы понимаем причину проблемы.
Поэтому я не думаю, что нам нужен новый выпуск.

Или: поскольку никто, кажется, не знает, как это было исправлено в 1.3.0, мы добавляем тестовый пример, чтобы предотвратить регрессию к прежнему поведению в будущем. Тестовый пример может ожидать исключение в случае выше.

И можем ли мы тогда удалить FIXME?

Или: поскольку никто, кажется, не знает, как это было исправлено в 1.3.0, мы добавляем тестовый пример, чтобы предотвратить регрессию к прежнему поведению в будущем. Тестовый пример может ожидать исключение в случае выше.

Я действительно понял это сейчас. И проблема была устранена лишь частично :sweat_ smile: . См. № 567

И можем ли мы тогда удалить FIXME?

Думаю, еще нет. См. № 563.

Просто примечание: я изменил свою ветку p4a на «разработку», и эта проблема все еще была. Я стер свою папку .buildozer и пересобрал ее, и ветка «разработка» не будет собираться для меня без ошибок связывания (2020-12-13, 16:22 -0500) (EDIT: извините, это была другая проблема. Я пока не могу успешно запустить buildozer в моей системе.)

Я думаю, что способ обойти это в клиентских приложениях — вручную сделать вызов pyjnius, поэтому клиентская кодовая база будет одинаково хорошо работать в разных версиях. Очевидно, что релизы, исправляющие это, здесь крайне необходимы.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги