最近要做一个录音并且播放的功能,开始用的系统自带的 MediaRecorder,效果一般。
尝试用AudioRecord,在用系统AEC,BS去回音去噪,结果发现效果也是
差不多。
尝试用WebRtc,结果发现效果也是差不多。
可能跟4.1之后的系统就已经把WebRtc带上了,所以最终还是
MediaRecorder,毕竟它最简单。
播放的时候:
1,需要扬声器和听筒切换,就需要监听距离感应器SensorManager;
2,需要判断耳机插拔状态;
需要注意:
1,mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
始终用这个,因为不用通话模式,听筒的时候声音会很小;
2,需要去注册耳机插拔的广播,因为只是有些机子会插上耳机后会默认耳机播放;
3,最好播放完毕就mediaPlayer.release();
mediaPlayer=null;释放资源;
4,部分机型息屏会调Activity的OnPause,所以可能要用到
isScreenOff()判断;
5,音量键调节,是根据
audioManager.setMode()方法控制调哪种音量的。所以Activity的OnPause里面要释放到AudioManager.MODE_NORMAL;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.AssetFileDescriptor;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.PowerManager;
import com.qihoo.litegame.BaseApplication;
import com.qihoo.utils.ToastUtil;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;
public class PlayerManager implements SensorEventListener {
public static final int MODE_SPEAKER = 0;
public static final int MODE_HEADSET = 1;
public static final int MODE_EARPIECE = 2;
private static PlayerManager playerManager;
private Context context;
private AudioManager audioManager;
private MediaPlayer mediaPlayer;
private PlayCallback callback;
private PowerManager powerMan