前天想找個藍牙錄音程序,發現竟然沒有!沒辦法,就本身動手DIY了。一些關鍵代碼摘出來,但願對你們有用。
本代碼基於android 2.2以上。IOS就不要問我了,不越獄的IOS設備,藍牙除了用藍牙耳機,再就是IOS設備之間聯機遊戲,不可理喻!
1、初始化
添加權限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
......
private static String mFileName = null;
private MediaRecorder mRecorder = null;
private MediaPlayer mPlayer = null;
private AudioManager mAudioManager = null;
......
mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
......
2、錄音
private void startRecording() {
//得到文件保存路徑。記得添加android.permission.WRITE_EXTERNAL_STORAGE權限
mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
mFileName += "/btrecorder.3gp";
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mRecorder.prepare();//若是文件打開失敗,此步將會出錯。
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
if(!mAudioManager.isBluetoothScoAvailableOffCall()){
Log.d(LOG_TAG, "系統不支持藍牙錄音");
return;
}
//藍牙錄音的關鍵,啓動SCO鏈接,耳機話筒才起做用
mAudioManager.startBluetoothSco();
//藍牙SCO鏈接創建須要時間,鏈接創建後會發出ACTION_SCO_AUDIO_STATE_CHANGED消息,經過接收該消息而進入後續邏輯。
//也有可能此時SCO已經創建,則不會收到上述消息,能夠startBluetoothSco()前先stopBluetoothSco()
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) {
mAudioManager.setBluetoothScoOn(true); //打開SCO
mRecorder.start();//開始錄音
unregisterReceiver(this); //別遺漏
}else{//等待一秒後再嘗試啓動SCO
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mAudioManager.startBluetoothSco();
}
}
}, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED));
}
3、中止錄音
private void stopRecording() {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
if(mAudioManager.isBluetoothScoOn()){
mAudioManager.setBluetoothScoOn(false);
mAudioManager.stopBluetoothSco();
}
}
4、播放錄音到A2DP
private void startPlaying() {
mPlayer = new MediaPlayer();
try {
if(!mAudioManager.isBluetoothA2dpOn()) mAudioManager.setBluetoothA2dpOn(true); //若是A2DP沒創建,則創建A2DP鏈接
mAudioManager.stopBluetoothSco();//若是SCO沒有斷開,因爲SCO優先級高於A2DP,A2DP可能無聲音
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
mAudioManager.setStreamSolo(AudioManager.STREAM_MUSIC, true);
//讓聲音路由到藍牙A2DP。此方法雖已棄用,但就它比較直接、好用。
mAudioManager.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_BLUETOOTH_A2DP, AudioManager.ROUTE_BLUETOOTH);
mPlayer.setDataSource(mFileName);
mPlayer.prepare();
mPlayer.start();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
}
5、中止A2DP播放
private void stopPlaying() {
mPlayer.release();
mPlayer = null;
mAudioManager.setStreamSolo(AudioManager.STREAM_MUSIC, false);
} android
總之記住以下的:ide
1)要使用藍牙耳機的mic,則操做SCO這玩意。this
2)若是要將音頻輸入到藍牙耳機,則使用A2DP,(好比說打電話,語音播放呀什麼的)這個玩意。spa
3)記住,SCO這個權限比A2DP的高。若是在進行操做。code