質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

2343閲覧

イヤホンを抜いた際に、再生中のサウンドデータが停止するようにしたい

ThanksThankyou

総合スコア11

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2016/11/12 12:14

編集2016/11/12 13:59

###前提・実現したいこと
現在、Swift3で音声ファイルを利用したiPhoneアプリを開発しています。

###発生している問題・エラーメッセージ
下記のサイトを参考にSwift3でコードを記述しているのですが、
http://nackpan.net/blog/2015/09/29/ios-swift-phone-call-and-route-change/
NSNotification.Name.AVAudioSessionRouteChangeが機能していない模様です。

func addAudioSessionObservers() { AVAudioSession.sharedInstance() let center = NotificationCenter.default center.addObserver( self, selector: #selector(self.handleInterruption), name: NSNotification.Name.AVAudioSessionInterruption, object: nil) center.addObserver( self, selector: #selector(self.audioSessionRouteChanged), name: NSNotification.Name.AVAudioSessionRouteChange, object: nil) }

AVAudioSessionRouteChangeの記述をUIKeyboardWillShowやUIKeyboardWillHideにしますと、機能しますので、AVAudioSessionRouteChangeの仕様変更などがあったのかな...と調べておりますが、それらしき情報は見当たりませんでした。

原因が分かる方がいらっしゃいましたら、お教え頂けますと大変ありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「機能しない」というのは、具体的にどういう動作になっているのでしょうか?

質問のコードをコピペして、元のサンプルに記載されていたhandleInterruptionメソッドと
audioSessionRouteChangedメソッドをそのままコピペして実行してみたら、
イヤホンの抜き差しをするタイミングでちゃんとaudioSessionRouteChangedメソッドが呼ばれました。

もしかしたら勘違いされているかもしれませんが、元のサンプルに「音楽を再生していた場合自動的に停止します」
と書かれているのは、標準のミュージックプレイヤーを使ってバックグラウンドで音楽を再生している場合
ミュージックプレイヤーが自動的に再生を停止するという意味だと思います。
自分のアプリの中でAVAudioPlayer等を使って再生しているなら、.oldDeviceUnavailableを
通った時に自分でaudioPlayer.stop()等を実行して再生を止める必要があると思います。

「機能しない」というのが、もしそれ以前の話で、何かエラーが発生して止まっているとか
audioSessionRouteChangedメソッドが呼ばれていないとかいうことであれば、
エラーメッセージの内容や呼び出されているかどうかをどうやって確認したかを質問に追記してください。

投稿2016/11/13 01:01

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ThanksThankyou

2016/11/13 02:02 編集

TakeOneさま、ご質問いただきありがとうございます☆ その後、色々と試行錯誤しましてaudioSessionRouteChangedメソッドは呼ばれるようになりました。(こちらはcase .oldDeviceUnavailable:の直後にprint("通った")とprint関数を書いたところコンソールに「通った」と表示されたことで確認しております。) ただ、そのprint関数の次の行にpushPause(pauseButton)という独自の再生停止メソッドを記述し、再生を停止しようとしているのですが、 `libc++abi.dylib: terminating with uncaught exception of type realm::IncorrectThreadException: Realm accessed from incorrect thread.` というエラーが出てアプリが落ちてしまいます。 このpushPause(pauseButton)は他でも4箇所ほど再生を停止するのに利用しておりまして、そこでは全く問題なく再生が停止するので、原因究明に手間取っております。 別の問題となってしまいましたが、何かおわかりになればお教え頂けますとありがたいです☆また、不明な点がございましたらご質問よろしくお願い申し上げます。
ThanksThankyou

2016/11/13 02:36 編集

ちなみに、pushPauseのメソッドは @IBAction func pushPause(_ sender: AnyObject) { audioPlayer.pause() // タイマー停止 timer.invalidate() updateScreen() } という内容となっております。その他の箇所では正常に機能するので不思議です。updateScreen()の中でRealmを扱っているのでそれが原因か、もしくは、pushPause(pauseButton)をイヤホンのトグルで再生停止をするのに利用しているためそちらとの兼ね合いでエラーが起きたのか、などと色々考えております。
TakeOne

2016/11/13 02:36

> `libc++abi.dylib: terminating with uncaught exception of type realm::IncorrectThreadException: Realm accessed from incorrect thread.` というエラーが出てアプリが落ちてしまいます。 エラーメッセージから、おそらくaudioSessionRouteChangedメソッドは、 メインスレッドでない別のスレッドで実行されていて、 その延長でRealmのデータベースを操作しようとして 「Realm accessed from incorrect thread」 というエラーになったのだと思います。 pushPause(pauseButton)の呼び出しを以下のようにメインスレッドに回してから 呼び出すようにするとうまくいくかもしれません。 ``` DispatchQueue.main.async { self.pushPause(self.pauseButton) } ```
ThanksThankyou

2016/11/13 02:53 編集

TakeOneさま、 早速のご回答、誠にありがとうございます☆ 早速お教え頂いた方法で試したところ1回目にイヤホンを抜いた際には音声が停止しました!!(また画面も更新されました。) ただ、そのままイヤホンを差し込み2回目にイヤホンを抜いた際には、audioSessionRouteChangedメソッドは呼ばれなくなっております...。どうしたらよいでしょうか?
ThanksThankyou

2016/11/13 07:58

TakeOneさま、 お世話になっております☆先ほどaddAudioSessionObservers()とremoveAudioSessionObservers()の位置を調整したところ、無事に問題解決いたしました☆(^▽^)☆ありがとうございます!!これで、iPhoneアプリ正式配信にまた一歩近くことができました。また色々質問させて頂くことがあるかもしれませんが、その際は何卒よろしくお願い申し上げます。この度は本当にありがとうございました!!☆(^▽^)☆(iPhoneアプリ正式配信は12月中旬を予定しております☆)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問