kivy / plyer

Plyer is a platform-independent Python wrapper for platform-dependent APIs
https://plyer.readthedocs.io
MIT License
1.61k stars 427 forks source link

audio don't work on android #644

Closed Krozark closed 2 years ago

Krozark commented 3 years ago

I'm using kivy and p4a both on develop branch

On android :

Code :

from plyer import audio
audio.start()

Error

08-19 00:58:09.046 11201 11231 I python  :    File "........./.buildozer/android/platform/build-armeabi-v7a/build/python-installs/KvTest/plyer/platforms/android/audio.py", line 31, in _start
08-19 00:58:09.046 11201 11231 I python  :    File "jnius/jnius_export_class.pxi", line 857, in jnius.jnius.JavaMethod.__call__
08-19 00:58:09.047 11201 11231 I python  :    File "jnius/jnius_export_class.pxi", line 954, in jnius.jnius.JavaMethod.call_method
08-19 00:58:09.047 11201 11231 I python  :    File "jnius/jnius_utils.pxi", line 91, in jnius.jnius.check_exception
08-19 00:58:09.048 11201 11231 I python  :  jnius.jnius.JavaException: JVM exception occurred: setAudioSource failed. java.lang.RuntimeException
08-19 00:58:09.048 11201 11231 I python  : Python for android ended.
Guhan-SenSam commented 2 years ago

You need to give proper permissions in order for the function call to work. In your buildozer.spec add RECORD_AUDIO to the permissions parameter

Watha2 commented 2 years ago

Hello, I'm new in Python and tried the example of audio code in this github, but it does not work. Have you solved this yet? because when I checked the buildozer.spec already had RECORD_AUDIO in it.

File "c:/Users/thosiba/Downloads/plyer-master/plyer-master/examples/audio/main.py", line 102, in AudioApp().run() File "C:\Users\thosiba\Anaconda3\envs\Kivymd\lib\site-packages\kivy\app.py", line 950, in run runTouchApp() File "C:\Users\thosiba\Anaconda3\envs\Kivymd\lib\site-packages\kivy\base.py", line 582, in runTouchApp EventLoop.mainloop() File "C:\Users\thosiba\Anaconda3\envs\Kivymd\lib\site-packages\kivy\base.py", line 347, in mainloop self.idle() File "C:\Users\thosiba\Anaconda3\envs\Kivymd\lib\site-packages\kivy\base.py", line 391, in idle self.dispatch_input() File "C:\Users\thosiba\Anaconda3\envs\Kivymd\lib\site-packages\kivy\base.py", line 342, in dispatch_input post_dispatch_input(*pop(0)) File "C:\Users\thosiba\Anaconda3\envs\Kivymd\lib\site-packages\kivy\base.py", line 308, in post_dispatch_input wid.dispatch('on_touch_up', me) File "kivy_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch File "C:\Users\thosiba\Anaconda3\envs\Kivymd\lib\site-packages\kivy\uix\behaviors\button.py", line 179, in on_touch_up self.dispatch('on_release') File "kivy_event.pyx", line 705, in kivy._event.EventDispatcher.dispatch File "kivy_event.pyx", line 1248, in kivy._event.EventObservers.dispatch File "kivy_event.pyx", line 1132, in kivy._event.EventObservers._dispatch File "C:\Users\thosiba\Anaconda3\envs\Kivymd\lib\site-packages\kivy\lang\builder.py", line 57, in custom_callback exec(kvlang.co_value, idmap) File "", line 22, in File "c:/Users/thosiba/Downloads/plyer-master/plyer-master/examples/audio/main.py", line 50, in start_recording self.audio.start() File "C:\Users\thosiba\Anaconda3\envs\Kivymd\lib\site-packages\plyer\facades\audio.py", line 65, in start self._start() File "C:\Users\thosiba\Anaconda3\envs\Kivymd\lib\site-packages\plyer\platforms\win\audio.py", line 329, in _start open_params = send_command( File "C:\Users\thosiba\Anaconda3\envs\Kivymd\lib\site-packages\plyer\platforms\win\audio.py", line 127, in send_command error_code = send_command_w( OSError: exception: access violation reading 0xFFFFFFFFFFFFFFFF PS C:\Users\thosiba>

Krozark commented 2 years ago

you need to ask the permition at runtime + compilation (in .spec)

Watha2 commented 2 years ago

Permission has already exists in .spec I'm sorry, since I'm a novice in Python, if you don't mind, could you tell me how to ask permission at runtime? How did you write the Python code for it?

Thank you

Krozark commented 2 years ago

in you .spec:

# (list) Permissions
android.permissions = RECORD_AUDIO

in your main.py file

if __name__ == "__main__":
 # ... some code
  if platform == "android":
      from android.permissions import request_permissions, Permission
      request_permissions([
          Permission.RECORD_AUDIO,
         # .... other permission
      ])
  # ... other code