我已经创建了一个iOS应用程序,它在后台运行时播放音频。如果音频被中断(即:电话),音频就会停止,再也不会恢复。
我认为这是因为cordova媒体插件没有实现audioPlayerEndInterruption
我对Javascript很在行,但对目标C几乎一无所知。有人有关于如何添加此功能的建议吗?
是否有不同的媒体插件实现audioPlayerEndInterruption,还是有一种简单的方法将audioPlayerEndInterruption集成到cordova插件中?
发布于 2014-09-14 14:16:54
只是在这里跟进。最后,我为此编写了一个插件,它覆盖了一些默认的cordova媒体插件(v0.2.12)方法。我在这里发布了一个链接,但是代码很混乱。我只是想得到一些有用的东西,而不是真正的计划分享。但这里(没有提供文件,对不起):
https://github.com/stevethorson/Interruptible-Cordova-Media.git
发布于 2014-07-18 18:15:03
CDVSound.h -modify:add:,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 -add:
- (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“
// 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中添加一个条件.
if(value == Media.MEDIA_END_INTERRUPT) {
//do whatever you want
}发布于 2020-10-22 07:38:01
我修复了媒体插件本身的问题,使用getCurrentPosition方法,我能够检测到流是否被电话或语音邮件入侵。然后停下来,并再次rePlay音频。我希望这能帮助一个我花了很长时间的人让我的媒体插件和shoutcast一起工作。
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);
https://stackoverflow.com/questions/24830253
复制相似问题