pyjnius icon indicating copy to clipboard operation
pyjnius copied to clipboard

jnius.JavaException: Class not found b'android/os/Environment'

Open Watha2 opened this issue 2 years ago • 1 comments

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

Watha2 avatar Jan 24 '22 06:01 Watha2

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

Android-for-Python avatar Feb 08 '22 00:02 Android-for-Python

👋 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.

github-actions[bot] avatar Oct 27 '23 03:10 github-actions[bot]