Playing sound in WebView from JavaScript

13,468

Solution 1

I had the same problem and finally i'm using phonegap and cordova where you can play and record audios easily: http://docs.phonegap.com/en/2.9.0/cordova_media_media.md.html

Solution 2

Re: MediaPlayer( ): Error (1,-2147483648)

The Android MediaPlayer needs the media files to be world-readable so they can’t reside in the “assets” folder inside the Eclipse project. Push the audio/video files onto the device external storage. To do this, with an emulator, use the DDMS Perspective in Eclipse (while your emulator is running go to Window->Open Prospective->Other->DDMS) to create a folder and push files onto SD card image or internal (non-removable) storage.

Reference on DDMS: http://developer.android.com/guide/developing/debugging/ddms.html

In DDMs, select your emulator in the Devices panel on the left, and then choose the FileExplorer tab on the right, look for a folder named /mnt/sdcard/ which contains the SDCard contents, or, alternatively /Android/data/package_name/files/ for the standardized application’s storage area. So, in the above example, if you create a folder myaudio on the SDcard the filename path would be:

audio = new Audio("/mnt/sdcard/myaudio/sound.mp3");

Reference: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

And don't give up on HTML5!

Share:
13,468
Blackhex
Author by

Blackhex

CTO and programmer at Trinerdis. Interests in mobile applications, computer graphics, games, GIS, embedded devices, 3D printing.

Updated on June 04, 2022

Comments

  • Blackhex
    Blackhex about 2 years

    I'm trying to play sound from JavaScript code loaded to WebView from assets:

    WebView web_view = (WebView) findViewById(R.id.web_view);
    web_view.getSettings().setJavaScriptEnabled(true);
    web_view.setWebChromeClient(new WebChromeClient());
    web_view.loadUrl("file:///assets/www/index.html");
    

    I tried all combinations of following ways how to play audio with OGG, MP3 and WAV files, the JavaSrcipt code is in assets/www/js/play.js:

    audio = new Audio("../audio/sound.mp3");
    audio.load();
    audio.play();
    
    audio = new Audio("./audio/sound.mp3");
    audio.load();
    audio.play();
    
    audio = new Audio("audio/sound.mp3");
    audio.load();
    audio.play();
    
    audio = new Audio("file:///android_asset/www/audio/sound.mp3");
    audio.load();
    audio.play();
    
    audio = new Audio();
    audio.src = document.getElementById("audio_tag").src;
    audio.load();
    audio.play();
    

    Where audio_tag is <audio id="audio_tag" src="audio/sound.mp3" preload="auto"></audio>, also tried with all combinations of paths and formats.

    But the sound is not playing and only clue what may be wrong is following general error:

    E/MediaPlayer(1530): error (1, -2147483648)

    Guessing from this info message, the path to audio file should be correct for second trough fifth case:

    I/StagefrightPlayer(33): setDataSource('file:///android_asset/www/audio/sound.mp3');
    

    Although this question may be considered as duplicate of Android WebView playing audio with javascript and the answer is not helping anyhow since shouldOverrideUrlLoading is never called, I'm trying to specify this problem more precisely here.

    Do you have any clue what may be wrong or how to find out what is it?

    Thank you.

    Edit: Testing in Galaxy Gio with Android 2.3 gives me different set of errors though:

    02-06 17:15:13.829: V/PlayerDriver(95): AddToScheduler 02-06 17:15:13.829: V/PlayerDriver(95): PendForExec 02-06 17:15:13.829: V/PlayerDriver(95): OsclActiveScheduler::Current 02-06 17:15:13.829: V/PlayerDriver(95): StartScheduler 02-06 17:15:13.829: V/PVPlayer(95): send PLAYER_SETUP 02-06 17:15:13.829: V/PlayerDriver(95): Send player code: 2 02-06 17:15:13.829: V/PlayerDriver(95): CommandCompleted 02-06 17:15:13.829: V/PlayerDriver(95): Completed command PLAYER_SETUP status=PVMFSuccess 02-06 17:15:13.829: V/PVPlayer(95): setDataSource(file:///android_asset/www/audio/sound.mp3) 02-06 17:15:13.839: V/PVPlayer(95): prepareAsync 02-06 17:15:13.839: V/PVPlayer(95): data source = file:///android_asset/www/audio/sound.mp3 02-06 17:15:13.849: V/PlayerDriver(95): Send player code: 3 02-06 17:15:13.849: V/PlayerDriver(95): handleSetDataSource 02-06 17:15:13.849: V/PlayerDriver(95): handleSetDataSource- scanning for extension
    02-06 17:15:13.849: V/PlayerDriver(95): HandleInformationalEvent: PVMFInfoErrorHandlingStart 02-06 17:15:13.849: V/PlayerDriver(95): HandleInformationalEvent: type=26 UNHANDLED 02-06 17:15:13.849: W/MediaPlayer(4361): info/warning (1, 26) 02-06 17:15:13.849: V/PlayerDriver(95): CommandCompleted 02-06 17:15:13.849: V/PlayerDriver(95): Completed command PLAYER_SET_DATA_SOURCE status=PVMFErrNotSupported 02-06 17:15:13.849: E/PlayerDriver(95): Command PLAYER_SET_DATA_SOURCE completed with an error or info
    PVMFErrNotSupported 02-06 17:15:13.849: E/MediaPlayer(4361): error (1, -4) 02-06 17:15:13.849: V/PVPlayer(95): run_init s=-2147483648, cancelled=0 02-06 17:15:13.849: V/PlayerDriver(95): HandleInformationalEvent: PVMFInfoErrorHandlingComplete 02-06 17:15:13.849: W/PlayerDriver(95): PVMFInfoErrorHandlingComplete
    02-06 17:15:13.939: I/MediaPlayer(4361): Info (1,26) 02-06 17:15:13.939: E/MediaPlayer(4361): Error (1,-4) 02-06 17:15:13.939: V/PVPlayer(95): reset 02-06 17:15:13.939: V/PlayerDriver(95): Send player code: 18 02-06 17:15:13.939: V/PlayerDriver(95): handleCancelAllCommands 02-06 17:15:13.939: V/PlayerDriver(95): CommandCompleted 02-06 17:15:13.939: V/PlayerDriver(95): Completed command PLAYER_CANCEL_ALL_COMMANDS status=PVMFSuccess 02-06 17:15:13.939: V/PlayerDriver(95): Send player code: 11 02-06 17:15:13.939: V/PlayerDriver(95): handleReset 02-06 17:15:13.939: V/PlayerDriver(95): CommandCompleted 02-06 17:15:13.939: V/PlayerDriver(95): Completed command PLAYER_RESET status=PVMFSuccess 02-06 17:15:13.939: V/PlayerDriver(95): Send player code: 17 02-06 17:15:13.939: V/PlayerDriver(95): handleRemoveDataSource 02-06 17:15:13.939: V/PlayerDriver(95): CommandCompleted 02-06 17:15:13.939: V/PlayerDriver(95): Completed command PLAYER_REMOVE_DATA_SOURCE status=PVMFSuccess 02-06 17:15:13.939: V/PlayerDriver(95): remove datasource complete 02-06 17:15:13.939: V/PVPlayer(95): unmap file