HTML5音频无法在PhoneGap App中播放(可以使用Media?)

时间:2014-02-07 22:12:36

标签: android html5 cordova phonegap-build

在国外旅行的基本音板上工作。将所有内容设置为在浏览器中正常工作,但希望使用PhoneGap Build / GitHub使其可下载,因为单元服务将无法使用。

桌面浏览器中的一切都很好用但是一旦安装在Android上,mp3文件就无法播放。我在这里读了一些关于PhoneGap上mp3的不一致的帖子。一些建议使用“媒体”代替。我不知道如何交换它代替我现在的代码。似乎使用javascript而不仅仅是html。 http://docs.phonegap.com/en/2.0.0/cordova_media_media.md.html#Media我正在使用的示例:

<audio id="yes" src="audio/basic/yes.mp3"></audio>
<audio id="no" src="audio/basic/no.mp3"></audio>

<button class="button" onclick="document.getElementById('yes').play()">Yes</button>
<button class="button" onclick="document.getElementById('no').play()">No</button>

在浏览器中效果很好,但在Android上却不行。任何人都可以提供纠正音频的起点吗?

由于 -BR

编辑2-9-14

到目前为止没有运气。媒体插件显示正确安装并包含cordova.js。这是我尝试过的。

<!DOCTYPE HTML>
<html>
  <head>
    <title>Media Example</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    <script type="text/javascript" charset="utf-8" src="cordova.js"></script>
    <script type="text/javascript" charset="utf-8">

    function playAudio(url) {
// Play the audio file at url
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();
}
    </script>
  </head>
  <body>

  <a href="#" class="button" onclick="playAudio('/android_asset/www/audio/basic/yes.mp3');">Yes</a>

  </body>
</html>

还尝试使用您建议的代码

<!DOCTYPE html>
<html>
<head>

<title>Transactions</title>

<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
<script type="text/javascript">
var my_media = null;
var mediaTimer = null;
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");
}
// onError Callback
function onError(error) {
 alert('code: ' + error.code + '\n' +
    'message: ' + error.message + '\n');
}

</script>


<link rel="stylesheet" type="text/css" href="style.css">

</head>

<body>



document.addEventListener("deviceready", function () {
$("#Yes").on("click", function () {
    playAudio(audio/basic/yes.mp3);
});
$("#No").on("click", function () {
    playAudio(audio/basic/no.mp3);
});


<button class="button" id="Yes">Yes</button>
<button class="button" id="No">No</button>



</body>

</html>

编辑2/10/14

不幸的是,仍然没有这样的运气。最近的更新

<!DOCTYPE html>
<html> 
<head>

<title>Transactions</title>

<!-- JavaScript -->
<script type="text/javascript" charset="utf-8" src="cordova.js"></script> 
<script type="text/javascript">


document.addEventListener("deviceready", function () {
$("#yes").on("click", function () {
    playAudio(/android_asset/www/audio/basic/yes.mp3);
});
$("#no").on("click", function () {
    playAudio(/android_asset/www/audio/basic/no.mp3);
});
}, false);

    var my_media = null;
var mediaTimer = null;
function playAudio(src) {
// Create Media object from src
my_media = new Media(src, onSuccess, onError);
// Play audio
my_media.play();
}
// onSuccess Callback
function onSuccess() {
console.log("playAudio():Audio Success");
 }
// onError Callback
function onError(error) {
alert('code: ' + error.code + '\n' +
    'message: ' + error.message + '\n');
 }
</script>

<!-- CSS -->
<link rel="stylesheet" type="text/css" href="style.css">

</head>

<body>




<button class="button" id="yes">Yes</button>
<button class="button" id="no">No</button>



</body>

</html>

7 个答案:

答案 0 :(得分:7)

我整个星期一直在敲我的头,我终于让Media工作了!有很多陷阱:

根据Geevan的回答,您的页面上需要<script type="text/javascript" src="phonegap.js"></script>

第1步:

您需要使用org.apache.cordova.media版本0.2.9或更高版本(我使用0.2.11)。在撰写本文时,PhoneGap Build仅支持0.2.8版本。我相信patch notes for 0.2.9可能已经解决了我的问题。

第2步:

版本3.0.0的PhoneGap文档有一个拼写错误,请确保您至少使用3.3.0 documentation,并确保config.xml中的以下内容无拼写错误:

<feature name="Media">
    <param name="android-package" value="org.apache.cordova.media.AudioHandler" />
</feature>

(&#34;媒体&#34;&#34; org.apache.cordova.media.AudioHandler&#34;在3.0.0文档中缺失)

第3步:

如果您因为步骤1中描述的问题而被迫使用CLI版本的PhoneGap(非PhoneGap Build),请务必添加所需的插件。这在documentation

中有所描述
> cordova plugin add org.apache.cordova.media

并将<gap:plugin name="org.apache.cordova.media" />添加到您的config.xml

第4步:

你需要添加&#34; / android_asset / www /&#34;到您的所有音频文件路径。例如:

new Media('/android_asset/www/' + src);

第5步:

在设备准备就绪后,所有音频加载。例如:

document.addEventListener("deviceready", Game.load);

一旦我做了这些更改,我的音频就开始工作了!祝你好运!

答案 1 :(得分:4)

我认为你应该说“在桌面浏览器中工作得很好”,它更多的是在android默认浏览器中支持媒体而不是phonegap的问题。

根据this page,android浏览器在某些设备上支持mp3,而在其他设备上支持ogg。也许你的问题是你试图在只支持浏览器中媒体的ogg的设备上使用mp3?

使用phonegap media plugin可以解决问题。

文档页面中的完整示例非常清楚。 您只需在页面中复制playAudioonSuccessonError功能,然后在想要播放文件时调用playAudio。

您网页的HTML可能如下所示:

<button class="button" id="btnYes">Yes</button>
<button class="button" id="btnNo">No</button> 

和javasctipt(使用jquery):

document.addEventListener("deviceready", function () {
    $("#btnYes").on("click", function () {
        playAudio(audio/basic/yes.mp3);
    });
    $("#btnNo").on("click", function () {
        playAudio(audio/basic/no.mp3);
    });
}, false);
var my_media = null;
var mediaTimer = null;
function playAudio(src) {
    // Create Media object from src
    my_media = new Media(src, onSuccess, onError);
    // Play audio
    my_media.play();
}
// onSuccess Callback
function onSuccess() {
    console.log("playAudio():Audio Success");
}
// onError Callback
function onError(error) {
    alert('code: ' + error.code + '\n' +
        'message: ' + error.message + '\n');
}

对playAudio的调用也可以直接在html中进行onclick,但我更喜欢使用jquery只在phonegap准备好后才开始收听点击。

不要忘记包含cordova.js,如果您使用的是phonegap 3.x,请不要忘记安装org.apache.cordova.media插件

编辑:

路径audio/basic/yes.mp3假定该文件位于SD卡根目录的音频文件夹中。

如果音频文件夹位于phonegap www文件夹中,请使用/android_asset/www/audio/basic/yes.mp3

答案 2 :(得分:1)

这真的很难和令人困惑......但我终于做到了!

这正是我所做的:

的index.html

<audio id="successSound" src="sounds/sayHello.mp3" type="audio/mpeg" ></audio>
<button onclick="playAudio('successSound')">Play successSound local</button>

的AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

index.js

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

}

plataform /机器人/ RES / xml.config

<feature name="Media">
        <param name="android-package" value="org.apache.cordova.media.AudioHandler" />
    </feature>

它最终有效! :D uhuuuuu

答案 3 :(得分:1)

这可能是内容安全问题,请在index.html中尝试使用此标头。 在我的测试项目中,包含或排除它会创建或中断音频播放并使用$.get()或类似内容读取本地文件

<meta http-equiv="Content-Security-Policy" content="default-src 'self' http://appvipswi.easwi.it; script-src 'self' 'unsafe-inline'; media-src 'self'">

答案 4 :(得分:0)

如果您正在编译云端构建,

只需在index.html中添加以下行

即可
<script type="text/javascript" src="phonegap.js"></script>

注意:无需包含源phonegap.js,同时将添加编译build phonegap.js。

还在config.xml中包含媒体插件:

如果平台是Android,如果媒体存在于root中,那么媒体网址必须是: /android_asset/www/test.mp3

答案 5 :(得分:0)

声音文件路径问题

而不是/android_asset/www/audio/AudioFile2.mp3

/android_asset/www/default/audio/AudioFile2.mp3

我发现您的共享代码中的所有其他设置都是正确的。

答案 6 :(得分:0)

以上都不对我有用。我必须更改文件扩展名。 这是有效的方法。

<audio id="a3" controls="controls">
  <source id="s3" src="mp3.audio" type="audio/mp3" />
</audio>

我什至不必指定/ android_asset / www /