2017-08-17 135 views
1

我試圖在用戶選擇操作表上的選項時將音頻輸出更改爲設備。這是當我選擇音頻去設備,藍牙不會出現下一次:將音頻更改爲藍牙設備並返回

for input in AVAudioSession.sharedInstance().availableInputs!{ 
      if input.portType == AVAudioSessionPortBluetoothA2DP || input.portType == AVAudioSessionPortBluetoothHFP || input.portType == AVAudioSessionPortBluetoothLE{ 
       let bluetooth = UIAlertAction(title: input.portName, style: .default, handler: { 
        (alert: UIAlertAction!) -> Void in 
        let audioSession = AVAudioSession.sharedInstance() 
        do { 
         try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: AVAudioSessionCategoryOptions.allowBluetooth) 
         try audioSession.setActive(true) 
        } catch { 
         fatalError("Error Setting Up bluetooth output \(input.portName)") 
        } 


       }) 

       bluetooth.setValue(UIImage(named:"bluetooth.png"), forKey: "image") 
       optionMenu.addAction(bluetooth) 
      } 

let iphomeOutput = UIAlertAction(title: "iPhone", style: .default, handler: { 
       (alert: UIAlertAction!) -> Void in 
       let audioSession = AVAudioSession.sharedInstance() 
       do { 
        do { 
         try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: AVAudioSessionCategoryOptions.duckOthers) 
         try audioSession.setActive(true) 
        } catch { 
         fatalError("Error Setting Up audio output Phone") 
        } 
        try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.none) 
       } catch let error as NSError { 
        print("audioSession error turning off speaker: \(error.localizedDescription)") 
       } 
      }) 

      for description in currentRoute.outputs { 
       if description.portType == AVAudioSessionPortHeadsetMic{ 
        optionMenu.setValue(true, forKey: "checked") 
        break 
       } 
      } 
      optionMenu.addAction(iphomeOutput) 

回答

2

我也許能更有效地做到這一點,但是這是個什麼碼我結束了使用:

var deviceAction = UIAlertAction() 
     var headphonesExist = false 

     let audioSession = AVAudioSession.sharedInstance() 
     let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) 
     let currentRoute = audioSession.currentRoute 
     for input in audioSession.availableInputs!{ 
      if input.portType == AVAudioSessionPortBluetoothA2DP || input.portType == AVAudioSessionPortBluetoothHFP || input.portType == AVAudioSessionPortBluetoothLE{ 
           let localAction = UIAlertAction(title: input.portName, style: .default, handler: { 
            (alert: UIAlertAction!) -> Void in 

            do { 
             try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.none) 
            } catch let error as NSError { 
             print("audioSession error turning off speaker: \(error.localizedDescription)") 
            } 

            do { 
             try audioSession.setPreferredInput(input) 
            }catch _ { 
             print("cannot set mic ") 
            } 


           }) 

       for description in currentRoute.outputs { 
        if description.portType == AVAudioSessionPortBluetoothA2DP { 
         localAction.setValue(true, forKey: "checked") 
         break 
        }else if description.portType == AVAudioSessionPortBluetoothHFP { 
          localAction.setValue(true, forKey: "checked") 
          break 
        }else if description.portType == AVAudioSessionPortBluetoothLE{ 
         localAction.setValue(true, forKey: "checked") 
         break 
        } 
       } 
       localAction.setValue(UIImage(named:"bluetooth.png"), forKey: "image") 
        optionMenu.addAction(localAction) 

      } else if input.portType == AVAudioSessionPortBuiltInMic || input.portType == AVAudioSessionPortBuiltInReceiver { 

       deviceAction = UIAlertAction(title: "iPhone", style: .default, handler: { 
        (alert: UIAlertAction!) -> Void in 

        do { 
         try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.none) 
        } catch let error as NSError { 
         print("audioSession error turning off speaker: \(error.localizedDescription)") 
        } 

        do { 
         try audioSession.setPreferredInput(input) 
        }catch _ { 
         print("cannot set mic ") 
        } 

       }) 

       for description in currentRoute.outputs { 
        if description.portType == AVAudioSessionPortBuiltInMic || description.portType == AVAudioSessionPortBuiltInReceiver { 
         deviceAction.setValue(true, forKey: "checked") 
         break 
        } 
       } 

      } else if input.portType == AVAudioSessionPortHeadphones || input.portType == AVAudioSessionPortHeadsetMic { 
       headphonesExist = true 
       let localAction = UIAlertAction(title: "Headphones", style: .default, handler: { 
        (alert: UIAlertAction!) -> Void in 

        do { 
         try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.none) 
        } catch let error as NSError { 
         print("audioSession error turning off speaker: \(error.localizedDescription)") 
        } 

        do { 
         try audioSession.setPreferredInput(input) 
        }catch _ { 
         print("cannot set mic ") 
        } 
       }) 
       for description in currentRoute.outputs { 
        if description.portType == AVAudioSessionPortHeadphones { 
         localAction.setValue(true, forKey: "checked") 
         break 
        } else if description.portType == AVAudioSessionPortHeadsetMic { 
         localAction.setValue(true, forKey: "checked") 
         break 
        } 
       } 

       optionMenu.addAction(localAction) 
      } 
     } 

     if !headphonesExist { 
      optionMenu.addAction(deviceAction) 
     } 

     let speakerOutput = UIAlertAction(title: "Speaker", style: .default, handler: { 
      (alert: UIAlertAction!) -> Void in 

      do { 
       try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker) 
      } catch let error as NSError { 
       print("audioSession error turning on speaker: \(error.localizedDescription)") 
      } 
     }) 
     for description in currentRoute.outputs { 
      if description.portType == AVAudioSessionPortBuiltInSpeaker{ 
       speakerOutput.setValue(true, forKey: "checked") 
       break 
      } 
     } 
     speakerOutput.setValue(UIImage(named:"speaker.png"), forKey: "image") 
     optionMenu.addAction(speakerOutput) 

     let cancelAction = UIAlertAction(title: "Hide", style: .cancel, handler: { 
      (alert: UIAlertAction!) -> Void in 

     }) 
     optionMenu.addAction(cancelAction) 
     self.present(optionMenu, animated: true, completion: nil) 
+0

這太神奇了。謝謝。 –

+0

不錯,謝謝。 – FreeGor