首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cordova媒体插件没有实现audioPlayerEndInterruption

Cordova媒体插件没有实现audioPlayerEndInterruption
EN

Stack Overflow用户
提问于 2014-07-18 16:58:23
回答 3查看 595关注 0票数 1

我已经创建了一个iOS应用程序,它在后台运行时播放音频。如果音频被中断(即:电话),音频就会停止,再也不会恢复。

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

我对Javascript很在行,但对目标C几乎一无所知。有人有关于如何添加此功能的建议吗?

是否有不同的媒体插件实现audioPlayerEndInterruption,还是有一种简单的方法将audioPlayerEndInterruption集成到cordova插件中?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-14 14:16:54

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-07-18 18:15:03

CDVSound.h -modify:add:,MEDIA_END_INTERRUPT =5

代码语言:javascript
复制
enum CDVMediaStates {
    MEDIA_NONE = 0,
    MEDIA_STARTING = 1,
    MEDIA_RUNNING = 2,
    MEDIA_PAUSED = 3,
    MEDIA_STOPPED = 4,
    MEDIA_END_INTERRUPT = 5
};

CDVSound.m -add:

代码语言:javascript
复制
- (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 -modify:add: Media.MEDIA_END_INTERRUPT = 5;和"EndInterrupt“

代码语言:javascript
复制
// 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 =函数(id,msgType,value) {并在Media.MEDIA_STATE :Media.MEDIA_STATE中添加一个条件.

代码语言:javascript
复制
 if(value == Media.MEDIA_END_INTERRUPT) {
     //do whatever you want
 }
票数 2
EN

Stack Overflow用户

发布于 2020-10-22 07:38:01

我修复了媒体插件本身的问题,使用getCurrentPosition方法,我能够检测到流是否被电话或语音邮件入侵。然后停下来,并再次rePlay音频。我希望这能帮助一个我花了很长时间的人让我的媒体插件和shoutcast一起工作。

代码语言:javascript
复制
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);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24830253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档