xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
android:id="@ id/recorderButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="录音" />
android:id="@ id/recorderButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="完成" />
android:id="@ id/recorderButton3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送socket录音" />
android:id="@ id/recorderButton4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="接收播放socket录音"
/>
android:id="@ id/playerButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放本地录音" />
android:id="@ id/playerButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止本地播放" />
android:id="@ id/playerButton3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停本地播放" />
android:id="@ id/playerButton4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放socket录音" />
权限:
android:name="android.permission.CAMERA"/>
android:name="android.hardware.camera"/>
android:name="android.hardware.camera.autofocus"/>
android:name="android.permission.INTERNET"/>
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android:name="android.permission.RECORD_AUDIO"/>
activity:
package com.example.example_audiochat_server;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.hardware.Camera;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button recorderButton;
private Button recorderButton2;
private Button recorderButton3;
private Button recorderButton4;
MediaRecorder mRecorder;
private Button playerButton;
private Button playerButton2;
private Button playerButton3;
private Button playerButton4;
MediaPlayer mPlayer;
boolean mStartRecording = false;
private static String mFileNameLocal =
null;
private static String mFileNameSocket =
null;
File receiveAudioFile = null;
int playerLocalOrSocketFlag;
ServerSocket serverSocket;
Socket clientSocket;
InputStream
inputStream;
OutputStream
outputStream;
private String name;
private int port = 10052;
private String ip;
private String sendIp;
File audioFileSocket;
private static final int RECEIVEAUDIOSUCCESS = 1;
private static final int TOAST = 0;
private static final int TOAST2 = 2;
private static final int SENDAUDIOFAIL = 3;
private static final int SENDAUDIOSUCCESS = 4;
private static final int SERVERNOTSEND = 5;
private static final int RECEIVEANAUDIO = 6;
boolean
remoteVideoVisible=true;
boolean receive =
true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recorderButton = (Button) findViewById(R.id.recorderButton);
recorderButton2 = (Button)
findViewById(R.id.recorderButton2);
recorderButton3 = (Button)
findViewById(R.id.recorderButton3);
recorderButton4 = (Button)
findViewById(R.id.recorderButton4);
playerButton = (Button) findViewById(R.id.playerButton);
playerButton2 = (Button) findViewById(R.id.playerButton2);
playerButton3 = (Button) findViewById(R.id.playerButton3);
playerButton4 = (Button) findViewById(R.id.playerButton4);
//将录音文件存放到指定路径,然后socket转发
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
mFileNameLocal =
Environment.getExternalStorageDirectory().getPath();
mFileNameSocket =
Environment.getExternalStorageDirectory().getPath();
}else{
mFileNameLocal = MainActivity.this.getCacheDir().getPath();
mFileNameSocket =
Environment.getExternalStorageDirectory().getPath();
}
mFileNameLocal = "/audiorecordLocal.amr";
mFileNameSocket =
"/audiorecordSocket.amr";
recorderButton4.setEnabled(false);
recorderButton3.setEnabled(false);
recorderButton2.setEnabled(false);
recorderButton.setEnabled(true);
recorderButton.setOnClickListener(new
ButtonClickListener());
recorderButton2.setOnClickListener(new
ButtonClickListener());
recorderButton3.setOnClickListener(new
ButtonClickListener());
recorderButton4.setOnClickListener(new
ButtonClickListener());
playerButton2.setEnabled(false);
playerButton3.setEnabled(false);
playerButton4.setEnabled(false);
playerButton.setEnabled(false);
playerButton.setOnClickListener(new ButtonClickListener());
playerButton2.setOnClickListener(new ButtonClickListener());
playerButton3.setOnClickListener(new ButtonClickListener());
playerButton4.setOnClickListener(new ButtonClickListener());
try{
new Thread(){
public void run() {
try {
serverSocket = new ServerSocket(port);
clientSocket = serverSocket.accept();//阻塞式,注意clientsocket判空
ip = clientSocket.getInetAddress().getHostAddress();
name = clientSocket.getInetAddress().getHostName();
Message message = new Message();
message.what = TOAST;
handler.sendMessage(message);
inputStream = clientSocket.getInputStream();
outputStream = clientSocket.getOutputStream();
} catch (Exception e) {
}
}
}.start();
}catch(Exception e){
}
}
public void receive(){
try{
new Thread(){
public void run() {
try {
if(clientSocket!=null){
//while(receive){
if(inputStream!=null){
//!!数组到底要定义多大!!
byte[] data = new byte[1024*10];
int len = 0;
//将读取到的流转化为声音文件存入手机中
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
receiveAudioFile = new
File(Environment.getExternalStorageDirectory(),"audiorecordSocket.amr");
}else{
receiveAudioFile = new
File(MainActivity.this.getCacheDir(),"audiorecordSocket.amr");
}
try{
FileOutputStream fos = new
FileOutputStream(receiveAudioFile);
//为啥这样可以?!!!
//while((len=inputStream.read(data))!=-1){
//fos.write(data,0,len);
//Message message2 = new Message();
//message2.what = RECEIVEAUDIOSUCCESS;
//handler.sendMessage(message2);
//}
//如果定义数组为1024 太小 只能接收1k数据,data的数组接不完。写入不正确
len = inputStream.read(data);
fos.write(data, 0, len);
fos.close();
Message message2 = new Message();
message2.what = RECEIVEAUDIOSUCCESS;
handler.sendMessage(message2);
}catch(Exception e){
}
}else if(inputStream==null || !receiveAudioFile.exists()){
Message message = new Message();
message.what = SERVERNOTSEND;
handler.sendMessage(message);
}
}
//}
} catch (Exception e) {
}
}
}.start();
}catch(Exception e){
}
}
public void send(){
try {
new Thread(){
public void run() {
try {
if(clientSocket!=null){
//outputStream = socket.getOutputStream();
if(outputStream!=null){
//先从存入的文件中读取出来转化为流,再写出去
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
//mFileName =
Environment.getExternalStorageDirectory().getPath();
audioFileSocket = new
File(Environment.getExternalStorageDirectory(),"audiorecordLocal.amr");
}else{
audioFileSocket = new
File(MainActivity.this.getCacheDir(),"audiorecordLocal.amr");
}
FileInputStream fis = new
FileInputStream(audioFileSocket);
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1){
outputStream.write(buf,0,len);
outputStream.flush();
}
}
}
Message message4 = new Message();
message4.what = SENDAUDIOSUCCESS;
handler.sendMessage(message4);
} catch (Exception e) {
Message message3 = new Message();
message3.what = SENDAUDIOFAIL;
handler.sendMessage(message3);
}
};
}.start();
} catch (Exception e) {
}
}
private Handler handler = new Handler() {
@Override
//
当有消息发送出来的时候就执行Handler的这个方法
public void
handleMessage(Message msg) {
super.handleMessage(msg);
// 处理UI
if(msg.what == RECEIVEAUDIOSUCCESS){
Toast.makeText(MainActivity.this, "接收声音成功",
Toast.LENGTH_SHORT).show();
recorderButton4.setEnabled(false);
playerButton4.setEnabled(true);
}
if(msg.what == TOAST){
Toast.makeText(MainActivity.this, "是主机为:" ip "
端口号为:" port "连接进来。", Toast.LENGTH_SHORT).show();
recorderButton4.setEnabled(true);
}
if(msg.what == TOAST2){
Toast.makeText(MainActivity.this, "连接失败,服务端要先上线",
Toast.LENGTH_LONG).show();
}
if(msg.what == SENDAUDIOFAIL){
Toast.makeText(MainActivity.this, "发送声音失败",
Toast.LENGTH_SHORT).show();
}
if(msg.what == SENDAUDIOSUCCESS){
Toast.makeText(MainActivity.this, "发送声音成功",
Toast.LENGTH_SHORT).show();
recorderButton3.setEnabled(false);
}
if(msg.what == SERVERNOTSEND){
Toast.makeText(MainActivity.this, "对方没有说话,请等待说话",
Toast.LENGTH_SHORT).show();
}
if(msg.what == RECEIVEANAUDIO){
Toast.makeText(MainActivity.this,
"接收到一条录音消息,请点击播放socket录音按钮接听", Toast.LENGTH_SHORT).show();
playerButton4.setEnabled(true);
}
}
};
class ButtonClickListener implements OnClickListener{
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.recorderButton:
//mStartRecording = true;
startRecording();
recorderButton.setEnabled(false);
recorderButton2.setEnabled(true);
break;
case R.id.recorderButton2:
//mStartRecording = false;
stopRecording();
recorderButton3.setEnabled(true);
recorderButton2.setEnabled(false);
recorderButton.setEnabled(true);
playerButton.setEnabled(true);
break;
case R.id.playerButton:
playerLocalOrSocketFlag = 0;
startPlaying();
break;
case R.id.playerButton2:
stopPlaying();
break;
case R.id.playerButton3:
onPause();
break;
case R.id.playerButton4:
playerLocalOrSocketFlag = 1;
startPlaying();
break;
case R.id.recorderButton3:
send();
break;
case R.id.recorderButton4:
receive();
break;
}
}
}
private void startRecording() {
try {
mRecorder
= new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//
设置输出文件格式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//
设置编码格式
mRecorder.setOutputFile(mFileNameLocal);// 使用绝对路径进行保存文件
mRecorder.prepare();
mRecorder.start();
} catch (Exception e) {
// Log.e(TAG,
"prepare() failed");
}
}
private void stopRecording() {
if(mRecorder!=null){
mRecorder.stop();
mRecorder.release();
mRecorder =
null;
}
}
private void startPlaying() {
try {
mPlayer =
new MediaPlayer();
if(playerLocalOrSocketFlag == 0){
mPlayer.setDataSource(mFileNameLocal);
}else
if(playerLocalOrSocketFlag == 1){
mPlayer.setDataSource(mFileNameSocket);
}
// mPlayer.setDataSource(mFileName);//声音来源应该是socket接收的流,因为socket已经写入手机,直接读手机内文件。
mPlayer.prepare();
mPlayer.start();
mPlayer.setOnCompletionListener(new
MediaPlayer.OnCompletionListener() {
@Override
public void
onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
stopPlaying();
playerButton.setEnabled(true);
playerButton2.setEnabled(false);
playerButton3.setEnabled(false);
}
});
playerButton2.setEnabled(true);
playerButton3.setEnabled(true);
playerButton.setEnabled(false);
} catch (Exception e) {
// Log.e(TAG,
"prepare() failed");
}
}
private void stopPlaying()
{
if(mPlayer!=null
&& mPlayer.isPlaying()){
playerButton2.setEnabled(false);
playerButton3.setEnabled(false);
playerButton.setEnabled(true);
mPlayer.stop();
mPlayer.release();
mPlayer =
null;
}
}
public void onPause() {
super.onPause();
if("继续播放".equals(playerButton3.getText().toString().trim())){
mPlayer.start();
mPlayer.setOnCompletionListener(new
MediaPlayer.OnCompletionListener() {
@Override
public void
onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
stopPlaying();
playerButton.setEnabled(true);
playerButton2.setEnabled(false);
playerButton3.setEnabled(false);
}
});
playerButton3.setEnabled(true);
playerButton2.setEnabled(false);
playerButton.setEnabled(false);
playerButton3.setText("暂停播放");
return;
}
if(mPlayer!=null
&& mPlayer.isPlaying()){
mPlayer.pause();
playerButton3.setEnabled(true);
playerButton2.setEnabled(false);
playerButton.setEnabled(false);
playerButton3.setText("继续播放");
return;
}
}
protected void onDestroy()
{
super.onDestroy();
try {
receive = false;
remoteVideoVisible = false;
if(clientSocket!=null)
clientSocket.close();
if(serverSocket!=null)
serverSocket.close();
handler.removeCallbacksAndMessages(null);
int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
} catch (Exception e) {
e.printStackTrace();
}
};
}