4

私は広範なオーディオ要件を持つアプリを構築しているため、そのために SoundJS を使用しており、phonegap を使用してアプリをコンパイルしています。

モバイルセーフアプローチを使用して、soundJS アプリを構築しています。特別な Cordova オーディオ プラグインを含む、さまざまなオーディオ プラグインがあるようです。そのため、これらのプラグインをコンパイル済みアプリに登録できません。これは、プラグインを登録する際に、このプラグインがサポートされているかどうかを確認する必要があるためです。コルドバの場合、メソッドisSupportedは次のことを確認します。

if (s._capabilities != null || !(window.cordova || window.PhoneGap || window.phonegap) || !window.Media) { return;}

つまり、アプリがコンパイルされると、window.cordova または phonegap というグローバル変数も、window.media というグローバル変数もありません (これは、soundjs を機能させるためにインストールする必要があるメディア プラグインだと思います。 phonegap ビルドに使用している config.xml に追加します。

したがって、問題は、何が問題なのかを調査する方法、たとえばメディアプラグインが適切にインストールされていないかどうかを知る方法です (他のデバッグを使用できないため、使用できるすべての javascript 変数から)。 phonegap ビルドを使用してコンパイルすると、cordova または phonegap の変数がありません。すべてのグローバル変数をリストして、どの変数が使用されているかを確認できますか?

編集 phonegap に関するこれらの点に注意を向けてくれた Jesse に感謝します。そのため、deviceready イベントをテストするためだけに小さなアプリを作成しましたが、何らかの理由で phonegap ビルドでコンパイルすると動作しません。

<!DOCTYPE html>
<html>
  <head>
    <title>Cordova Device Ready Example</title>

    <script type="text/javascript" charset="utf-8" src="js/soundjs-NEXT.min.js"></script>
    <script type="text/javascript" charset="utf-8" src="js/cordovaaudioplugin-NEXT.min.js"></script>
    <script type="text/javascript" charset="utf-8">

    // Call onDeviceReady when Cordova is loaded.
    //
    // At this point, the document has loaded but cordova-2.3.0.js has not.
    // When Cordova is loaded and talking with the native device,
    // it will call the event `deviceready`.
    //
    function onLoad() {
        document.getElementById("doc_loaded").innerHTML="Document Loaded"
        document.addEventListener("deviceready", onDeviceReady, false);
    }

    // Cordova is loaded and it is now safe to make calls Cordova methods
    //
    function onDeviceReady() {
        // Now safe to use the Cordova API\
        document.getElementById("device_loaded").innerHTML="Device Loaded"

        if (window.cordova || window.PhoneGap || window.phonegap){ 
            document.getElementById("phonegap_loaded").innerHTML="Phonegap Loaded"
        }
        if (window.Media){
            document.getElementById("media_loaded").innerHTML="Media Loaded"
        }

    }

    </script>
  </head>
  <body onload="onLoad()">
  Hello Hello, testing phonegap deviceready
  <div id="doc_loaded">Loading Doc</div>
  <div id="device_loaded">Loading Device</div>
  <div id="phonegap_loaded">Detecting Phonegap</div>
  <div id="media_loaded">Detecting Media</div>
  </body>
</html>

問題がどこにあるのかを特定するのを手伝ってもらえますか?

EDIT2コルドバを追加しなかったため、devicereadyが機能していないことがわかりました

<script type="text/javascript" src="cordova.js"></script>

それで、私がやったとき、私はコルドバオーディオプラグインを初期化することができました. ただし、モバイルセーフアプローチを使用しているにもかかわらず、サウンドを再生できません。

(このコードは arbsq.net/h6/ でホストされています)

<!DOCTYPE html>
<html>
<head>
    <title>SoundJS: Mobile Safe</title>

    <link href="css/shared.css" rel="stylesheet" type="text/css"/>
    <link href="css/examples.css" rel="stylesheet" type="text/css"/>
    <link href="css/soundjs.css" rel="stylesheet" type="text/css"/>
    <script src="js/examples.js"></script>
</head>

<body onload="loading_doc()">

<header  class="SoundJS">
    <h1>Mobile Safe Play</h1>

    <p>This example registers and plays a sound with SoundJS in a way that will
        work on mobile devices.</p>
</header>

<div class="content" id="content" style="height: auto">
    <p id="status">Hello World.</p>
</div>

<div id="error">
    <h2>Sorry!</h2>

    <p>SoundJS is not currently supported in your browser.</p>

    <p>Please <a href="http://github.com/CreateJS/SoundJS/issues" target="_blank">log a bug</a>
        with the device and browser you are using. Thank you.</p>
</div>

<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" charset="utf-8" src="js/soundjs-NEXT.min.js"></script>
<script type="text/javascript" charset="utf-8" src="js/cordovaaudioplugin-NEXT.min.js"></script>


<!-- We also provide hosted minified versions of all CreateJS libraries.
    http://code.createjs.com -->

<script id="editable">
    var displayMessage;     // the HTML element we use to display messages to the user
    this.myNameSpace = this.myNameSpace || {};
    function loading_doc() {
         if(( /(ipad|iphone|ipod|android|windows phone)/i.test(navigator.userAgent) )) {
            document.addEventListener('deviceready', init, false);
        } else {
            init();
        }
    }

    function init() {
        // store this off because walking the DOM to get the reference is expensive
        displayMessage = document.getElementById("status");

        // if this is on mobile, sounds need to be played inside of a touch event
        if (createjs.BrowserDetect.isIOS || createjs.BrowserDetect.isAndroid || createjs.BrowserDetect.isBlackberry || createjs.BrowserDetect.isWindowPhone) {
            //document.addEventListener("click", handleTouch, false);   // works on Android, does not work on iOS
            displayMessage.addEventListener("click", handleTouch, false);   // works on Android and iPad
            displayMessage.innerHTML = "Touch to Start";
        }
        else {
            handleTouch(null);
        }
    }

    // launch the app inside of this scope
    function handleTouch(event) {
        displayMessage.removeEventListener("click", handleTouch, false);
        // launch the app by creating it
        var thisApp = new myNameSpace.MyApp();
    }

    // create a namespace for the application


    // this is a function closure
    (function () {
        // the application
        function MyApp() {
            this.init();
        }

        MyApp.prototype = {
            src: null,            // the audio src we are trying to play
            soundInstance: null,  // the soundInstance returned by Sound when we create or play a src
            displayStatus: null,  // the HTML element we use to display messages to the user
            loadProxy: null,

            init: function () {
                // store the DOM element so we do repeatedly pay the cost to look it up
                this.displayStatus = document.getElementById("status");

                // this does two things, it initializes the default plugins, and if that fails the if statement triggers and we display an error
                // NOTE that WebAudioPlugin plays an empty sound when initialized, which activates web audio on iOS if played inside of a function with a touch event in its callstack
                if (!createjs.Sound.initializeDefaultPlugins()) {
                    document.getElementById("error").style.display = "block";
                    document.getElementById("content").style.display = "none";
                    return;
                }

                // Create a single item to load.
                var assetsPath = "audio/";
                this.src = assetsPath + "M-GameBG.ogg";

                this.displayStatus.innerHTML = "Waiting for load to complete.";  // let the user know what's happening
                // NOTE createjs.proxy is used to apply scope so we stay within the touch scope, allowing sound to play on mobile devices
                this.loadProxy = createjs.proxy(this.handleLoad, this);
                createjs.Sound.alternateExtensions = ["mp3"];   // add other extensions to try loading if the src file extension is not supported
                createjs.Sound.addEventListener("fileload", this.loadProxy); // add event listener for when load is completed.
                createjs.Sound.registerSound(this.src);  // register sound, which preloads by default

                return this;
            },

            // play a sound inside
            handleLoad: function (event) {
                this.soundInstance = createjs.Sound.play(event.src);    // start playback and store the soundInstance we are currently playing
                this.displayStatus.innerHTML = "Playing source: " + event.src;  // let the user know what we are playing
                createjs.Sound.removeEventListener("fileload", this.loadProxy); // we only load 1 sound, so remove the listener
            }
        }

        // add MyApp to myNameSpace
        myNameSpace.MyApp = MyApp;
    }());

</script>

</body>
</html>
4

3 に答える 3

2

@hmghaly、
Phonegap の可用性を確認する一般的な方法は、Cordova/Phonegap が提供する「deviceready」イベントを使用することです。また、このイベントが完了するまで待つ必要があります。

この記事 FAQ の 4 番目をお読みください:
Cordova/Phonegap を初めて使用する開発者によるよくある間違い

ドキュメントから重要な部分を引用します(読む必要があります):

これは、すべての Cordova アプリケーションが使用する必要がある非常に重要なイベントです。

Cordova は、ネイティブと JavaScript の 2 つのコード ベースで構成されています。ネイティブ コードの読み込み中は、カスタムの読み込みイメージが表示されます。ただし、JavaScript は DOM がロードされた後にのみロードされます。これは、Web アプリケーションが、ロードされる前に Cordova JavaScript 関数を呼び出す可能性があることを意味します。

Cordova が完全に読み込まれると、Cordova devicereadyイベントが発生します。デバイスが起動したら、Cordova 関数を安全に呼び出すことができます。

ドキュメントには、特定のモバイル デバイスとプラットフォームに関連するコード例が含まれています。

幸運を祈ります

于 2015-09-19T22:09:04.203 に答える
1

SoundJS 0.6.2 を使用している場合は、MobileSafe コードを含める必要はありません。公式ドキュメントを参照

私がかなり長い間直面していた問題は、iOS でローカルのサウンド ファイルが正常に読み込まれないことでした。

私が見つけたもの:最新のiOSはWKWebViewを使用しています。ローカル ファイルがアプリ自体にある場合でも、ローカル ファイルをリモート サーバーから送信されたかのように処理するように見え、そのような要求はブロックされます。参照

最後に、多くのデバッグとロギングの後、次の解決策がうまくいきました:

  1. Corodova ファイル プラグインを追加します。

    cordova plugin add cordova-plugin-file

  2. ローカル ファイル パスを次のように変更します。

    cdvfile://localhost/bundle/www/you_folder_name/file_name.mp3

于 2016-06-25T03:44:05.460 に答える