天天看点

android audiorecord socket,socket实现语音聊天-server端  MediaRecorder和MediaPlayer类

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();

}

};

}