我試圖讓用戶從他們的庫中選擇一首歌曲,並在不同的視圖控制器中播放它。我能夠選擇歌曲並播放它們,但我不知道如何在後臺播放它們。謝謝!如何使用MPMediaPickerController選擇歌曲在Swift中播放背景音樂?
class ViewController: UIViewController,
MPMediaPickerControllerDelegate, AVAudioPlayerDelegate {
var myMusicPlayer: MPMusicPlayerController?
var mediaPicker: MPMediaPickerController?
var backgroundMusicPlayer:AVAudioPlayer = AVAudioPlayer()
@IBAction func musicBtn(sender: AnyObject) {
displayMediaPickerAndPlayItem()
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
func musicPlayerStateChanged(notification: NSNotification){
print("Player State Changed")
/* Let's get the state of the player */
let stateAsObject =
notification.userInfo!["MPMusicPlayerControllerPlaybackStateKey"]
as? NSNumber
if let state = stateAsObject{
/* Make your decision based on the state of the player */
switch MPMusicPlaybackState(rawValue: state.integerValue)!{
case .Stopped:
/* Here the media player has stopped playing the queue. */
print("Stopped")
case .Playing:
/* The media player is playing the queue. Perhaps you
can reduce some processing that your application
that is using to give more processing power
to the media player */
print("Paused")
case .Paused:
/* The media playback is paused here. You might want
to indicate by showing graphics to the user */
print("Paused")
case .Interrupted:
/* An interruption stopped the playback of the media queue */
print("Interrupted")
case .SeekingForward:
/* The user is seeking forward in the queue */
print("Seeking Forward")
case .SeekingBackward:
/* The user is seeking backward in the queue */
print("Seeking Backward")
}
}
}
func nowPlayingItemIsChanged(notification: NSNotification){
print("Playing Item Is Changed")
let key = "MPMusicPlayerControllerNowPlayingItemPersistentIDKey"
let persistentID =
notification.userInfo![key] as? NSString
if let id = persistentID{
/* Do something with Persistent ID */
print("Persistent ID = \(id)")
}
}
func volumeIsChanged(notification: NSNotification){
print("Volume Is Changed")
/* The userInfo dictionary of this notification is normally empty */
}
func mediaPicker(mediaPicker: MPMediaPickerController,
didPickMediaItems mediaItemCollection: MPMediaItemCollection){
print("Media Picker returned")
/* Instantiate the music player */
myMusicPlayer = MPMusicPlayerController()
if let player = myMusicPlayer{
player.beginGeneratingPlaybackNotifications()
/* Get notified when the state of the playback changes */
NSNotificationCenter.defaultCenter().addObserver(self,
selector: "musicPlayerStateChanged:",
name: MPMusicPlayerControllerPlaybackStateDidChangeNotification,
object: nil)
/* Get notified when the playback moves from one item
to the other. In this recipe, we are only going to allow
our user to pick one music file */
NSNotificationCenter.defaultCenter().addObserver(self,
selector: "nowPlayingItemIsChanged:",
name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification,
object: nil)
/* And also get notified when the volume of the
music player is changed */
NSNotificationCenter.defaultCenter().addObserver(self,
selector: "volumeIsChanged:",
name: MPMusicPlayerControllerVolumeDidChangeNotification,
object: nil)
/* Start playing the items in the collection */
player.setQueueWithItemCollection(mediaItemCollection)
player.play()
/* Finally dismiss the media picker controller */
mediaPicker.dismissViewControllerAnimated(true, completion: nil)
}
}
func mediaPickerDidCancel(mediaPicker: MPMediaPickerController) {
/* The media picker was cancelled */
print("Media Picker was cancelled")
mediaPicker.dismissViewControllerAnimated(true, completion: nil)
}
func stopPlayingAudio(){
NSNotificationCenter.defaultCenter().removeObserver(self)
if let player = myMusicPlayer{
player.stop()
}
}
func displayMediaPickerAndPlayItem(){
mediaPicker = MPMediaPickerController(mediaTypes: .AnyAudio)
if let picker = mediaPicker{
print("Successfully instantiated a media picker")
picker.delegate = self
picker.allowsPickingMultipleItems = true
picker.showsCloudItems = true
picker.prompt = "Pick a song please..."
view.addSubview(picker.view)
presentViewController(picker, animated: true, completion: nil)
} else {
print("Could not instantiate a media picker")
}
}
}
感謝您的幫助。有沒有辦法將這個與mpmediapickercontroller結合?所以用戶可以從他們的音樂庫中選擇一首歌曲。 – Brandex07
Ofcourse。你必須把它實施到讓pickSong。 –
嗯你介意給我看怎麼樣?謝謝 – Brandex07