您的位置:首页 > 其它

实现录音,播放,以及Socket的上传和下载。。【处女作】

2011-10-17 10:52 381 查看
近期因为工作的原因,写了一个如题的测试例子,本人从事android时间有限,请各位慢点拍砖、、

主程序如下:

package com.kingtone.www.record;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.Socket;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import com.kingtone.www.record.util.EnvironmentShare;

/**
*
* @author YuanLiangFeng 袁良锋
*
* 本类主要实现 录音至SD卡上,并且可以实现录音的播放
*/
public class Main extends Activity implements OnClickListener {

// 多媒体播放器
private MediaPlayer mediaPlayer;
// 多媒体录制器
private MediaRecorder mediaRecorder = new MediaRecorder();
// 音频文件
private File audioFile;

// 传给Socket服务器端的上传和下载标志
private final int UP_LOAD = 1;
private final int DOWN_LOAD = 2;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获得三个按钮的UI控件
Button btnStart = (Button) findViewById(R.id.btnStart);
Button btnStop = (Button) findViewById(R.id.btnStop);
Button btnPlay = (Button) findViewById(R.id.btnPlay);
Button btnUpLoad = (Button) findViewById(R.id.btnUpLoad);
Button btnDownLoad = (Button) findViewById(R.id.btnDownLoad);
btnStart.setOnClickListener(this);
btnStop.setOnClickListener(this);
btnPlay.setOnClickListener(this);
btnUpLoad.setOnClickListener(this);
btnDownLoad.setOnClickListener(this);
}

@Override
public void onClick(View view) {
try {
String msg = "";
switch (view.getId()) {
// 开始录音
case R.id.btnStart:
if (!EnvironmentShare.haveSdCard()) {
Toast.makeText(this, "SD不存在,不正常录音!!", Toast.LENGTH_LONG).show();
}else{
// 设置音频来源(一般为麦克风)
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置音频输出格式(默认的输出格式)
mediaRecorder
.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
// 设置音频编码方式(默认的编码方式)
mediaRecorder
.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// 创建一个临时的音频输出文件
audioFile = File.createTempFile("record_", ".amr",EnvironmentShare.getAudioRecordDir());
// 设置录制器的文件保留路径
mediaRecorder.setOutputFile(audioFile.getAbsolutePath());
// 准备并且开始启动录制器
mediaRecorder.prepare();
mediaRecorder.start();
msg = "正在录音...";
}
break;
// 停止录音
case R.id.btnStop:
if (audioFile != null) {
mediaRecorder.stop();
}
msg = "已经停止录音.";
break;
// 录音文件的播放
case R.id.btnPlay:
if (audioFile != null) {
mediaPlayer = new MediaPlayer();
// 为播放器设置数据文件
mediaPlayer.setDataSource(audioFile.getAbsolutePath());
// 准备并且启动播放器
mediaPlayer.prepare();
mediaPlayer.start();
mediaPlayer
.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
setTitle("录音播放完毕.");

}
});
msg = "正在播放录音...";
}
break;
// 上传录音文件
case R.id.btnUpLoad:
// 开始上传录音文件
if (audioFile != null) {
msg = "正在上传录音文件...";
audioUpLoad();
}
break;
// 下载录音文件
case R.id.btnDownLoad:
// 开始下载录音文件
msg = "正在下载录音文件...";
downLoadDFile();
break;
}
// 更新标题栏 并用 Toast弹出信息提示用户
if (!msg.equals("")) {
setTitle(msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
setTitle(e.getMessage());
}

}

/**
* 上传 录音文件
*/
private void audioUpLoad(){
new Thread(){
public void run() {
DataInputStream reader = null;
DataOutputStream out = null;
Socket socket = null;
byte[] buf = null;
try {
// 连接Socket
socket = new Socket("192.168.42.219",9999);
// 1. 读取文件输入流
reader = new DataInputStream(new BufferedInputStream(new FileInputStream(audioFile)));
// 2. 将文件内容写到Socket的输出流中
out = new DataOutputStream(socket.getOutputStream());
out.writeInt(UP_LOAD);
out.writeUTF(audioFile.getName()); //附带文件名

int bufferSize = 2048; //2K
buf = new byte[bufferSize];
int read = 0;
// 将文件输入流 循环 读入 Socket的输出流中
while((read = reader.read(buf)) != -1){
out.write(buf, 0, read);
}
handler.sendEmptyMessage(UPLOAD_SUCCESS);
} catch (Exception e) {
handler.sendEmptyMessage(UPLOAD_FAIL);
}finally{
try {
// 善后处理
buf = null;
out.close();
reader.close();
socket.close();
} catch (Exception e) {

}
}
};
}.start();

}

/**
* 下载录音文件
*/
private void downLoadDFile(){
new Thread(){
public void run() {
DataOutputStream writer = null;
DataOutputStream socketOut = null;

DataInputStream inPutStream = null;
Socket socket = null;
byte[] buf = null;
try {
// 连接Socket
socket = new Socket("192.168.42.219",9999);
// 向服务端发送请求及数据
socketOut = new DataOutputStream(socket.getOutputStream());
socketOut.writeInt(DOWN_LOAD);
socketOut.writeUTF(audioFile.getName());

// 1. 读取Socket的输入流
inPutStream = new DataInputStream(socket.getInputStream());
File downLoadFile = new File(EnvironmentShare.getDownAudioRecordDir().getAbsolutePath()+ "/" + audioFile.getName());
downLoadFile.createNewFile();
// File downLoadFile = File.createTempFile( fileName, ".amr", EnvironmentShare.getDownAudioRecordDir());
// 2. 获得文件的输出流
writer = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(downLoadFile)));

int bufferSize = 2048; //2K
buf = new byte[bufferSize];
int read = 0;
// 将文件输入流 循环 读入 Socket的输出流中
while((read = inPutStream.read(buf)) != -1){
writer.write(buf, 0, read);
}
handler.sendEmptyMessage(DOWNLOAD_SUCCESS);
} catch (Exception e) {
handler.sendEmptyMessage(DOWNLOAD_FAIL);
}finally{
try {
// 善后处理
buf = null;
inPutStream.close();
writer.close();
socket.close();
} catch (Exception e) {

}
}
};
}.start();

}

// Socket上传下载 结果标志
private final int UPLOAD_SUCCESS = 1;
private final int UPLOAD_FAIL = 2;
private final int DOWNLOAD_SUCCESS = 3;
private final int DOWNLOAD_FAIL = 4;

// Socket 上传下载 结果 Handler处理类
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
String showMessage = "";
switch (msg.what) {
case UPLOAD_SUCCESS:
showMessage = "录音文件上传成功!";
break;
case UPLOAD_FAIL:
showMessage = "录音文件上传失败!";
break;
case DOWNLOAD_SUCCESS:
showMessage = "录音文件下载成功!";
break;
case DOWNLOAD_FAIL:
showMessage = "录音文件下载失败!";
break;

default:
break;
}
// 显示提示信息并 设置标题
EnvironmentShare.showToastAndTitle(Main.this, showMessage, true);
};
};

}


其中用到的一个辅助类:

package com.kingtone.www.record.util;

import java.io.File;

import android.app.Activity;
import android.os.Environment;
import android.widget.Toast;

/**
*
* @author YuanLiangFeng 袁良锋
* at 2011-03-1
*
* 该类为 硬件检测的 公共类
*/
public class EnvironmentShare {

// 存放录音文件夹的名称
static String AUDIO_RECORD = "/AudioRecord";
// 存放下载而来的录音文件夹名称
static String DOWNLOAD_AUDIO_RECORD = "/AudioRecord/downLoad";

/**
* 检测当前设备SD是否可用
*
* @return 返回"true"表示可用,否则不可用
*/
public static boolean haveSdCard(){
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ;
}

/**
* 获得SD卡根目录路径
*
* @return String类型 SD卡根目录路径
*/
public static String getSdCardAbsolutePath(){
return Environment.getExternalStorageDirectory().getAbsolutePath();
}

/**
* 获得存储 录音文件的文件夹
*
* @return File类型
* 存储 录音文件的文件夹
*/
public static File getAudioRecordDir(){
File audioRecordFile = new File(EnvironmentShare.getSdCardAbsolutePath() + AUDIO_RECORD);
if (!audioRecordFile.exists()) {
// 此处可能会创建失败,暂不考虑
audioRecordFile.mkdir();
}
return audioRecordFile;
}

/**
* 获得存储 下载而来的录音文件的文件夹
*
* @return File类型
* 存储 下载而来的 录音文件的文件夹
*/
public static File getDownAudioRecordDir(){
File audioRecordFile = new File(EnvironmentShare.getSdCardAbsolutePath() + DOWNLOAD_AUDIO_RECORD);
if (!audioRecordFile.exists()) {
// 此处可能会创建失败,暂不考虑
audioRecordFile.mkdir();
}
return audioRecordFile;
}

/**
* 用Toast显示指定信息
*
* @param activity Activity类型 要显示提示信息的页面上下文
* @param message String类型 将显示的提示信息内容
* @param isLong boolean类型 如果为"true"表示长时间显示,否则为短时间显示
*/
public static void showToast(Activity activity,String message,boolean isLong){
if (message == null ||message.equals(""))
return ;
int showTime = Toast.LENGTH_SHORT;
if (isLong) {
showTime = Toast.LENGTH_LONG;
}

Toast.makeText(activity, message, showTime).show();
}

/**
* 用Toast显示指定信息 并设置标题显示 信息
*
* @param activity Activity类型 要显示提示信息的页面上下文
* @param message String类型 将显示的提示信息内容
* @param isLong boolean类型 如果为"true"表示长时间显示,否则为短时间显示
*/
public static void showToastAndTitle(Activity activity,String message,boolean isLong){
activity.setTitle(message);
showToast(activity, message, isLong);
}

}


main.xml 配置如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="fill_parent">

<Button android:id="@+id/btnStart" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="录音"/>

<Button android:id="@+id/btnStop" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="停止"/>

<Button android:id="@+id/btnPlay" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="播放"/>

<Button android:id="@+id/btnUpLoad" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="上传"/>

<Button android:id="@+id/btnDownLoad" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="下载"/>

</LinearLayout>


AndroidManifest.xml 配置如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.kingtone.www.record" android:versionCode="1"
android:versionName="1.0">

<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<activity android:name="com.kingtone.www.record.Main" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

<uses-sdk android:minSdkVersion="3" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

</manifest>


服务端的代码放到 附件里吧,要不然文章太长了、

资源下载地址!
下载地址。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐