由用户报告(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 中有效。
大家好,我也有同样的问题,请问怎么解决? 可以在 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 调用,因此客户端代码库在不同版本上同样可以正常工作。 显然,这里非常需要修复此问题的版本。