【问题标题】:UIImagePickerController and application background modesUIImagePickerController 和应用程序后台模式
【发布时间】:2012-10-26 02:59:14
【问题描述】:

我正在构建一个支持视频播放和录制的应用程序(不是同时提供的,它只是它提供的两个独立的功能)。为了让应用程序进入后台并返回后播放视频,我必须在 plist 中的Required background modes 中添加一个App plays audio 项目(我使用MPMoviePlayerController 进行播放)。

但是,这会导致我的视​​频录制出现问题(我为此使用了UIImagePickerController)。基本上,即使选择器被关闭(通过取消按钮或完成选择媒体时),应用程序仍然保持音频录制会话运行。

如果我从 plist 中删除 App plays audio 项目,ImagePickerController 的音频会话会停止异常行为,但是我无法在从后台模式切换到应用程序时恢复 MPMoviePlayerViewController 的播放。

有没有一种方法可以自定义音频会话的处理,以便 MPMoviePlayerControllerUIImagePickerController 都能正常工作?

【问题讨论】:

  • 我对你说的话有点困惑。您正在应用程序中播放视频并希望它继续在后台播放?你指的是什么录音会话? UIImagePickerController 的音频会话?

标签: objective-c xcode uiimagepickercontroller mpmovieplayercontroller avaudiosession


【解决方案1】:

是的,有一种方法可以根据需要自定义音频会话的处理方式:不要尝试设置 App plays audio 设置。

相反,在您的 AppDelegate 代码(通常位于所提供的简单向导项目的 AppDelegate.m 中)中,在 applicationWillResignActive: 方法中提供代码,该代码将在您的 MPMoviePlayerController 中停止播放,然后使用 applicationDidBecomeActive:如果需要,可以在暂停的位置恢复播放。

这不仅可以让视频在暂时暂停后恢复,还可以让您保存状态,以便在应用从内存中删除或用户使其放弃吧。

【讨论】:

    【解决方案2】:

    您可以暂缓背景模式,而是使用通知来暂停/恢复播放器。请参阅UIApplication class reference 中的UIApplicationDidBecomeActiveNotificationUIApplicationWillResignActiveNotification

    您可以获取一些代码并在this class 中看到它的实现。以下是该类的一些相关代码:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(_didBecomeActive:)
                                                     name:UIApplicationDidBecomeActiveNotification
                                                   object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(_willResignActive:)
                                                 name:UIApplicationWillResignActiveNotification
                                               object:nil];
    
    - (void) _didBecomeActive:(NSNotification*)notification {
      if (_wasPlaying) {
        [_movieController play];
      }
    }
    
    - (void) _willResignActive:(NSNotification*)notification {
      _wasPlaying = _movieController.currentPlaybackRate != 0.0;
      if (_wasPlaying) {
        [_movieController pause];
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多