Pyjnius: 1.3.0 打破了 android 的 request_permission

创建于 2020-05-22  ·  23评论  ·  资料来源: kivy/pyjnius

由用户报告(Matrix0206 on 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: []

虽然这在 1.2.1 中有效。

所有23条评论

大家好,我也有同样的问题,请问怎么解决? 可以在 buildozer 构建中使用较旧的 pyjnius 吗? 谢谢!

大家好,我也有同样的问题,请问怎么解决? 可以在 buildozer 构建中使用较旧的 pyjnius 吗? 谢谢!

使用requirements = pyjnius==1.2.1,...固定版本应该可以工作。

我不是 Kivy 人,但有人可以粘贴相关源代码的链接吗?

大家好,我也有同样的问题,请问怎么解决? 可以在 buildozer 构建中使用较旧的 pyjnius 吗? 谢谢!

使用requirements = pyjnius==1.2.1,...固定版本应该可以工作。

谢谢,事实上它有效!

虽然将 Pyjnius 版本与 1.2.1 挂钩可能适用于此,但 v1.2.1 有其他限制,因此理想情况下应该在未来解决这个问题......

这很困难,因为我们无法轻易看到 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_微笑:。 见#567

那么我们可以删除 FIXME 吗?

我认为还没有。 见#563。

请注意,我将 p4a 分支更改为“开发”,但仍然存在此问题。 我擦除了我的 .buildozer 文件夹并重新构建,如果没有链接错误(2020-12-13、16:22 -0500),“开发”分支不会为我重新构建(编辑:抱歉,这是一个不同的问题。我现在似乎根本无法在我的系统上成功运行 buildozer。)

我认为在客户端应用程序中解决此问题的方法是手动进行 pyjnius 调用,因此客户端代码库在不同版本上同样可以正常工作。 显然,这里非常需要修复此问题的版本。

此页面是否有帮助?
0 / 5 - 0 等级