Issue 1680 Finish / clean up media player in rare case the media server dies

git-svn-id: https://zxing.googlecode.com/svn/trunk@2799 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
srowen@gmail.com 2013-05-15 20:09:37 +00:00
parent 20490f1bda
commit c608a08978

View file

@ -31,7 +31,7 @@ import java.io.IOException;
/** /**
* Manages beeps and vibrations for {@link CaptureActivity}. * Manages beeps and vibrations for {@link CaptureActivity}.
*/ */
final class BeepManager { final class BeepManager implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {
private static final String TAG = BeepManager.class.getSimpleName(); private static final String TAG = BeepManager.class.getSimpleName();
@ -49,7 +49,7 @@ final class BeepManager {
updatePrefs(); updatePrefs();
} }
void updatePrefs() { synchronized void updatePrefs() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
playBeep = shouldBeep(prefs, activity); playBeep = shouldBeep(prefs, activity);
vibrate = prefs.getBoolean(PreferencesActivity.KEY_VIBRATE, false); vibrate = prefs.getBoolean(PreferencesActivity.KEY_VIBRATE, false);
@ -61,7 +61,7 @@ final class BeepManager {
} }
} }
void playBeepSoundAndVibrate() { synchronized void playBeepSoundAndVibrate() {
if (playBeep && mediaPlayer != null) { if (playBeep && mediaPlayer != null) {
mediaPlayer.start(); mediaPlayer.start();
} }
@ -83,16 +83,11 @@ final class BeepManager {
return shouldPlayBeep; return shouldPlayBeep;
} }
private static MediaPlayer buildMediaPlayer(Context activity) { private MediaPlayer buildMediaPlayer(Context activity) {
MediaPlayer mediaPlayer = new MediaPlayer(); MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
// When the beep has finished playing, rewind to queue up another one. mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { mediaPlayer.setOnErrorListener(this);
@Override
public void onCompletion(MediaPlayer player) {
player.seekTo(0);
}
});
AssetFileDescriptor file = activity.getResources().openRawResourceFd(R.raw.beep); AssetFileDescriptor file = activity.getResources().openRawResourceFd(R.raw.beep);
try { try {
@ -107,4 +102,24 @@ final class BeepManager {
return mediaPlayer; return mediaPlayer;
} }
@Override
public void onCompletion(MediaPlayer mp) {
// When the beep has finished playing, rewind to queue up another one.
mp.seekTo(0);
}
@Override
public synchronized boolean onError(MediaPlayer mp, int what, int extra) {
if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
// we are finished, so put up an appropriate error toast if required and finish
activity.finish();
} else {
// possibly media player error, so release and recreate
mp.release();
mediaPlayer = null;
updatePrefs();
}
return true;
}
} }