Francesco Galgani
Francesco Galgani

Reputation: 6249

Codename One - Play a sound

The following code works fine in the Simulator, I hear the audio:

    try {
        Media m = MediaManager.createMedia((Display.getInstance().getResourceAsStream(getClass(), "/notification_sound_bell.mp3")), "audio/mpeg");
        m.play();
    } catch (IOException err) {
        Log.e(err);
    }

But it doesn't work at all on real Android devices. What's wrong? On the generated apk, the "notification_sound_bell.mp3" file is placed in /res/raw folder.

On an Android 4.x device I get:

[EDT] 0:0:0,118 - Codename One revisions: 3b20edadec808867afc2b19774268b66890616ad

[EDT] 0:0:0,129 - Exception: java.lang.NullPointerException - null java.lang.NullPointerException at com.codename1.impl.android.AndroidImplementation.createMedia(AndroidImplementation.java:2802) at com.codename1.ui.Display.createMedia(Display.java:2998) at com.codename1.media.MediaManager.createMedia(MediaManager.java:125) at com.codename1.media.MediaManager.createMedia(MediaManager.java:94) at it.galgani.app.fiveMinutesAlert.MyApplication.start(MyApplication.java:66) at it.galgani.app.fiveMinutesAlert.MyApplicationStub.run(MyApplicationStub.java:140) at com.codename1.ui.Display.processSerialCalls(Display.java:1116) at com.codename1.ui.Display.mainEDTLoop(Display.java:911) at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) at com.codename1.impl.CodenameOneThread$1.run(CodenameOneThread.java:60) at java.lang.Thread.run(Thread.java:856) [EDT] 0:0:0,214 - Exception in Alert every five minutes version 1.0 [EDT] 0:0:0,215 - OS and [EDT] 0:0:0,215 - Error java.lang.NullPointerException [EDT] 0:0:0,216 - Current Form null [EDT] 0:0:0,217 - Exception: java.lang.NullPointerException - null java.lang.NullPointerException at com.codename1.impl.android.AndroidImplementation.createMedia(AndroidImplementation.java:2802) at com.codename1.ui.Display.createMedia(Display.java:2998) at com.codename1.media.MediaManager.createMedia(MediaManager.java:125) at com.codename1.media.MediaManager.createMedia(MediaManager.java:94) at it.galgani.app.fiveMinutesAlert.MyApplication.start(MyApplication.java:66) at it.galgani.app.fiveMinutesAlert.MyApplicationStub.run(MyApplicationStub.java:140) at com.codename1.ui.Display.processSerialCalls(Display.java:1116) at com.codename1.ui.Display.mainEDTLoop(Display.java:911) at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) at com.codename1.impl.CodenameOneThread$1.run(CodenameOneThread.java:60) at java.lang.Thread.run(Thread.java:856)

On an Android 7.x device I get:

[EDT] 0:0:20,186 - Codename One revisions: 3b20edadec808867afc2b19774268b66890616ad

[EDT] 0:0:20,191 - Exception: java.lang.NullPointerException - Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null object reference java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null object reference at com.codename1.impl.android.AndroidImplementation.createMedia(AndroidImplementation.java:2802) at com.codename1.ui.Display.createMedia(Display.java:2998) at com.codename1.media.MediaManager.createMedia(MediaManager.java:125) at com.codename1.media.MediaManager.createMedia(MediaManager.java:94) at it.galgani.app.fiveMinutesAlert.MyApplication.start(MyApplication.java:66) at it.galgani.app.fiveMinutesAlert.MyApplicationStub.run(MyApplicationStub.java:140) at com.codename1.ui.Display.processSerialCalls(Display.java:1116) at com.codename1.ui.Display.mainEDTLoop(Display.java:911) at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) at com.codename1.impl.CodenameOneThread$1.run(CodenameOneThread.java:60) at java.lang.Thread.run(Thread.java:762) [EDT] 0:0:20,198 - Exception in Alert every five minutes version 1.0 [EDT] 0:0:20,199 - OS and [EDT] 0:0:20,201 - Error java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null object reference [EDT] 0:0:20,202 - Current Form null [EDT] 0:0:20,204 - Exception: java.lang.NullPointerException - Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null object reference java.lang.NullPointerException: Attempt to invoke virtual method 'int java.io.InputStream.read(byte[], int, int)' on a null object reference at com.codename1.impl.android.AndroidImplementation.createMedia(AndroidImplementation.java:2802) at com.codename1.ui.Display.createMedia(Display.java:2998) at com.codename1.media.MediaManager.createMedia(MediaManager.java:125) at com.codename1.media.MediaManager.createMedia(MediaManager.java:94) at it.galgani.app.fiveMinutesAlert.MyApplication.start(MyApplication.java:66) at it.galgani.app.fiveMinutesAlert.MyApplicationStub.run(MyApplicationStub.java:140) at com.codename1.ui.Display.processSerialCalls(Display.java:1116) at com.codename1.ui.Display.mainEDTLoop(Display.java:911) at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) at com.codename1.impl.CodenameOneThread$1.run(CodenameOneThread.java:60) at java.lang.Thread.run(Thread.java:762)

Upvotes: 1

Views: 821

Answers (1)

Shai Almog
Shai Almog

Reputation: 52760

It seems our system has a special treatment to the notification_sound prefix in a file name on Android for usage with background notification sounds on Android. Just rename the file to something else and it should work as expected.

Upvotes: 1

Related Questions