Phonegap使用phonegap 3和媒体插件构建

时间:2014-01-13 16:16:50

标签: cordova phonegap-plugins phonegap-build

我使用phonegap build和phonegap 3进行应用程序构建。我想让用户使用该应用程序播放一些外部音频文件。但我应该错过一些东西,因为媒体无法找到和播放。

这是我的config.xml:

<?xml version="1.0" encoding="UTF-8" ?>
    <widget xmlns   = "http://www.w3.org/ns/widgets"
        xmlns:gap   = "http://phonegap.com/ns/1.0"
        id          = "com.phonegap.example"
        versionCode = "10" 
        version     = "1.0.0" >

    <preference name="phonegap-version" value="3.0.0" />
    <!-- versionCode is optional and Android only -->

    <name>My App</name>

    <description>
        Application mobile 
    </description>

    <author href="https://www.website.fr" email="support@website.fr">
        Henri Labarre 
    </author>

    <gap:platform name="ios" />
    <gap:platform name="android" />

    <gap:plugin name="org.apache.cordova.core.media" />
    <access origin="http://ibeat.org" subdomains="true" /> 

</widget>

我的index.html:

<!DOCTYPE html>
<html>
  <head>
    <title>My Audio</title>
    <meta name="viewport" content="width=device-width,
    height=device-height initial-scale=1.0,
    maximum-scale=1.0, user-scalable=no;" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <link rel="stylesheet" href="jquery.mobile1.0b3.min.css" />
    <script type="text/javascript" charset="utf-8" src="jquery1.6.4.min.js"></script>
    <script type="text/javascript" charset="utf-8" src="jquery.mobile1.0b3.min.js"></script>
    <script type="text/javascript" charset="utf-8" src="main.js"></script>
    <script type="text/javascript">
      function onBodyLoad() {
        //During testing, Let me know we got this far
        alert("onBodyLoad");
        //Add the PhoneGap deviceready event listener
        document.addEventListener("deviceready", onDeviceReady(), false);
       }

      function onDeviceReady() {
        //During testing, Let me know PhoneGap actually
        // initialized
        //Get our media file and stuff
        init();
      }
    </script>
  </head>
  <body onload="onBodyLoad()">
    <section id="main" data-role="page" >
      <header data-role="header">
        <h1>My audio</h1>
      </header>
      <div data-role="content">
        <p id="track"></p>
        <p id="pos"></p>
        <div data-role="controlgroup">
          <a onclick="doPlay();" id="btnPlay" data-role="button" data-icon="arrow-r">Play</a>
          <a onclick="doPause();" id="btnPause" data-role="button" data-icon="grid">Pause</a>
          <a onclick="doStop();" id="btnStop" data-role="button" data-icon="delete">Stop</a>
        </div>
      </div>
    </section>
  </body>
</html>

我的脚本main.js

var fileDur, theMedia, theTimer;

function init() {
  //alert("Init");
  var fileName = "http://audio.ibeat.org/content/p1rj1s/p1rj1s_-_rockGuitar.mp3";
  console.log(fileName);
  //Create the media object we need to do everything we need here
  theMedia = new Media(fileName, onMediaSuccess, onMediaError, onMediaStatus);
  console.log("Got this far!");
  console.log(theMedia);
  //Update the UI with the track name
  $('#track').html("<b>File:</b> " + fileName);
  $('#pos').html('Duration: ' + Math.round(theMedia.getDuration()) + ' seconds');
}

function onMediaSuccess() {
  console.log("onMediaSuccess");
  window.clearInterval(theTimer);
  theTimer = null;
}

function onMediaError(e) {
  var msgText = "Media error: " + e.message + "(" + e.code + ")";
  console.log(msgText);
  navigator.notification.alert(msgText, null, "Media Error");
}

function onMediaStatus(statusCode) {
  console.log("Status: " + statusCode);
}

function doPlay() {
  if(theMedia) {
    console.log("doPlay");
    //Start the media file playing
    theMedia.play();
    //fire off a timer to update the UI every second as it plays
    theTimer = setInterval(updateUI, 1000);
  } else {
    alert("No media file to play");
  }
}

function doPause() {
  if(theMedia) {
    console.log("doPause");
    //Pause media play
    theMedia.pause();
    window.clearInterval(theTimer);
  }
}

function doStop() {
  if(theMedia) {
    console.log("doStop");
    //Kill the timer we have running
    theTimer = null;
    //Then stop playing the audio clip
    theMedia.stop();
  }
}

function updateUI() {
  console.log("updateUI");
  theMedia.getCurrentPosition(onGetPosition, onMediaError);
}

function onGetPosition(filePos) {
  console.log("onGetPosition");
  //We won't have any information about the file until it's
  // actually played. Update the counter on the page
  $('#pos').html('Time: ' + Math.floor(filePos) + ' of ' + theMedia.getDuration() + ' seconds');
}

非常感谢您的帮助!

编辑:add()到监听器 Edit2:添加access origin =

2 个答案:

答案 0 :(得分:0)

我认为你应该从你的onbodyload函数中取出行document.addEventListener("deviceready", onDeviceReady, false);,而是在main.js中定义init函数之后添加document.addEventListener("deviceready", init, false);

当您在onbodyload中收到警报时,在您开始收听之前会触发deviceready事件。

答案 1 :(得分:0)

最后我使用此代码,它可以与phonegap build 3一起使用

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                  "http://www.w3.org/TR/html4/strict.dtd">
    <html>
      <head>
        <title>Media Example</title>

        <link rel="stylesheet" href="jquery.mobile1.0b3.min.css" />
        <script type="text/javascript" charset="utf-8" src="jquery1.6.4.min.js"></script>
        <script type="text/javascript" charset="utf-8" src="jquery.mobile1.0b3.min.js"></script>
        <script type="text/javascript" charset="utf-8" src="cordova.js"></script>
        <script type="text/javascript" charset="utf-8">

        // Wait for device API libraries to load
        //
        //document.addEventListener("deviceready", onDeviceReady, false);

        // device APIs are available
        //
        //function onDeviceReady() {
        //    playAudio("http://www.mywebsite.fr/addons/Rome.m4a");
        //}

        // 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);
            }
        }

        // Pause audio
        //
        function pauseAudio() {
            if (my_media) {
                my_media.pause();
            }
        }

        // Stop audio
        //
        function stopAudio() {
            if (my_media) {
                my_media.stop();
            }
            clearInterval(mediaTimer);
            mediaTimer = null;
        }

        // onSuccess Callback
        //
        function onSuccess() {
            console.log("playAudio():Audio Success");
        }

        // onError Callback
        //
        function onError(error) {
            alert('code: '    + error.code    + '\n' +
                  'message: ' + error.message + '\n');
        }

        // Set audio position
        //
        function setAudioPosition(position) {
            document.getElementById('audio_position').innerHTML = position;
        }
        </script>
      </head>
      <body>
        <section id="main" data-role="page" >
          <header data-role="header">
            <h1>mywebsite</h1>
          </header>
          <div data-role="content">
            <p id="track"></p>
            <div data-role="controlgroup">
              <a onclick="playAudio('http://www.mywebsite.fr/addons/Rome.m4a');" id="btnPlay" data-role="button" data-icon="arrow-r">Lecture</a>
              <a onclick="pauseAudio();" id="btnPause" data-role="button" data-icon="grid">Pause</a>
              <a onclick="stopAudio();" id="btnStop" data-role="button" data-icon="delete">Stop</a>
            </div>
          </div>

          <p id="audio_position"></p>
        </section>
      </body>
    </html>