【问题标题】:cordova-plugin-media not playing from local URIcordova-plugin-media 没有从本地 URI 播放
【发布时间】:2017-10-18 18:11:43
【问题描述】:

尝试播放手机外部存储中的音频文件。

首先通过this plugin 查找特定mp3 文件的URI。然后将其传递给cordova-plugin-media 实例。

// find music file URI from the sdcard
new ExternalStorageSdcardAccess( fileHandler ).scanPath( "file:///storage/C67A-18F7/Music/" );
function fileHandler( fileEntry ) {
    // console.log( fileEntry.name + " | " + fileEntry.toURL() );
}    

// create a button instance
let mbutton = new Button({
  centerX: 0, top: [fbutton,100],
  text: 'play music'  
}).appendTo(ui.contentView);    

// call the play media function from the button
mbutton.on('select', () => {
    // load and play the music:
    playAudio("file:///storage/C67A-18F7/Music/demo/testSound.mp3")

});    

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.code + err.message);
        },
        // status callback
        function (status) {
            console.log("playAudio():Audio Status: " + status);
        }
    );
    // Play audio
    my_media.play();
    my_media.setVolume('1.0');
}

我检查了adb 的日志。这就是我专门点击这些按钮的结果 - http://paste.ubuntu.com/25767292/

incoming-operation: 'Call' on 'cordova.plugin' (o13) with method 'exec' with properties {action=create, arguments=["d39113d0-b5f5-bf2d-8a84-5afbbc6ae9a0","file:///storage/C67A-18F7/Music/demo/testSound.mp3"], callbackId=Media975330222}
incoming-operation: 'Call' on 'cordova.plugin' (o13) with method 'exec' with properties {action=startPlayingAudio, arguments=["d39113d0-b5f5-bf2d-8a84-5afbbc6ae9a0","file:///storage/C67A-18F7/Music/demo/testSound.mp3",null], callbackId=INVALID}
outgoing-operation: 'Notify' o13 of 'finish' with arguments {message=S01 Media975330222 s, status=1, keepCallback=false, callbackId=Media975330222}
ExtMediaPlayer-JNI: env->IsInstanceOf fails
MediaPlayer-JNI: JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0
ExtMediaPlayer-JNI: env->IsInstanceOf fails
MediaPlayer-JNI: JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0

【问题讨论】:

    标签: javascript android cordova tabris-js


    【解决方案1】:

    我正在使用带有离子反应项目的电容器,并且能够通过将它与 cordova-plugin-file 结合使用来让 cordova-plugin-media 播放本地文件.我是离子原生包装器,但我认为这里的代码相同。

    注意:iOS 要求您删除“file://”,而 Android 不需要。

        const finishedFilePath = `${File.applicationDirectory}public/assets/audio/file.mp3`;
    const hybridTransitionAudioFile = Media.create(isPlatform('ios') ? transitionFilePath.replace('file://', '') : transitionFilePath);
    hybridTransitionAudioFile.play();
    

    【讨论】:

      【解决方案2】:

      1- 安装这个

      https://play.google.com/store/apps/details?id=com.adobe.phonegap.app&hl=en

      2- 安装这个

      http://docs.phonegap.com/getting-started/1-install-phonegap/desktop/

      3- 将您的笔记本电脑和手机连接到同一网络

      4-按照此入门并在您的手机上运行它,我想您不会遇到同样的错误,因为我的情况是它在浏览器或模拟器中不起作用,以防手机中断

      参考https://phonegap.com/getstarted/

      反馈一下,我可以在这里更新我的答案

      HTML 部分 用于音频源

              <audio id="successSound" src="/android_asset/www/audio/correct.mp3" type="audio/mpeg"></audio>
              <audio id="errorSound" src="/android_asset/www/audio/error.mp3" type="audio/mpeg" ></audio>
          </body>
      </html>
      

      示例我的版本,希望对它有帮助

      playAudio("errorSound");
      
      
      var my_media = null;
      var mediaTimer = null;
      
      function playAudio(id) {
          var audioElement = document.getElementById(id);
          var src = audioElement.getAttribute('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);
          }
      }
      
      function setAudioPosition(position) {
          document.getElementById('audio_position').innerHTML = position;
      }
      
      
      // onSuccess Callback
      //
      function onSuccess() {
      }
      
      // onError Callback
      function onError(error) {
          switch(error.code){
              case MediaError.MEDIA_ERR_ABORTED:
              alert('MEDIA_ERR_ABORTED code: '    + error.code);
              break;
              case MediaError.MEDIA_ERR_NETWORK:
              alert('MEDIA_ERR_NETWORK code: '    + error.code);
              break;
              case MediaError.MEDIA_ERR_DECODE:
              alert('MEDIA_ERR_DECODE code: '    + error.code);
              break;
              case MediaError.MEDIA_ERR_NONE_SUPPORTED:
              alert('MEDIA_ERR_NONE_SUPPORTED code: '    + error.code);
              break;
          }
      }
      

      【讨论】:

      • 你想让我在Phonegap上测试这个插件吗?
      • Tabris JS。唯一的区别是没有 DOM。其余一切都相似。
      • 我认为可能是因为 URL。让我修改一下,检查并给你反馈。
      • @arjun 检查我上面的编辑我添加了&lt;audio id="successSound" src="/android_asset/www/audio/correct.mp3" type="audio/mpeg"&gt;&lt;/audio&gt;v
      • 我试过你的代码。我收到了MediaError.MEDIA_ERR_ABORTED = 1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多