Воспроизведение звука в приложении 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>
Это сработало, но мне нужно получить локальные файлы, играющие
Ответы
Ответ 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;
}