pyjnius
pyjnius copied to clipboard
jnius.JavaException: Class not found b'android/os/Environment'
I'm a novice and trying to get an audio record function as an input in my android app for school project. I got an example audio record using pyjnius from github. But when I tried to run the code, I got this error :
Traceback (most recent call last):
File "f:\3_Recorder\main.py", line 9, in <module>
Environment = autoclass('android.os.Environment')
File "C:\Users\thosiba\Anaconda3\envs\Kivy\lib\site-packages\jnius\reflect.py", line 208, in autoclass
c = find_javaclass(clsname)
File "jnius\jnius_export_func.pxi", line 28, in jnius.find_javaclass
jnius.JavaException: Class not found b'android/os/Environment'
PS C:\Users\thosiba> Could anyone tell me why?
Here is the main.py scripts:
from jnius import autoclass
from kivy.app import App
from kivy.config import Config
from kivy.core.text import LabelBase
from kivy.logger import Logger
Environment = autoclass('android.os.Environment')
MediaRecorder = autoclass('android.media.MediaRecorder')
AudioSource = autoclass('android.media.MediaRecorder$AudioSource')
OutputFormat = autoclass('android.media.MediaRecorder$OutputFormat')
AudioEncoder = autoclass('android.media.MediaRecorder$AudioEncoder')
MediaPlayer = autoclass('android.media.MediaPlayer')
File = autoclass('java.io.File')
storage_path = (Environment.getExternalStorageDirectory()
.getAbsolutePath() + '/kivy_recording.3gp')
recorder = MediaRecorder()
player = MediaPlayer()
def init_recorder():
recorder.setAudioSource(AudioSource.MIC)
recorder.setOutputFormat(OutputFormat.THREE_GPP)
recorder.setAudioEncoder(AudioEncoder.AMR_NB)
recorder.setOutputFile(storage_path)
recorder.prepare()
def reset_player():
if (player.isPlaying()):
player.stop()
player.reset()
def restart_player():
reset_player()
try:
player.setDataSource(storage_path)
player.prepare()
player.start()
except:
player.reset()
class RecorderApp(App):
is_recording = False
def begin_end_recording(self):
if (self.is_recording):
recorder.stop()
recorder.reset()
self.is_recording = False
self.root.ids.begin_end_recording.text = \
('[font=Modern Pictograms][size=120]'
'e[/size][/font]\nBegin recording')
return
init_recorder()
recorder.start()
self.is_recording = True
self.root.ids.begin_end_recording.text = \
('[font=Modern Pictograms][size=120]'
'%[/size][/font]\nEnd recording')
def begin_playback(self):
restart_player()
def delete_file(self):
reset_player()
File(storage_path).delete()
if __name__ == '__main__':
Logger.info('App: storage path == "%s"' % storage_path)
Config.set('graphics', 'width', '600')
Config.set('graphics', 'height', '900')
LabelBase.register(name='Modern Pictograms',
fn_regular='modernpics.ttf')
RecorderApp().run()
And this is kivy script:
#:import C kivy.utils.get_color_from_hex
<GridLayout>:
cols: 2
spacing: 10
row_default_height:
(0.5 * (self.width - self.spacing[0]) -
self.padding[0])
row_force_default: True
<Button>:
background_normal: 'button_normal.png'
background_down: 'button_down.png'
font_size: 24
halign: 'center'
markup: True
GridLayout:
padding: 15
Button:
id: begin_end_recording
background_color: C('#3498db')
text:
('[font=Modern Pictograms][size=120]'
'e[/size][/font]\nBegin recording')
on_press: app.begin_end_recording()
GridLayout:
Button:
background_color: C('#2ecc71')
text: '[font=Modern Pictograms][size=80]M[/size][/font]'
Button:
background_color: C('#1abc9c')
text: '[font=Modern Pictograms][size=80]O[/size][/font]'
Button:
background_color: C('#27ae60')
text: '[font=Modern Pictograms][size=80]Q[/size][/font]'
Button:
background_color: C('#16a085')
text: '[font=Modern Pictograms][size=80]j[/size][/font]'
Button:
background_color: C('#95a5a6')
text: '[font=Modern Pictograms][size=120]P[/size][/font]\nPlayback'
on_press: app.begin_playback()
Button:
background_color: C('#e74c3c')
text: '[font=Modern Pictograms][size=120]X[/size][/font]\nDelete'
on_press: app.delete_file()
Thank you very much in advance for anyone who could help me about this problem
PS C:\Users\thosiba> Could anyone tell me why?
It looks like you are trying to instantiate an Android OS class on Windows. It does not exist there.
The code as written will only run on Android, another constraint in the code means it will only run on devices running less than Android 10.
This forum is for development issues. If you have usage questions please use the user groups. https://discord.gg/BE9tq8Kb https://groups.google.com/g/kivy-users
👋 We use the issue tracker exclusively for bug reports and feature requests. However, this issue appears to be a support request. Please use our support channels to get help with the project. Let us know if this comment was made in error, and we'll be happy to reopen the issue.