1

Cordova とネイティブの AudioStreamer プラグイン呼び出しで作成されたオーディオ プレーヤー アプリがあります。

Cordova プラグインを呼び出してネイティブ プレーヤーを起動するときに、..

- (void)startStream:(CDVInvokedUrlCommand*)command
    streamer = [[[AudioStreamer alloc] initWithURL:url] retain];
    [streamer start];

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self canBecomeFirstResponder];

そして、ストリームを停止すると:

- (void)stopStream:(CDVInvokedUrlCommand*)command
   [streamer stop];
   [streamer release];
   streamer = nil;

   [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 

それはすべて完璧に機能しますが、リモートイベントをどこに置くべきかわかりません...

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
     switch (event.subtype) {
              case UIEventSubtypeRemoteControlTogglePlayPause:
              NSLog(@"PAUSE!!!");
              break;

              case UIEventSubtypeRemoteControlPlay:
              NSLog(@"PAUSE!!!");
        break;
              case UIEventSubtypeRemoteControlPause:
                       NSLog(@"PAUSE!!!");
                       break;
              case UIEventSubtypeRemoteControlStop:
                       NSLog(@"PAUSE!!!");
                       break;
              default:
              break;
}

}

4

1 に答える 1

0

"[self canBecomeFirstResponder];" このメソッドは UIResponder 用であり、CDVPlugin は NSObject から拡張されているため、機能しません。

このオーバーライド pluginInitialize メソッドの場合は、次のようになります。

- (void)pluginInitialize
{
    [super pluginInitialize];
    [[AVAudioSession sharedInstance] setDelegate:self];

    NSError *error = nil;
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setMode:AVAudioSessionModeDefault error:&error];
    if (error)
        [[[UIAlertView alloc] initWithTitle:@"Audio Error" message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];

    error = nil;
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];
    if (error)
        [[[UIAlertView alloc] initWithTitle:@"Audio Error" message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];


    MainViewController *mainController = (MainViewController*)self.viewController;
    mainController.remoteControlPlugin = self;
    [mainController canBecomeFirstResponder];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
}

注意、MainViewController はファーストレスポンダーなので、すべてのリモート イベントを取得します。MainViewController.h にプロパティを追加すると、コントローラーは目的のプラグインに渡すことができます

@property (nonatomic, weak) CDVPlugin *remoteControlPlugin;

そして、リモートプラグインメソッドを呼び出すようなリモートイベントメソッドを追加します

- (void)remoteControlReceivedWithEvent:(UIEvent*)event
{
    if ([self.remoteControlPlugin respondsToSelector:@selector(remoteControlReceivedWithEvent:)])
        [self.remoteControlPlugin performSelector:@selector(remoteControlReceivedWithEvent:) withObject:event];
}

次に、プラグインにも remoteControlReceivedWithEvent を入れます。

于 2014-03-20T11:15:26.373 に答える