2012-04-25 44 views
14

Tôi muốn phát âm thanh ngay cả ở chế độ im lặng trong iPhone.Cách phát âm thanh bằng AVAudioPlayer khi ở Chế độ im lặng trong iPhone

Nó có thể được thực hiện bằng cách sử dụng AVAudioPlayer (Nếu không sử dụng AVAudioSession)

(dành cho iOS 3.0+)

Cảm ơn trước.

+4

Nếu thiết bị đang ở chế độ im lặng, không chơi âm thanh. Người dùng đã yêu cầu rõ ràng sự im lặng! –

+0

Tại sao không có AVAudioSession? –

+2

@JonathanGrynspan - điều đó có ý nghĩa khi người dùng _xác nhận rằng họ yêu cầu sự im lặng, nhưng nếu bạn tạo các ứng dụng có tính chất AV, bạn sẽ bị ngập với loại đánh giá này: "AUDIO KHÔNG LÀM VIỆC ★ ☆☆☆☆" –

Trả lời

27

Thực ra, bạn có thể thực hiện việc này. Nó được điều khiển qua Phiên âm thanh và không có gì để làm với chính bản thân số AVAudioPlayer. Tại sao bạn không muốn sử dụng AudioSession? Họ chơi đẹp với nhau ...

Trong ứng dụng của bạn, bạn nên khởi tạo Phiên âm thanh, và sau đó bạn cũng có thể cho biết chỉ định loại âm thanh bạn dự định phát. Nếu bạn là một trình phát nhạc, thì có nghĩa là người dùng sẽ muốn nghe âm thanh ngay cả khi nút chuyển chuông/im lặng được bật.

AudioSessionInitialize (NULL, NULL, NULL, NULL); 
    AudioSessionSetActive(true); 

    // Allow playback even if Ring/Silent switch is on mute 
    UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
    AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, 
          sizeof(sessionCategory),&sessionCategory); 

Tôi có một ứng dụng mà tôi thực hiện việc này và sử dụng AVAudioPlayer để phát âm thanh và bật khóa chuông/im lặng, tôi có thể nghe thấy âm thanh.

CẬP NHẬT (11/6/2013)

Trong ứng dụng tôi đã đề cập ở trên, nơi tôi đã sử dụng mã trên thành công, tôi có (đối với một số thời gian) được sử dụng đoạn mã sau thay vì để đạt được cùng kết quả:

 
     AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
     NSError *error = nil; 
     BOOL result = NO; 
     if ([audioSession respondsToSelector:@selector(setActive:withOptions:error:)]) { 
      result = [audioSession setActive:YES withOptions:0 error:&error]; // iOS6+ 
     } else { 
      [audioSession setActive:YES withFlags:0 error:&error]; // iOS5 and below 
     } 
     if (!result && error) { 
      // deal with the error 
     } 

     error = nil; 
     result = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&error]; 

     if (!result && error) { 
      // deal with the error 
     } 

Tôi nghĩ tôi sẽ đăng bài này thay thế, theo lời nhận xét gần đây nhất cho câu trả lời này. :-)

+0

Cảm ơn bạn đã câu trả lời của bạn, nó hoạt động rất tốt :) – Nima

+0

Rất vui khi nghe nó. :-) –

+0

Tôi đã từng sử dụng phương pháp này nhưng hiện tại nó không hoạt động nữa. Đã có ai nhận ra điều này chưa? –

22

MarkGranoff's solution là chính xác. Tuy nhiên, nếu bạn thích làm điều đó trong Obj-c thay vì C, các công trình sau cũng hoạt động:

NSError *error = nil; 
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error]; 
    [[AVAudioSession sharedInstance] setActive:YES error:&error]; 
+0

Cảm ơn wL_.Tôi thích mã Obj-C để đạt được điều này :) Hoạt động hoàn hảo – iOSAppDev

+0

Loại bỏ lỗi kiểm tra trong mã không làm cho nó Obj-C, ans của bạn chỉ là giống như ans gốc bởi MarkGranoff – Thiru

+0

@Thiru câu trả lời này là không thích hợp bây giờ. Nhưng nó đã được đăng trước khi hiệu chỉnh của Mark. –

3

Câu trả lời ở trên là chính xác. Sau đây là phiên bản Swift.

do { 
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
    //print("AVAudioSession Category Playback OK") 
    do { 
     try AVAudioSession.sharedInstance().setActive(true) 
     //print("AVAudioSession is Active") 
    } catch _ as NSError { 
     //print(error.localizedDescription) 
    } 
} catch _ as NSError { 
    //print(error.localizedDescription) 
} 
0

này chỉ đơn giản sẽ làm các trick (sử dụng AVAudioSession)

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
try AVAudioSession.sharedInstance().setActive(true) 
Các vấn đề liên quan