【问题标题】:IBM Worklight 6.1 - Unable to play a local media file using CordovaIBM Worklight 6.1 - 无法使用 Cordova 播放本地媒体文件
【发布时间】:2014-02-27 01:32:15
【问题描述】:

在 Android 模拟器中测试。

我正在尝试使用 Cordova Media API 来管理 Worklight 项目中本地存储的音频的播放。最初,我尝试更新我的项目以完成此任务,但没有成功,因此我决定使用 Apache Cordova Media API 页面上记录的完整示例。我使用完整示例来播放、暂停和停止音频文件。我所做的唯一更改是播放本地存储在我的 worklight 项目中的音频文件。

但是,上面的失败了……

我在示例项目中创建了一个新文件夹“WavAudo”,其中包含要播放的音频的 .mp3 和 .wav 版本。

当我启动应用程序时,我会收到一个警报弹出窗口,指出 error.codeerror.messageundefined。使用 Chrome 调试器,我在 deviceready 上看到了 Uncaught ReferenceError Media is not defined

我相信我已经尝试了所有可能的路径+文件组合来定位文件,但我一定错过了什么。

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

    <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("/android_asset/www/WavAudio/16300.mp3");
    }

    // 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>
    <a href="#" class="btn large" onclick="playAudio
    ('/android_asset/www/WavAudio/16300.mp3');">Play Audio</a>
    <a href="#" class="btn large" onclick="pauseAudio();">Pause Playing Audio</a>
    <a href="#" class="btn large" onclick="stopAudio();">Stop Playing Audio</a>
    <p id="audio_position"></p>
  </body>

我还将这些添加到 Android Manifest:

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

【问题讨论】:

  • 你可以去你的app_folder\platforms\android\res\xml\config.xml看看媒体插件是否定义正确,例如:&lt;feature name="Media"&gt;

标签: javascript android cordova ibm-mobilefirst


【解决方案1】:

Cordova 网站上提供的示例代码有效,但看起来它们指向的 URL 已损坏。我已经replaced it with another 然后它工作了。

至于播放本地媒体文件,您需要提供媒体文件位置的完整路径它将在生成的 Android 项目中的位置。例如,如果您在 Worklight 应用程序中创建一个common\audio 文件夹并在其中放置一个 .mp3 文件,您需要使用以下路径(在 HTML 或 JavaScript 中,或者您喜欢的任何方式...):

<a href="#" onclick="playAudio('/android_asset/www/default/audio/myMediaFile.mp3');">Play Audio</a>

这是因为在 Worklight 中,每个应用程序都被视为一个“皮肤”。有“默认”皮肤,if you add another,在www 文件夹中会有自己的文件夹。

示例项目:Android Cordova Media API


P.S.,我认为将示例从 Cordova 按原样复制粘贴到 Worklight 项目中并不是一个好习惯。

  • 没有可链接的cordova.js。
  • 收听deviceready 是多余的,因为这是在内部处理的。这么说吧:如果您已联系到wlCommonInit(),那么您就可以开始了。
  • 无需添加额外的权限,除非您想要这些权限提供的功能...

【讨论】:

  • 我已经应用了提供的所有建议以取得成功。 1) 删除了 cordova.js 脚本定义 2) 删除了设备就绪事件侦听器设置。作为最后一点希望,我将通用下的音频文件夹重命名为“音频”,我使用了上面建议的路径到我的文件。 /android_asset/www/default/audio/16300.mp3 我构建,然后使用 Chrome 测试 Android。当我点击播放时,我会在“my_media = new Media(src, onSuccess, onError);”上弹出警报。弹出窗口有代码:未定义和消息:未定义。我在新工作区中重新创建了这个示例,但没有运气。欣赏所有想法。我会在这里继续搜索。谢谢。
  • 您无法通过 Worklight Console 对此进行测试。您必须在 Android Emulator 或 Device 中进行测试。 “铬”是什么意思?
  • 我安装了 Android sdk 和 AVD 管理器以及我的 Worklight。在我的项目中,我有共同的,并且创建了 Android 环境。我构建所有环境并部署到 Worklight Dev Server。 (内部的)。我使用 Chrome 指向开发服务器 localhost:10080/PlayTime/console/#catalog 我单击我的应用程序的 Android 预览眼睛,该应用程序启动 Android 模拟器,显示我的默认设备“Kindle Fire II”我选择播放音频按钮,我得到了两者的弹出窗口字段错误和消息“未定义”。如果我的构建/测试过程有缺陷,请告诉我。谢谢。
  • 这正是我刚刚告诉您的 - 您不能使用 Worklight Console 的 MBS 来使用 android_asset 收听音频文件,因为该文件保存在应用程序的 NATIVE 文件夹中,而 MBS 仅用于预览你的网络资源。下次,请不要使用“模拟器”这个词,这意味着您正在实际的 Android 模拟器上进行测试,而您并没有这样做。试试我的示例项目;在实际的 Android 设备或 Android 模拟器上运行它。然后,它会起作用。
  • 伊丹,非常感谢。我为误用术语而道歉。我部署并在 Andriod 模拟器上运行,我现在确实听到了音频播放。我的误解是控制台 MBS 中没有音频。感谢您的时间、耐心和建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多