Androidマルチメディア-MediaPlayerモーニングロックおよびオーディオフォーカス


MediaPlayerのモーニングロック
一般的にMediaPlayerを使用してオーディオストリームを再生する場合は、Activityで直接使用するのではなく、MediaPlayerを搭載するサービスを推奨します.しかし、Androidシステムの消費電力設計では、バッテリー消費量を節約するために、デバイスが睡眠状態にある場合、CUPやWifiハードウェアなど、デバイスに必要な特性を低減または閉鎖しようとします.その後、バックグラウンドで音楽を再生するアプリケーションであれば、CUPを低減することは、バックグラウンドで動作するときにオーディオの正常な再生を妨げる可能性があります.Wifiをオフにすると、ネットワークオーディオストリームの取得にエラーが発生する可能性があります.
MediaPlayerのベアラサービスがシステムの睡眠中に正常に動作し続けることを確保するために、Androidはウェイクロック(wake locks)を起動するメカニズムを提供しています.システムがスリープしても、ハードウェアをロックして正常に動作します.
MediaPlayerが稼働している間は、システムが眠っていてもCUPが正常に稼働していることを確認し、MediaPlayer.setWakeMode()を使用してMediaPlayerに起動ロックを設定する必要があります.以下はsetWakMode()の署名です.
  setWakeMode(Context context, int mode)
1番目のパラメータは現在のコンテキストで、2番目のパラメータはロックが必要な状態でintタイプの定数に設定され、PowerManagerというfinalクラスで定義されています.PowerManagerは、Androidの消費電力を管理するためのロック状態で、CUPをロックすることに関連して、CUP、スクリーン、キーボードなどの各種のホールドオン状態をそれぞれ4種類設定していますが、ここではPARTIAL_に設定するだけですWAKE_ロックでいいです.
mediaPlayer = new MediaPlayer();
//   CUP  
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
は一般的にロックに関しては通常ロック解除が必要であるが、ここでの起動説はMediaPlayerに関連付けられているので、使用後にMediaPlayer()をリリースするだけでよく、明示的にロック解除する必要はない.setWakeModeを使用して起動ロックを設定する場合は、アプリケーションに対応する権限を付与する必要があります.
wifiハードウェアをロックしてシステムが寝ている間に正常に動作する方法について説明します.wifiロックはWifiLockで操作され、WifiLockはWifiManagerで管理され、WifiManager.createWifiLock()でWifiロックされます.
    WifiManager.WifiLock createWifiLock(int lockType, String tag)
この方法は複数のリロードがあり、ここで紹介するこれは、1番目のパラメータにロックの状態を設定し、1つのintタイプの定数としてContextクラスに定義し、ここでのアプリケーションシーンは一般的にWIFI_に設定するMODE_FULLでいいです.2番目のパラメータはWifiLockのフラグで、wifiLockを決定します.
wifiLock= ((WifiManager) getSystemService(this.WIFI_SERVICE)).createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock");
wifiLock.acquire();                 
もちろん、アプリケーションでWifiをロックした後、MediaPlayer.release()の時にwifiハードウェアのロックを解除する必要がありますが、予期せぬシャットダウンを避けるためにはAndroidコンポーネントのonDestory()で解放し、Wifiロックを解放するにはWifiLock.release()を使用することが望ましいです.
/**
*     
*/
 protected void stop() {
	if (mediaPlayer != null && mediaPlayer.isPlaying()) {
              mediaPlayer.stop();
              mediaPlayer.release();
              mediaPlayer = null;
              //   wifi 
             wifiLock.release();
             btn_play.setEnabled(true);
             Toast.makeText(this, "    ", 0).show();
         }
 
     }
 
     @Override
     protected void onDestroy() {
         //  activity         
         if (mediaPlayer != null && mediaPlayer.isPlaying()) {
             mediaPlayer.stop();
             mediaPlayer.release();
             mediaPlayer = null;
             //   wifi 
             wifiLock.release();
         }
         super.onDestroy();
     }

MediaPlayerのオーディオフォーカス
Androidはマルチタスクのオペレーティングシステムであることはよく知られているので、オーディオの再生には、いくつかの異なるメディアサービスが同時に再生される可能性があります.これにより、比較的雑然とした音声環境を招き、重要な音声注意を逃す可能性があります.Android 2.2の後、Androidは、オーディオフォーカスと呼ばれるデバイスのオーディオ出力を使用するメカニズムを交渉するアプリケーションを提供します.
アプリケーションがオーディオまたは通知を出力する必要がある場合、オーディオフォーカスを要求する必要があり、オーディオフォーカスを要求した後、オーディオフォーカスの変換を傍受し、オーディオフォーカスが変換された場合、戻ってきたオーディオフォーカスコードに基づいて対応する処理を行う.オーディオフォーカスの登録は、オーディオマネージャのAudioManager.requestAudioFocus()メソッドを使用して設定します.署名は次のとおりです.
    int requestAudioFocus(AudioManager.OnAudioFocusChangeListener l, int streamType, int durationHint)
このメソッドの戻り値はintタイプであり、その意味はAudioManagerでAUDOFOCUS_を定数で表すように定義されている.REQUEST_FAILED(オーディオフォーカス取得成功)、AUDOFOCUS_REQUEST_GRANTED(オーディオフォーカスの取得に失敗しました).ここで重要なのは、オーディオフォーカスが変換された場合、現在のアプリケーションがMediaPlayerをどのように管理するか、2番目のパラメータがメディアストリームのタイプ、3番目のパラメータが持続的な状態であるかを設定できる第1のパラメータである.
AudioManager.OnAudioFocusChangeListenerはオーディオフォーカス変換のリスナーであり、オーディオフォーカス変換時にonAudioFocusChange(int focusChange)をコールバックする方法が必要である.現在のオーディオフォーカスが現在適用されている状態コードを表すパラメータがあり、この状態コードによって対応する操作を指定すると、オーディオの状態が変化する場合があり、必ずしもオーディオの再生を停止する必要はありません.
focusChangeにはいくつかのステータスコードがあります.
AUDIOFOCUS_GAIN:オーディオフォーカスを取得します.
AUDIOFOCUS_LOSS:オーディオフォーカスが失われ、長い間持続します.これはMediaPlayerの再生を停止する必要があります.
AUDIOFOCUS_LOSS_TRANSIENT:オーディオフォーカスが失われますが、長くは続かないため、MediaPlayerの再生を一時停止し、オーディオフォーカスの再取得を待つ必要があります.
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:一時的にオーディオフォーカスを失いますが、再生を停止する必要はありません.音声を下げる方法だけです.
 audioManager = (AudioManager) getSystemService(this.AUDIO_SERVICE);
 int result = audioManager.requestAudioFocus(
	  new OnAudioFocusChangeListener() {

	      @Override
	     public void onAudioFocusChange(int focusChange) {
	          switch (focusChange) {
	          case AudioManager.AUDIOFOCUS_GAIN:
	              //       
	             if (!mediaPlayer.isPlaying()) {
	                 mediaPlayer.start();
	             }
	             //     
	             mediaPlayer.setVolume(1.0f, 1.0f);
	             break;

	         case AudioManager.AUDIOFOCUS_LOSS:
	             //          ,  MediaPlayer
	             if (mediaPlayer.isPlaying())
	                 mediaPlayer.stop();
	             mediaPlayer.release();
	             mediaPlayer = null;
	             break;

	         case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
	             //         ,              
	             if (mediaPlayer.isPlaying())
	                 mediaPlayer.pause();
	             break;
	         case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
	             //       ,      ,      
	             if (mediaPlayer.isPlaying()) {
	                 mediaPlayer.setVolume(0.1f, 0.1f);
	             }
	             break;
	         }
	     }
	 }, AudioManager.STREAM_MUSIC,
	 AudioManager.AUDIOFOCUS_GAIN);

まとめ 
以上、MediaPlayerのいくつかの高度な内容について説明しましたが、MediaPlayerの使用を把握した上で、音楽再生系のアプリケーションを開発する際に手応えを得ることができます.ユーザー体験の面から、実際にプレーヤー類のソフトウェアを開発する場合は、AUDIO_を傍受する必要があります.BECOMING_NOISYのブロードキャストは、オーディオ出力源が他の出力源からデバイススピーカに変換されたときにこのブロードキャストを発行し、オーディオ出力源がデバイススピーカに変更されたときにブロードキャストを傍受し、再生を停止することで、イヤホンや追加のオーディオ出力ハードウェアがデバイスと接続されていないときに、スピーカからオーディオ再生を再出力しないようにします.
ソースリンク:http://download.csdn.net/detail/duanyu218/7475569