page.title=Dealing with Audio Output Hardware
parent.title=Managing Audio Playback
parent.link=index.html

trainingnavtop=true
previous.title=Managing Audio Focus
previous.link=audio-focus.html

@jd:body

 
<div id="tb-wrapper"> 
<div id="tb">

<h2>This lesson teaches you to</h2>
<ol>
  <li><a href="#CheckHardware">Check What Hardware is Being Used</a></li>
  <li><a href="#HandleChanges">Handle Changes in the Audio Output Hardware</a></li>
</ol>


<h2>You should also read</h2>
<ul>
  <li><a href="{@docRoot}guide/topics/media/mediaplayer.html">Media Playback</a></li>
</ul>


</div> 
</div>

<p>Users have a number of alternatives when it comes to enjoying the audio from their Android
devices. Most devices have a built-in speaker, headphone jacks for wired headsets, and many also
feature Bluetooth connectivity and support for A2DP audio. </p>

 
<h2 id="CheckHardware">Check What Hardware is Being Used</h2> 
 
<p>How your app behaves might be affected by which hardware its output is being routed to.</p>

<p>You can query the {@link android.media.AudioManager} to determine if the audio is currently
being routed to the device speaker, wired headset, or attached Bluetooth device as shown in the
following snippet:</p>

<pre>
if (isBluetoothA2dpOn()) {
    // Adjust output for Bluetooth.
} else if (isSpeakerphoneOn()) {
    // Adjust output for Speakerphone.
} else if (isWiredHeadsetOn()) {
    // Adjust output for headsets
} else { 
    // If audio plays and noone can hear it, is it still playing?
}
</pre>


<h2 id="HandleChanges">Handle Changes in the Audio Output Hardware</h2> 

<p>When a headset is unplugged, or a Bluetooth device disconnected, the audio stream
automatically reroutes to the built in speaker. If you listen to your music at as high a volume as I
do, that can be a noisy surprise.</p>

<p>Luckily the system broadcasts an {@link android.media.AudioManager#ACTION_AUDIO_BECOMING_NOISY}
intent when this happens. It’s good practice to register a {@link android.content.BroadcastReceiver}
that listens for this intent whenever you’re playing audio. In the case of music players, users
typically expect the playback to be paused&mdash;while for games you may choose to significantly
lower the volume.</p>
 
<pre>
private class NoisyAudioStreamReceiver extends BroadcastReceiver {
    &#64;Override
    public void onReceive(Context context, Intent intent) {
        if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
            // Pause the playback
        }
    }
}

private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);

private void startPlayback() {
    registerReceiver(myNoisyAudioStreamReceiver(), intentFilter);
}

private void stopPlayback() {
    unregisterReceiver(myNoisyAudioStreamReceiver);
}
</pre>