

スマホアプリ起動時に再生中の音楽を停止させることができますが、  
これをXamarin(C#)で実装しようと考えております。  
実装例を探しているのですが、見つけることができておりません。

もしご存知でしたら、ご教授のほどお願い致します。


CC BY-SA 3.0
2016-07-08T06:15:44.087
27452
2016-07-08T13:00:22.583
9561
question
ios android c# xamarin
スマホアプリ起動時(iOS/Android)に再生中の音楽を停止させる方法


## iOS（標準の ミュージック アプリ） の場合

標準のミュージックアプリは、 `MPMusicPlayerController.iPodMusicPlayer` で制御できます。

[code]

    var player = MediaPlayer.MPMusicPlayerController.iPodMusicPlayer;
    if (player.PlaybackState == MediaPlayer.MPMusicPlaybackState.Playing)
    {
        player.Pause();
    }
    
[/code]

## iOS（ミュージックアプリに限らない） の場合

ミュージックアプリに限らない場合は、`AVFoundation.AVAudioSession` で行えます。

[code]

    var session = AVFoundation.AVAudioSession.SharedInstance();
    NSError err;
    session.SetActive(true, out err);
    
[/code]

`AVAudioSession` の方が、「他のアプリの音量を小さくして、自分のアプリの音声を再生する」など、細かな制御ができます。

  * [アプリで音を鳴らす方法（簡単な方法編） - yuriken27's blog](http://yuriken27.hatenablog.com/entry/20130217/1361113306)
  * [articles of samekard: AVAudioSession細かいことまとめ(late 2014)](https://samekard.blogspot.jp/2014/12/avaudiosessionlate-2014_3.html)
  * [AVAudioSession and Ducking](https://thedon.me/2016/03/16/avaudiosession-and-ducking/)

## Android の場合

Android の場合は、 `AudioManager.RequestAudioFocus`
で、オーディオフォーカスを排他的に奪うことで、他のアプリの再生を停止できます。

以下の例は、アプリの画面が表示された時に、フォーカスを奪って他アプリの再生を止め、自アプリがバックグラウンドに回った時に明け渡します。

[code]

    public class MainActivity : Activity, Android.Media.AudioManager.IOnAudioFocusChangeListener
    {
        Android.Media.AudioManager _audioManager;
    
        protected override void OnResume()
        {
            base.OnResume();
    
            _audioManager = (Android.Media.AudioManager)GetSystemService(Context.AudioService);
    
            // フォーカスを排他的に奪う
            _audioManager.RequestAudioFocus(this, Android.Media.Stream.Music, Android.Media.AudioFocus.GainTransientExclusive);
        }
    
        public void OnAudioFocusChange([GeneratedEnum] Android.Media.AudioFocus focusChange)
        {
           // フォーカスを取得できたら呼ばれる
        }
    
        protected override void OnPause()
        {
            // フォーカスを明け渡す
            _audioManager.AbandonAudioFocus(this);
            base.OnPause();
        }
    }
    
[/code]

  * [Managing Audio Playback part2｜Android開発記録雑記](http://ameblo.jp/negiiiimo/entry-11488832997.html)
  * [音を制御する - AudioManager - Qiita](http://qiita.com/KeithYokoma/items/3896f5934478fa560a50)
  * [Fire TV でのオーディオフォーカスの管理 - アマゾン アプリ 開発者ポータル](https://developer.amazon.com/public/ja/solutions/devices/fire-tv/docs/managing-audio-focus) \- FireTV の話題ですが、中身はAndroidなので参考になります

オーディオ関連は、各プラットフォームでも制御が複雑で難しいので、まずは Android/iOS
それぞれのAPIについて知識を得たほうがよろしいかと思います。


CC BY-SA 3.0
2016-07-08T13:00:22.583
27459
2016-07-08T13:00:22.583
15190
27452
answer