Pyjnius: 1.3.0はAndroidのrequest_permissionを破ります

作成日 2020年05月22日  ·  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件

こんにちはみんな私は同じ問題を抱えています、それを解決する方法は? buildozerビルドで古いpyjniusを使用することは可能ですか? ありがとう!

こんにちはみんな私は同じ問題を抱えています、それを解決する方法は? buildozerビルドで古いpyjniusを使用することは可能ですか? ありがとう!

requirements = pyjnius==1.2.1,...を使用してバージョンを固定すると機能するはずです。

私はKivyの人ではありませんが、誰かが関連するソースコードへのリンクを貼り付けることはできますか?

こんにちはみんな私は同じ問題を抱えています、それを解決する方法は? buildozerビルドで古いpyjniusを使用することは可能ですか? ありがとう!

requirements = pyjnius==1.2.1,...を使用してバージョンを固定すると機能するはずです。

おかげで、実際にはうまくいきました!

Pyjniusバージョンを1.2.1にペグすることでこれが機能する可能性がありますが、v1.2.1には他の制限があるため、理想的にはこれに対処する必要があります。

https://github.com/kivy/python-for-android/blob/develop/pythonforandroid/recipes/android/src/android/permissions.py#L513申し訳ありませんが、これを調査するのに時間がかかりませんでしたまったく。

Activityクラス名が何であるかを簡単に確認できないため、困難になりました。

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フォルダーをワイプして再構築しましたが、「develop」ブランチはリンクエラーなしでは新しく構築されません(2020-12-13、16:22 -0500)(編集:申し訳ありませんが、これは別の問題でした。今のところ、私のシステムでbuildozerを正常に実行できないようです。)

クライアントアプリでこれを回避する方法は、手動でpyjnius呼び出しを行うことだと思います。そのため、クライアントコードベースはさまざまなバージョンで同じように機能します。 明らかに、これを修正するリリースがここで切実に必要とされています。

このページは役に立ちましたか?
0 / 5 - 0 評価