上次簡單說了iOS版本的聊天功能 Unity3D 實現簡單的語音聊天 [iOS版本]
這次我們接着上篇來說下Android版本來實現簡單的語音聊天,流程和iOS基一樣的 @_@
在這里我們可能會遇到一下問題:
1.U3D C# 與 Android Java之間是怎么通訊
2.Android怎么調用原生的錄音功能和播放功能
好,我們逐一解決問題
1.U3D C# 與 Android Java之間是怎么通訊
相比iOS,Android這邊會比較簡單些
再C# 中這樣調用Android的接口
AndroidJavaClass javaclass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject javaobject = javaclass.GetStatic<AndroidJavaObject>(“currentActivity");
javaobject.Call (methodName);
所以在com.unity3d.player.UnityPlayer中定義的接口都可以通過上述方法去調用,值得注意的是,如果要U3D直接修改Android界面上的東西,不用能直接在接口中修改,可以在Android接口中用這樣調用
this.runOnUiThread(new Runnable() {
@Override
public void run() {
//調用Android接口邏輯
}
});
或者是用Message
//設置消息
Message msg = new Message();
msg.what =“methodName”;
Handler messageHandler = new Handler() {
public void handleMessage(Message e){
//調用Android接口邏輯
}
//發送事件消息
messageHandler.sendMessage(msg);
好了,反過來,如果Android要發送消息給U3D,可以調用unity-class.jar提供的接口
UnityPlayer.UnitySendMessage(String a,String b,String c);
和iOS一樣,第一個參數是場景中的GameObject名字,第二個參數是組件中的方法名字,第三個參數是任意的消息參數。這樣,U3D和Android相互間的消息發送就完成了。
2.Android怎么調用原生的錄音功能和播放功能
與iOS類似,我們需要引入安卓原生的錄音類和音頻播放類
import android.media.MediaRecorder;
import android.media.MediaPlayer;
MediaRecorder
我們創建MediaRecorder對象來錄制音頻
MediaRecorder mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 設置音頻來源(MIC表示麥克風) mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); // 設置音頻輸出格式
mRecorder.setOutputFile(voiceDataPath);//設置輸出文件 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 設置音頻編碼為AMR
mRecorder.setMaxDuration(20300);//設置錄音時長
mRecorder.setAudioEncodingBitRate(4000);
mRecorder.setAudioSamplingRate(8000);//采樣率
mRecorder.prepare();
//開始錄制
mRecorder.start();
//結束錄制
mRecorder.stop();
mRecorder.release();
voiceDataPath路徑為錄制文件輸出路徑,與iOS不同,錄制文件格式可以直接輸出為ARM格式。同時可以設置錄制事件的回調函數
mRecorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {
//設置回調
@Override
public void onInfo(MediaRecorder arg0, int arg1, int arg2) {
if(arg1 == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED){//到達最長錄音時間限制
speakStop( );
}
}
});
MediaPlayer
播放音頻更加簡單,傳入音頻文件路徑就可以了
MediaPlayer mPlayer = new MediaPlayer();
mPlayer.setDataSource(voiceDataPath);
mPlayer.prepare();
//開始播放
mPlayer.start();
//結束播放
mPlayer.stop();
mPlayer.release();
也可以設置播放完成的事件回調
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {//播放完畢回調監聽
@Override
public void onCompletion(MediaPlayer arg0) {
stopPlay( );
}
});
與iOS不同,Android中不需要把ARM格式的音頻轉為wav,MediaPlayer類可以直接播放ARM格式的音頻。
好了,Android版的語音聊天大概就點到這里來了,流程基本和iOS的類似,只是Android的API可以直接支持ARM音頻格式的錄制和播放,用起來也相當的方便。