【问题标题】:Cordova Media Plugin doesn't implement audioPlayerEndInterruptionCordova 媒体插件未实现 audioPlayerEndInterruption
【发布时间】:2014-07-18 16:58:23
【问题描述】:

我创建了一个 iOS 应用程序,该应用程序在后台运行时播放音频。如果音频被中断(例如:电话),音频将停止并且永远不会恢复。

我认为这是因为 cordova 媒体插件没有实现 audioPlayerEndInterruption

我精通 Javascript,但对 Objective-C 几乎一无所知。有人对如何添加此功能有建议吗?

是否有实现 audioPlayerEndInterruption 的不同媒体插件,或者是否有将 audioPlayerEndInterruption 合并到 cordova 插件中的简单方法?

【问题讨论】:

  • 什么版本的科尔多瓦?
  • 我现在使用的是 v3.1,但我打算很快切换到 v3.5。
  • 如果您想测试一下,我可以对您进行一些 3.2 代码更改。您应该能够修改 CDVSound.h/.m 文件和 media.js 来处理 audioPlayerEndInterruption。
  • 好的。那太好了。我实际上使用的是 AppGyver Steroids,它是 PhoneGap 之上的一层,所以我不能直接编辑插件。但是我假设如果我 fork Cordova Media Plugin 并进行更改,那么我可以通过 plugman 将其导入我的项目中。希望这只会覆盖默认插件?
  • 是的,不确定Steroids是如何实现的,但是如果你可以添加自定义插件,那么你应该能够找到方法。 fwiw,如果代码不适合你,它应该非常接近......只是试图给你必要的步骤;-)

标签: ios objective-c cordova plugins avaudioplayer


【解决方案1】:

CDVSound.h -修改:添加:,MEDIA_END_INTERRUPT = 5

enum CDVMediaStates {
    MEDIA_NONE = 0,
    MEDIA_STARTING = 1,
    MEDIA_RUNNING = 2,
    MEDIA_PAUSED = 3,
    MEDIA_STOPPED = 4,
    MEDIA_END_INTERRUPT = 5
};

CDVSound.m -添加:

- (void)audioPlayerEndInterruption:(AVAudioPlayer*)player successfully:(BOOL)flag
{
    CDVAudioPlayer* aPlayer = (CDVAudioPlayer*)player;
    NSString* mediaId = aPlayer.mediaId;
    CDVAudioFile* audioFile = [[self soundCache] objectForKey:mediaId];
    NSString* jsString = nil;

    if (audioFile != nil) {
        NSLog(@"Ended Interruption of playing audio sample '%@'", audioFile.resourcePath);
    }
    if (flag) {
        jsString = [NSString stringWithFormat:@"%@(\"%@\",%d,%d);", @"cordova.require('org.apache.cordova.media.Media').onStatus", mediaId, MEDIA_STATE, MEDIA_END_INTERRUPT];
    } else {
        jsString = [NSString stringWithFormat:@"%@(\"%@\",%d,%@);", @"cordova.require('org.apache.cordova.media.Media').onStatus", mediaId, MEDIA_ERROR, [self createMediaErrorWithCode:MEDIA_ERR_DECODE message:nil]];
    }

    [self.commandDelegate evalJs:jsString];
}

Media.js -修改:添加:Media.MEDIA_END_INTERRUPT = 5; AND , "结束中断"

// Media states
Media.MEDIA_NONE = 0;
Media.MEDIA_STARTING = 1;
Media.MEDIA_RUNNING = 2;
Media.MEDIA_PAUSED = 3;
Media.MEDIA_STOPPED = 4;
Media.MEDIA_END_INTERRUPT = 5;
Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped", "EndInterrupt"];

然后找到 Media.onStatus = function(id, msgType, value) { 并在案例 Media.MEDIA_STATE : block... 中添加条件...

 if(value == Media.MEDIA_END_INTERRUPT) {
     //do whatever you want
 }

【讨论】:

  • 谢谢,我试试这个
  • 我正在使用一个名为 Steroids 的平台,它位于 cordova 之上。因此,我无法直接编辑媒体插件。所以我试图扩展它,但由于我缺乏Objective-C知识,我真的只是在黑暗中刺伤。我已尽最大努力尝试将您提供的代码构建到扩展类 here 中,但在尝试重新声明枚举 CDVMediaStates 时出现编译错误。有什么想法吗?
  • 是的,我认为没有办法覆盖枚举。这就是为什么我没有提供类别/分机。你可以复制整个 CDVSound 插件(增强)然后在 config.xml 中用你的替换它们吗?
  • 好吧,Jerry Coffin 有一个合格的替代方案,您可以在此链接中尝试stackoverflow.com/questions/3124012/…
【解决方案2】:

只是在这里跟进。我最终为此编写了一个插件,它覆盖了一些默认的cordova媒体插件(v0.2.12)方法。我在这里发布一个链接,但代码是一团糟。我只是想得到一些有用的东西,并没有真正计划分享。但在这里(没有提供文档,抱歉):

https://github.com/stevethorson/Interruptible-Cordova-Media.git

【讨论】:

    【解决方案3】:

    我从媒体插件本身解决了这个问题,使用 getCurrentPosition 方法我能够检测到流媒体是否被电话或语音邮件中断......然后停止并再次重新播放音频。我希望这可以帮助我永远带我去使用媒体插件和广播的人。

    var mediaplayer = new Media(streamingUrl, mediaSuccess, mediaFail, mediaState);
    mediaplayer.play({playAudioWhenScreenIsLocked :true});
    
    var prevPos = 0;
            var mediaTimer = setInterval(function () {
                // get media position
                mediaplayer.getCurrentPosition(
                    // success callback
                    function (currentposition) {
                        if (currentposition > prevPos) {                        
                            prevPos = currentposition;                        
                        } else if (currentposition === prevPos) {                   
                            stop();
                            play();
                        } else {
                            console.log("can't get pos");
                        }
                    },
                    // error callback
                    function (e) {
                        alert+("Error getting pos=" + e);
                    }
                );
            }, 5000);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多