Подтвердить что ты не робот

Воспроизведение звука в приложении Phonegap для Android

Я пытаюсь воспроизвести mp3 файл. Это работает, если я изменю путь к файлу на моем локальном веб-сервере, но если я запустил его на устройстве Android, звук не воспроизводится и не отображается ошибка.

Я довольно уверен, что mp3 файл не найден, но я до сих пор не знаю, как его исправить.

Это Html

  <body>

        <audio id="successSound" src="/android_asset/www/sound/successSound.mp3" type="audio/mpeg" ></audio>
           <audio id="errorSound" src="/android_asset/www/sound/errorSound.mp3" type="audio/mpeg" ></audio>
<!-- some more UI -->
  </body>

Это Javascript

document.getElementById('errorSound').play();

Структура

phonyapp
`-- www
    `-- index.html
        |-- sound
        |   |-- errorSound.mp3
        |   `-- successSound.mp3
        |-- res
        `-- spec

Изменить 1

Я пробовал

<audio id="successSound" src="sound/successSound.mp3" type="audio/mpeg" ></audio>

Это работало в chrome на моем локальном веб-сервере, но не на Android.

Я пробовал

<audio id="successSound" src="http://html5multimedia.com/media/sayHello.mp3" type="audio/mpeg" ></audio>

Это сработало, но мне нужно получить локальные файлы, играющие

4b9b3361

Ответ 1

Метод воспроизведения, который предоставляет API HTML5, полезен для воспроизведения медиафайлов, доступных в Интернете. Phonegap обеспечивает плагин для воспроизведения файлов мультимедиа. Я проверил ваш код и успешно воспроизвел звук, внеся следующие изменения. Пожалуйста, проверьте в конце.

1. Добавьте следующую строку в config.xml

<gap:plugin name="org.apache.cordova.media" />

2. Замените строки в index.html

<button onclick="document.getElementById('successSound').play()">Play successSound local</button>
<button onclick="document.getElementById('errorSound').play()">Play errorSound local</button>

с этими строками

<button onclick="playAudio('successSound')">Play successSound local</button>
<button onclick="playAudio('errorSound')">Play errorSoundlocal</button>

3. Добавьте следующую функцию в js/index.js

function playAudio(id) {
    var audioElement = document.getElementById(id);
    var url = audioElement.getAttribute('src');
    var my_media = new Media(url,
            // success callback
             function () { console.log("playAudio():Audio Success"); },
            // error callback
             function (err) { console.log("playAudio():Audio Error: " + err); }
    );
           // Play audio
    my_media.play();
}

Ответ 2

Используйте этот код

  <body>

    <audio id="successSound" src="file:///android_asset/www/sound/successSound.mp3"      type="audio/mpeg" ></audio>
       <audio id="errorSound" src="file///android_asset/www/sound/errorSound.mp3"   type="audio/mpeg" ></audio>
<!-- some more UI -->
 </body>

Ответ 3

Вы пытались удалить часть /android_asset/www/ в своем коде? Ваше приложение работает как веб-сайт, и он считает, что его корень - это сама папка www.

Изменить: Я отредактирую комментарий. Код не отображается как-то.

Ответ 4

Если вы используете локальные файлы, попробуйте ссылаться на них с помощью src="file:///yourpath/sayHello.mp3"

Ответ 5

У меня была такая же проблема и, наконец, она работала, со мной проблема совладала с областью моей медиа-переменной. Я получил его работу следующим образом:

(function () {

    "use strict";
     var media;
     document.addEventListener('deviceready', onDeviceReady.bind(this), false);

function onDeviceReady() {
    media = new Media("/android_asset/www/sounds/wat is je wens.mp3", null, function (e) {
    alert('Media Error');
    alert(JSON.stringify(e));
    });

    alert('deviceready')
};
function onStart() {
    media.play();
    alert('yay')

}
};

По сути, я убедился, что область моей медиа-переменной была глобальной, объявив ее вне onDeviceReady, но этот носитель не вызывался перед событием deviceready.

Ответ 6

`` // Audio player
        //
        var my_media = null;
        var mediaTimer = null;
        // Play audio
        //
        function playAudio(src) {
            // Create Media object from src
            my_media = new Media(src, onSuccess, onError);

            // Play audio
            my_media.play();

            // Update my_media position every second
            if (mediaTimer == null) {
                mediaTimer = setInterval(function() {
                    // get my_media position
                    my_media.getCurrentPosition(
                        // success callback
                        function(position) {
                            if (position > -1) {
                                setAudioPosition((position) + " sec");
                            }
                        },
                        // error callback
                        function(e) {
                            console.log("Error getting pos=" + e);
                            setAudioPosition("Error: " + e);
                        }
                    );
                }, 1000);
            }
        }
        // onSuccess Callback
        //
        function onSuccess() {
            console.log("playAudio():Audio Success");
        }
function stopAudio() {
            if (my_media) {
                my_media.stop();
            }
            clearInterval(mediaTimer);
            mediaTimer = null;
        }
        // onError Callback
        //
        function onError(error) {
        }
        // Set audio position
        //
        function setAudioPosition(position) {
            document.getElementById('audio_position').innerHTML = position;
        }