web-dev-qa-db-ja.com

Swift=でAVAudioPlayerからロック画面/コントロールセンターのオーディオコントロールを取得する方法

IOS開発は初めてなので、ここに行きます。オーディオを再生しているアプリがあります-AVAudioPlayerを使用して、アプリのアセットに名前で単一のファイルを読み込みます。ユーザーのライブラリを照会したくはありません。提供されたファイルのみを照会します。うまく機能しますが、ユーザーがロック画面から一時停止して音量を調整できるようにします。

func initAudioPlayer(file:String, type:String){
    let path = NSBundle.mainBundle().pathForResource(file, ofType: type)!
    let url = NSURL(fileURLWithPath: path)
    let audioShouldPlay = audioPlaying()
    do{
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)
        let audioPlayer:AVAudioPlayer = try AVAudioPlayer(contentsOfURL: url)
        audioPlayer.volume = slider.value
        audioPlayer.numberOfLoops = -1
        audioPlayer.prepareToPlay()
        if(audioShouldPlay){
            audioPlayer.play()
//                let mpic = MPNowPlayingInfoCenter.defaultCenter()
//                mpic.nowPlayingInfo = [MPMediaItemPropertyTitle:"title", MPMediaItemPropertyArtist:"artist"]
        }
    }
    catch{}
}

AVAudioSessionMPNowPlayingInfoCenterの私の使用は、他の関連する投稿を読んでからの単なる実験でした。

アプリのplistファイルでオーディオのバックグラウンドモードが有効になっている

17
nbpeth

BeginReceivingRemoteControlEvents()を呼び出す必要があります。呼び出さないと、実際のデバイスでは機能しません。

Swift 3.1

UIApplication.shared.beginReceivingRemoteControlEvents()

MPRemoteCommandCenterのカスタムアクションを指定する場合:

let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.nextTrackCommand.isEnabled = true
commandCenter.nextTrackCommand.addTarget(self, action:#selector(nextTrackCommandSelector))
26
Leo Dabus
func myplayer(file:String, type:String){
let path = NSBundle.mainBundle().pathForResource(file, ofType: type)!
let url = NSURL(fileURLWithPath: path)
let audioShouldPlay = audioPlaying()
do{
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    try AVAudioSession.sharedInstance().setActive(true)
    let audioPlayer:AVAudioPlayer = try AVAudioPlayer(contentsOfURL: url)
    audioPlayer.volume = slider.value
    audioPlayer.numberOfLoops = -1
    audioPlayer.prepareToPlay()
    if(audioShouldPlay){
        audioPlayer.play()
//                let mpic = MPNowPlayingInfoCenter.defaultCenter()
//                mpic.nowPlayingInfo = [MPMediaItemPropertyTitle:"title", 
MPMediaItemPropertyArtist:"artist"]
        }
    }
    catch{}
}
4
user6812502

ロック画面には既にオーディオコントロールがあります(「リモートコントロール」インターフェイス)。アプリのオーディオを制御したい場合は、 Appleのドキュメント で説明されているように、アプリをリモートコントロールターゲットにする必要があります。

2
matt

この問題があります。あなただけが必要です

audioSession.setCategory(.playback, mode: .default) or 
audioSession.setCategory(.playback, mode: .default, options: 
                                               .init(rawValue: 0)) 

この機能を実装するには、Media Playerフレームワークの MPRemoteCommandCenter および MPNowPlayingInfoCenter のクラスと AVPlayer を使用します。

import MediaPlayer
import AVFoundation

// Configure AVPlayer
var player = AVPlayer()

リモートコマンドハンドラーを構成する

カスタムイベントハンドラーをアタッチしてアプリの再生を制御できるMPRemoteCommandオブジェクトの形式でさまざまなコマンドを定義します。

    func setupRemoteTransportControls() {
    // Get the shared MPRemoteCommandCenter
    let commandCenter = MPRemoteCommandCenter.shared()

    // Add handler for Play Command
    commandCenter.playCommand.addTarget { [unowned self] event in
        if self.player.rate == 0.0 {
            self.player.play()
            return .success
        }
        return .commandFailed
    }

    // Add handler for Pause Command
    commandCenter.pauseCommand.addTarget { [unowned self] event in
        if self.player.rate == 1.0 {
            self.player.pause()
            return .success
        }
        return .commandFailed
    }
}

ディスプレイメタデータの提供

MPMediaItemおよびMPNowPlayingInfoCenterによって定義されたキーを使用してメタデータの辞書を提供し、MPNowPlayingInfoCenterのデフォルトインスタンスにその辞書を設定します。

func setupNowPlaying() {
    // Define Now Playing Info
    var nowPlayingInfo = [String : Any]()
    nowPlayingInfo[MPMediaItemPropertyTitle] = "My Movie"

    if let image = UIImage(named: "lockscreen") {
        nowPlayingInfo[MPMediaItemPropertyArtwork] =
            MPMediaItemArtwork(boundsSize: image.size) { size in
                return image
        }
    }
    nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = playerItem.currentTime().seconds
    nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = playerItem.asset.duration.seconds
    nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate

    // Set the metadata
    MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}

詳細については、Appleの公式を参照してください Documentation

1
Sreekuttan