2009-11-10 09:45:02 +08:00
|
|
|
package com.phonegap;
|
2009-04-02 07:56:43 +08:00
|
|
|
|
|
|
|
import java.io.File;
|
2009-05-16 05:25:33 +08:00
|
|
|
import java.io.IOException;
|
2009-04-02 07:56:43 +08:00
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
import android.media.AudioManager;
|
|
|
|
import android.media.MediaPlayer;
|
|
|
|
import android.media.MediaPlayer.OnErrorListener;
|
|
|
|
import android.media.MediaRecorder;
|
|
|
|
import android.media.MediaPlayer.OnBufferingUpdateListener;
|
|
|
|
import android.media.MediaPlayer.OnCompletionListener;
|
|
|
|
import android.media.MediaPlayer.OnPreparedListener;
|
|
|
|
import android.util.Log;
|
|
|
|
|
|
|
|
public class AudioHandler implements OnCompletionListener, OnPreparedListener, OnErrorListener {
|
|
|
|
private MediaRecorder recorder;
|
|
|
|
private boolean isRecording = false;
|
|
|
|
MediaPlayer mPlayer;
|
|
|
|
private boolean isPlaying = false;
|
|
|
|
private String recording;
|
|
|
|
private String saveFile;
|
|
|
|
private Context mCtx;
|
|
|
|
|
|
|
|
public AudioHandler(String file, Context ctx) {
|
|
|
|
this.recording = file;
|
|
|
|
this.mCtx = ctx;
|
2009-11-13 02:51:22 +08:00
|
|
|
}
|
2009-04-02 07:56:43 +08:00
|
|
|
|
|
|
|
protected void startRecording(String file){
|
|
|
|
if (!isRecording){
|
|
|
|
saveFile=file;
|
|
|
|
recorder = new MediaRecorder();
|
|
|
|
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
|
|
|
|
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
|
|
|
|
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
|
|
|
|
recorder.setOutputFile(this.recording);
|
2009-05-16 05:25:33 +08:00
|
|
|
try {
|
|
|
|
recorder.prepare();
|
|
|
|
} catch (IllegalStateException e) {
|
|
|
|
// TODO Auto-generated catch block
|
|
|
|
e.printStackTrace();
|
|
|
|
} catch (IOException e) {
|
|
|
|
// TODO Auto-generated catch block
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2009-04-02 07:56:43 +08:00
|
|
|
isRecording = true;
|
|
|
|
recorder.start();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void moveFile(String file) {
|
|
|
|
/* this is a hack to save the file as the specified name */
|
|
|
|
File f = new File (this.recording);
|
|
|
|
f.renameTo(new File("/sdcard" + file));
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void stopRecording(){
|
|
|
|
try{
|
|
|
|
if((recorder != null)&&(isRecording))
|
|
|
|
{
|
|
|
|
isRecording = false;
|
|
|
|
recorder.stop();
|
|
|
|
recorder.release();
|
|
|
|
}
|
|
|
|
moveFile(saveFile);
|
2009-11-10 09:22:36 +08:00
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2009-04-02 07:56:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
protected void startPlaying(String file) {
|
|
|
|
if (isPlaying==false) {
|
|
|
|
try {
|
|
|
|
mPlayer = new MediaPlayer();
|
|
|
|
isPlaying=true;
|
|
|
|
Log.d("Audio startPlaying", "audio: " + file);
|
|
|
|
if (isStreaming(file))
|
|
|
|
{
|
|
|
|
Log.d("AudioStartPlaying", "Streaming");
|
|
|
|
// Streaming prepare async
|
|
|
|
mPlayer.setDataSource(file);
|
|
|
|
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
|
|
|
|
mPlayer.prepareAsync();
|
|
|
|
} else {
|
|
|
|
Log.d("AudioStartPlaying", "File");
|
|
|
|
// Not streaming prepare synchronous, abstract base directory
|
|
|
|
mPlayer.setDataSource("/sdcard/" + file);
|
|
|
|
mPlayer.prepare();
|
|
|
|
}
|
|
|
|
mPlayer.setOnPreparedListener(this);
|
2009-11-10 09:22:36 +08:00
|
|
|
} catch (Exception e)
|
|
|
|
{
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2009-04-02 07:56:43 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-11-10 09:22:36 +08:00
|
|
|
public void stopPlaying() {
|
2009-04-02 07:56:43 +08:00
|
|
|
if (isPlaying) {
|
|
|
|
mPlayer.stop();
|
|
|
|
mPlayer.release();
|
|
|
|
isPlaying=false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void onCompletion(MediaPlayer mPlayer) {
|
|
|
|
mPlayer.stop();
|
|
|
|
mPlayer.release();
|
|
|
|
isPlaying=false;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected long getCurrentPosition() {
|
|
|
|
if (isPlaying)
|
|
|
|
{
|
|
|
|
return(mPlayer.getCurrentPosition());
|
|
|
|
} else { return(-1); }
|
|
|
|
}
|
|
|
|
|
|
|
|
private boolean isStreaming(String file)
|
|
|
|
{
|
|
|
|
if (file.contains("http://")) {
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected long getDuration(String file) {
|
|
|
|
long duration = -2;
|
|
|
|
if (!isPlaying & !isStreaming(file)) {
|
|
|
|
try {
|
|
|
|
mPlayer = new MediaPlayer();
|
|
|
|
mPlayer.setDataSource("/sdcard/" + file);
|
|
|
|
mPlayer.prepare();
|
|
|
|
duration = mPlayer.getDuration();
|
|
|
|
mPlayer.release();
|
|
|
|
} catch (Exception e) { e.printStackTrace(); return(-3); }
|
|
|
|
} else
|
|
|
|
if (isPlaying & !isStreaming(file)) {
|
|
|
|
duration = mPlayer.getDuration();
|
|
|
|
} else
|
|
|
|
if (isPlaying & isStreaming(file)) {
|
|
|
|
try {
|
|
|
|
duration = mPlayer.getDuration();
|
|
|
|
} catch (Exception e) { e.printStackTrace(); return(-4); }
|
|
|
|
}else { return -1; }
|
|
|
|
return duration;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void onPrepared(MediaPlayer mPlayer) {
|
|
|
|
if (isPlaying) {
|
|
|
|
mPlayer.setOnCompletionListener(this);
|
|
|
|
mPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener()
|
|
|
|
{
|
|
|
|
public void onBufferingUpdate(MediaPlayer mPlayer, int percent)
|
|
|
|
{
|
|
|
|
/* TODO: call back, e.g. update outer progress bar */
|
|
|
|
Log.d("AudioOnBufferingUpdate", "percent: " + percent);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
mPlayer.start();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean onError(MediaPlayer mPlayer, int arg1, int arg2) {
|
|
|
|
Log.e("AUDIO onError", "error " + arg1 + " " + arg2);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void setAudioOutputDevice(int output){
|
|
|
|
// Changes the default audio output device to speaker or earpiece
|
|
|
|
AudioManager audiMgr = (AudioManager) mCtx.getSystemService(Context.AUDIO_SERVICE);
|
|
|
|
if (output == (2))
|
|
|
|
audiMgr.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_SPEAKER, AudioManager.ROUTE_ALL);
|
|
|
|
else if (output == (1)){
|
|
|
|
audiMgr.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL);
|
|
|
|
}else
|
|
|
|
Log.e("AudioHandler setAudioOutputDevice", " unknown output device");
|
|
|
|
}
|
|
|
|
|
|
|
|
protected int getAudioOutputDevice(){
|
|
|
|
AudioManager audiMgr = (AudioManager) mCtx.getSystemService(Context.AUDIO_SERVICE);
|
|
|
|
if (audiMgr.getRouting(AudioManager.MODE_NORMAL) == AudioManager.ROUTE_EARPIECE)
|
|
|
|
return 1;
|
|
|
|
else if (audiMgr.getRouting(AudioManager.MODE_NORMAL) == AudioManager.ROUTE_SPEAKER)
|
|
|
|
return 2;
|
|
|
|
else
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|