读书人

2011.10.19 android 展示一行内

发布时间: 2012-07-27 11:03:00 作者: rapoo

2011.10.19——— android 显示一行内容并录制其音频
2011.10.19——— android 显示一行内容并录制其音频

一个小工具

同事作语音识别 需要其他人帮他录制音频,台式机没有麦克 所以希望用手机来录,就需要一个小程序

需求:
1、装载一个txt文本,每次读取一行
2、根据这个文本进行录音
3、将pcm文件与每行文字 的对应关系 写入一个txt文本当中

思路:

1、录制pcm
2、选着文本 一个简易的文件管理器

代码:

录制:

package com.lp.read;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.media.AudioFormat;import android.media.AudioManager;import android.media.AudioRecord;import android.media.AudioTrack;import android.media.MediaRecorder;import android.os.AsyncTask;import android.os.Bundle;import android.os.Environment;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;/** * AudioRecord录制PCM AudioTrack播放 * @author Administrator * */public class MainActivity2 extends Activity implements OnClickListener{private Button btnStart,btnCheck;//private Button btnPlay2;private RecordTask recorder;private PlayTask player;private String mFileName;private String mDirName;    private String sdcard;private boolean isRecording=true, isPlaying=false, mStartRecording = true;; private int frequence = 16000; private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;private AudioManager am;private int mode;private TextView tv;        private List<String> texts = new ArrayList<String>();    private int index = 1;        private boolean isWrite = true;    private String writeFileName;    private WriteThread thread;public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main_pcm);sdcard = Environment.getExternalStorageDirectory().getAbsolutePath();        mDirName = sdcard +  "/read";    File f = new File(mDirName);    if(!f.exists()){f.mkdir();    }am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);btnStart = (Button)this.findViewById(R.id.btn_start);//btnPlay2 = (Button)this.findViewById(R.id.btn_play2);btnStart.setOnClickListener(this);//btnPlay2.setOnClickListener(this);btnStart.setEnabled(false);//btnPlay2.setEnabled(false);btnCheck = (Button)findViewById(R.id.btn_check);btnCheck.setOnClickListener(this);tv = (TextView)findViewById(R.id.tv);thread = new WriteThread();thread.start();}public void onClick(View v){int id = v.getId();switch(id){case R.id.btn_start:if (mStartRecording) {this.isRecording = true;mFileName = mDirName + "/"+new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss").format( new Date().getTime())+".pcm";    recorder = new RecordTask();    recorder.execute();                    ((Button)v).setText("录音停止");            } else {            this.isRecording = false;            ((Button)v).setText("录音开始");            changeText();            thread.setfName(mFileName);            thread.setText(tv.getText().toString());//            btnPlay2.setEnabled(true);            }            mStartRecording = !mStartRecording;break;//case R.id.btn_play2://this.isPlaying = true;//btnPlay2.setEnabled(false);//mode = AudioManager.STREAM_MUSIC;////if(!am.isSpeakerphoneOn()){//am.setSpeakerphoneOn(true);//}//setVolumeControlStream(AudioManager.STREAM_MUSIC);//am.setMode(AudioManager.MODE_NORMAL);//am.setStreamVolume(AudioManager.STREAM_MUSIC, am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0); ////player = new PlayTask();//player.execute();//break;case R.id.btn_check:Intent intent = new Intent(this,FileOSActivity.class);startActivityForResult(intent, 100);break;}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if(data!=null ){String path = data.getStringExtra("path");String name = path.substring(path.lastIndexOf("/")+1).toLowerCase().replace(".txt", "");//清空数据texts.clear();index = 1;writeFileName = mDirName + "/"+name+"_"+new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss").format( new Date().getTime())+".txt";new ReadTextAsyncTask().execute(path);btnStart.setEnabled(true);}}private void changeText(){    System.out.println(texts.size());    if(index < texts.size()){    tv.setText(texts.get(index));    index++;    }else{    texts.clear();    index = 1;    btnStart.setEnabled(false);    tv.setText("");    Toast.makeText(this, "此文件已读完。", 1).show();    }    }class RecordTask extends AsyncTask<Void, Integer, Void>{@Overrideprotected Void doInBackground(Void... arg0) {AudioRecord record = null;DataOutputStream dos = null;//FileOutputStream fos = null;//isRecording = true;try {//开通输出流到指定的文件dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(mFileName)));//fos = new FileOutputStream(audioFile);//根据定义好的几个配置,来获取合适的缓冲大小int bufferSize = AudioRecord.getMinBufferSize(frequence, channelConfig, audioEncoding);//实例化AudioRecordrecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequence, channelConfig, audioEncoding, bufferSize);//定义缓冲short[] buffer = new short[bufferSize];//byte[] buffer = new byte[bufferSize];//开始录制record.startRecording();//定义循环,根据isRecording的值来判断是否继续录制while(isRecording){//从bufferSize中读取字节,返回读取的short个数int bufferReadResult = record.read(buffer, 0, buffer.length);//循环将buffer中的音频数据写入到OutputStream中for(int i=0; i<bufferReadResult; i++){dos.writeShort(buffer[i]);}//byte[] tmpBuf = new byte[bufferReadResult];  //                    System.arraycopy(buffer, 0, tmpBuf, 0, bufferReadResult); //                    fos.write(tmpBuf, 0, bufferReadResult);//                    fos.flush();}//录制结束record.stop();} catch (Exception e) {e.printStackTrace();}finally{record.release();try {dos.close();//fos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return null;}}class PlayTask extends AsyncTask<Void, Integer, Void>{@Overrideprotected Void doInBackground(Void... arg0) {AudioTrack track = null;DataInputStream dis = null;int bufferSize = AudioTrack.getMinBufferSize(frequence, channelConfig, audioEncoding);short[] buffer = new short[bufferSize];//byte[] buffer = new byte[bufferSize];try {//定义输入流,将音频写入到AudioTrack类中,实现播放dis = new DataInputStream(new BufferedInputStream(new FileInputStream(mFileName)));//FileInputStream fis = new FileInputStream(audioFile);//实例AudioTrack//AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, frequence, channelConfig, audioEncoding, bufferSize, AudioTrack.MODE_STREAM);track = new AudioTrack(mode, frequence, AudioFormat.CHANNEL_OUT_MONO, audioEncoding, bufferSize, AudioTrack.MODE_STREAM);//开始播放track.play();//由于AudioTrack播放的是流,所以,我们需要一边播放一边读取while(isPlaying && dis.available()>0){int i = 0;while(dis.available()>0 && i<buffer.length){buffer[i] = dis.readShort();i++;}//然后将数据写入到AudioTrack中track.write(buffer, 0, buffer.length);}//播放结束track.stop();} catch (Exception e) {e.printStackTrace();}finally{track.release();try {dis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return null;}@Overrideprotected void onPostExecute(Void result) {//btnPlay2.setEnabled(true);}}private class ReadTextAsyncTask extends AsyncTask<String, Void, Void>{@Overrideprotected Void doInBackground(String... params) {String path = params[0];BufferedReader br = null;try {br = new BufferedReader(new InputStreamReader(new FileInputStream(path),"GB2312"));String readStr = null;while((readStr = br.readLine()) != null){texts.add(readStr);//第一次的时候  改变一下textviewif(texts.size()==1){publishProgress();}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try{br.close();}catch(Exception e){e.printStackTrace();}}return null;}@Overrideprotected void onPostExecute(Void result) {super.onPostExecute(result);}@Overrideprotected void onProgressUpdate(Void... values) {super.onProgressUpdate(values);tv.setText(texts.get(0));}    }private class WriteThread extends Thread{String fName = null;String text = null;@Overridepublic void run() {while(isWrite){if(fName!=null && text!=null && !fName.equals("") && !text.equals("")){write();fName = null;text = null;}}}private void write(){BufferedWriter bw = null;try {bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(writeFileName,true)));bw.write(text+"---------------->>"+fName);bw.write("\r\n");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try{bw.close();}catch(Exception e){e.printStackTrace();}}}public void setfName(String fName){this.fName = fName;}public void setText(String text){this.text = text;}}@Overrideprotected void onPause() {super.onPause();//isWrite = false;//isRecording = false;}}



文件管理器:

package com.lp.read;import java.io.File;import java.util.ArrayList;import java.util.Collections;import java.util.List;import android.app.ListActivity;import android.app.ProgressDialog;import android.content.Context;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.ListView;import android.widget.Toast;public class FileOSActivity extends ListActivity {static final int REQUEST_CODE = 1;private static String SDpath;// 显示模式private enum DISPLAYMODE {ABSOLUTE, RELATIVE;}private final DISPLAYMODE displayMode = DISPLAYMODE.RELATIVE;private List<IconifiedText> directoryEntries = new ArrayList<IconifiedText>();public File currentDirectory = new File("/");// 当前目录public boolean TCardExist;// private File currentDirectory = new File(filePath);/** Called when the activity is first created. *//** Activity被创建时调用 */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TCardExist = judgeSDcard();if (TCardExist) {SDpath = getSDPath();Log.e("yangw getSDPath", SDpath);EnterFolder(new File(SDpath));// browseTo(new File("/"));this.setSelection(0);} else {Log.e("yangw", "SDcard is not exist");setContentView(R.layout.nosdcard);}// this.setSelection(0);}// 判断sd卡是否存在public boolean judgeSDcard() {boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);return sdCardExist;}// 获取sd卡路径 Environmentpublic String getSDPath() {File sdDir = null;sdDir = Environment.getExternalStorageDirectory();// 获取跟目录return sdDir.toString();}/** * This function browses up one level according to the field: currentDirectory */private void upOneLevel() {if (this.currentDirectory.getParent() != null)this.EnterFolder(this.currentDirectory.getParentFile());}private void EnterFolder(final File aDirectory) {if (this.displayMode == DISPLAYMODE.RELATIVE)// getAbsolutePath 得到一个文件的绝对路径this.setTitle(aDirectory.getAbsolutePath());Log.e("open folder aDirectory.getAbsolutePath()", aDirectory.getAbsolutePath());this.currentDirectory = aDirectory;Log.e("Fill 路径", aDirectory.getPath());FillList(aDirectory.listFiles());}private void openFile(File f) {Log.e("yangw mark", f.getAbsolutePath());String fName = f.getName();String end = fName.substring(fName.lastIndexOf(".") + 1, fName.length()).toLowerCase();if(end.equals("txt")){Intent intent = new Intent();intent.putExtra("path", f.getAbsolutePath());setResult(100, intent);finish();}else{Toast.makeText(this, "请选择txt文本结构!", 0).show();}}private void FillList(File[] files) {this.directoryEntries.clear();// 清空列表String momentpath = GetCurDirectory();Log.e("GetCurDirectory momentpath", momentpath);Log.e("getSDPath sdpath", SDpath);Log.e("this.currentDirectory.getParent()", this.currentDirectory.getParent());// and the ".." == 'Up one level'for (File currentFile : files) {// 显示模式?switch (this.displayMode) {case ABSOLUTE:/* On absolute Mode, we show the full path */this.directoryEntries.add(new IconifiedText(currentFile.getAbsolutePath(), null));break;case RELATIVE:/* * On relative Mode, we have to cut the current-path at the beginning */int currentPathStringLenght = this.currentDirectory.getAbsolutePath().length();if (this.currentDirectory.getParent() != null) {this.directoryEntries.add(new IconifiedText(currentFile.getAbsolutePath().substring(currentPathStringLenght + 1), null));} else {this.directoryEntries.add(new IconifiedText(currentFile.getAbsolutePath().substring(currentPathStringLenght), null));}break;}}Collections.sort(this.directoryEntries);// 排序// 如果不是根目录则添加上一级目录if (this.currentDirectory.getParent() != null && momentpath != SDpath)if (!momentpath.equals(SDpath)) {this.directoryEntries.add(0,new IconifiedText(getString(R.string.up_one_level), null));}IconifiedTextListAdapter itla = new IconifiedTextListAdapter(this);itla.setListItems(this.directoryEntries);this.setListAdapter(itla);}// mark@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {Log.e("yangw", "short click listview: onListItemClick");super.onListItemClick(l, v, position, id);String selectedFileString = this.directoryEntries.get(position).getText();Log.e("onListItemClick Item named", selectedFileString);if (selectedFileString.equals(getString(R.string.current_dir))) {// Refresh 刷新Log.e("选择Items", "刷新");this.EnterFolder(this.currentDirectory);} else if (selectedFileString.equals(getString(R.string.up_one_level))) {// 到上一阶目录Log.e("选择Items", "返回上级");this.upOneLevel();} else {File clickedFile = null;switch (this.displayMode) {case RELATIVE:clickedFile = new File(this.currentDirectory.getAbsolutePath() + "/" + this.directoryEntries.get(position).getText());break;case ABSOLUTE:clickedFile = new File(this.directoryEntries.get(position).getText());break;}if (clickedFile.isDirectory()) {Log.e("打开文件夹", clickedFile.getName());this.EnterFolder(clickedFile);} else {Log.e("打开文件", clickedFile.getName());openFile(clickedFile);}}}// 得到当前目录的绝对路径public String GetCurDirectory() {return this.currentDirectory.getAbsolutePath();}}



效果如图所示:





代码见附件



读书人网 >Android

热点推荐