2015-05-25 17 views
6

Cố gắng tìm hiểu cách đọc các nút âm lượng của tai nghe Apple để sử dụng làm trình kích hoạt cho màn trập máy ảnh (như ứng dụng Apple Camera).Sự kiện điều khiển từ xa trong iOS với Swift

Từ các tài liệu trên Remote Control Events, Remote Control Received With Event, và this git repo, tôi đã chắp ghép rằng tôi có lẽ sẽ cần một đối tượng AVAudioPlayer, .beginReceivingRemoteControlEvents(), và remoteControlReceivedWithEvent, cùng với tạo ra quan điểm này canBecomeFirstResponder()return true.

import UIKit 
import AVFoundation 

class ViewController: UIViewController, AVAudioPlayerDelegate { 
    var player: AVAudioPlayer! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     var session: AVAudioSession = AVAudioSession.sharedInstance() 
     session.setActive(true, error: nil) 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     println("viewDidAppear worked...") 
     self.becomeFirstResponder() 
     UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 
    } 

    override func canBecomeFirstResponder() -> Bool { 
     return true 
    } 

    override func remoteControlReceivedWithEvent(event: UIEvent) { 
     let rc = event.subtype 
     println("does this work? \(rc.rawValue)") 
     //takePicture() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

tôi mong đợi để có được "does this work" khi nhấn nút âm lượng trên tai nghe, thay vào đó tôi chỉ nhìn thấy nó điều chỉnh âm lượng tai nghe như bình thường. Vì vậy, tôi phải thiếu một cái gì đó, có thể với một delegate hoặc AVSession?

Trả lời

3

Tôi đã đăng chéo số này trên r/swift, nơi tôi được thông báo có thể yêu cầu phát âm thanh (được trích dẫn trực tiếp từ tài liệu).

Vì vậy, mặc dù đây không phải là giải pháp lý tưởng, nó hoạt động cho mục đích sử dụng riêng của tôi.

import UIKit 
import AVFoundation 
import MediaPlayer 

class ViewController: UIViewController, AVAudioPlayerDelegate { 
    var testPlayer: AVAudioPlayer? = nil 

    func loadSound(filename: NSString) -> AVAudioPlayer { 
     let url = NSBundle.mainBundle().URLForResource(filename as String, withExtension: "caf") 
     var error: NSError? = nil 
     let player = AVAudioPlayer(contentsOfURL: url, error: &error) 
     if error != nil { 
      println("Error loading \(url): \(error?.localizedDescription)") 
     } else { 
      player.prepareToPlay() 
     } 
     return player 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.testPlayer = self.loadSound("silence") 
     self.testPlayer?.numberOfLoops = -1 
     self.testPlayer?.play() 
    } 

    override func canBecomeFirstResponder() -> Bool { 
     return true 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     self.becomeFirstResponder() 
     UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 
    } 

    override func remoteControlReceivedWithEvent(event: UIEvent) { 
     let rc = event.subtype 
     println("rc.rawValue: \(rc.rawValue)") 
     // take photo 
    } 
} 

tôi nhận thấy rằng trong ứng dụng camera của Apple, các nút +/- khối lượng kích hoạt máy ảnh, và tạm dừng nút microphone/đóng bất kỳ hoạt động âm thanh trong ứng dụng khác, nhưng trong việc thực hiện này các nút âm lượng vẫn điều khiển âm lượng (và bất kỳ âm thanh nào đã bị tạm dừng khi ứng dụng được khởi chạy).

Một rc.rawValue: 103 tương ứng với một nhấp chuột duy nhất của nút microphone, một nhấp đúp chuột trả 104, và một nhấp chuột triple trả 105, và sau đó thỉnh thoảng chạm một cặp vợ chồng tại một thời điểm trả về một 108 hoặc 109.

+0

Điều này làm việc cho tôi (với sửa đổi nhỏ cho Swift 3) một cách riêng tư. Có ai biết nếu sử dụng như thế này sẽ được chấp nhận cho các cửa hàng ứng dụng? – triiiiista

Các vấn đề liên quan