问题描述
|
我使用以下代码记录音频文件并播放。我具有恢复功能,可以再次开始记录。音频文件存储在“ 0”中。我的问题是,文件存储在ѭ0中,但是文件独自播放。我需要一个接一个地播放所有录制的文件。提出建议。我快没时间了...
ReadSDData.java
package com.fsp.audio;
import java.io.File;
import java.util.ArrayList;
import android.os.Environment;
import android.util.Log;
public class ReadSDDatas {
public String filePath()
{
String newFolderName=\"/MyAudio\";
String extstoredir=Environment.getExternalStorageDirectory().toString();
String newPath=extstoredir+newFolderName;
return newPath;
}
public String getCombineFile()
{
String newFolderName=\"/MyComAudio\";
String extstoredir=Environment.getExternalStorageDirectory().toString();
String path=extstoredir+newFolderName;
File myNewPath=new File(path);
if(!myNewPath.exists())
{
myNewPath.mkdir();
}
String audname=\"ComAudio\";
String ext=\".3gp\";
File audio=new File(myNewPath,audname+ext);
if(audio.exists())
{
audio.delete();
}
String audpath=path+\"/\"+audname+ext;
Log.d(\"Combined audio file\",audpath);
return audpath;
}
public ArrayList<String> getFileNames()
{
ArrayList<String> names=new ArrayList<String>();
names.clear();
String path=filePath();
File f=new File(path);
if(f.isDirectory())
{
File[] files=f.listFiles();
for(int i=0;i<files.length;i++)
{
System.out.println(\"File Name======>>>\"+files[i].getName());
names.add(files[i].getName().toString().trim());
}
}
return names;
}
public ArvrayList<String> getFullAudioPath()
{
ArrayList<String> fullPath=new ArrayList<String>();
fullPath.clear();
String path=filePath();
File f=new File(path);
if(f.isDirectory())
{
File[] files=f.listFiles();
for(int i=0;i<files.length;i++)
{
String fpath=path+File.separator+files[i].getName().toString().trim();
System.out.println(\"File Full Path======>>>\"+fpath);
fullPath.add(fpath);
}
}
return fullPath;
}
}
AudioResume1.java
package com.fsp.audio;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class AudioResume1 extends Activity {
ArrayList<String> audNames=new ArrayList<String>();
ArrayList<String> audFullPath=new ArrayList<String>();
byte fileContent[];
Button record=null;
Button stoprec=null;
Button play=null;
public MediaPlayer player=null;
public MediaRecorder recorder=null;
int cou=0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
record=(Button)findViewById(R.id.recBtn);
stoprec=(Button)findViewById(R.id.stopBtn);
play=(Button)findViewById(R.id.playBtn);
record.setonClickListener(new OnClickListener(){
@Override
public void onClick(View v)
{
// Todo Auto-generated method stub
System.out.println(\"********** Stated Recording **********\");
recorder=new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setoutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
String path=audioFilePath();
System.out.println(\"Recording Path===========>>>\"+path);
recorder.setoutputFile(path);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try
{
recorder.prepare();
recorder.start();
}
catch (IllegalStateException e)
{
// Todo Auto-generated catch block
e.printstacktrace();
}
catch (IOException e)
{
// Todo Auto-generated catch block
e.printstacktrace();
}
}
});
stoprec.setonClickListener(new OnClickListener(){
@Override
public void onClick(View v)
{
// Todo Auto-generated method stub
System.out.println(\"********** Stoped Recording **********\");
recorder.stop();
recorder.release();
recorder=null;
}
});
play.setonClickListener(new OnClickListener(){
@Override
public void onClick(View v)
{
// Todo Auto-generated method stub
getAudioNames();
readAudioAsstream();
}
});
}
public void readAudioAsstream()
{
getAudioPath();
File f;
FileInputStream ins = null;
ReadSDDatas rds=new ReadSDDatas();
try
{
String comfile=rds.getCombineFile();
//FileOutputStream fos=new FileOutputStream(comfile);
Log.d(\"combined file\",comfile);
File file=new File(comfile);
RandomAccessFile raf = new RandomAccessFile(file,\"rw\");
Log.d(\"path size\",Integer.toString(audFullPath.size()));
for(int i=0;i<audFullPath.size();i++)
{
String filepath=audFullPath.get(i);
Log.d(\"Filepath\",filepath);
f=new File(audFullPath.get(i));
fileContent = new byte[(int)f.length()];
ins=new FileInputStream(audFullPath.get(i));
int numofbytes=ins.read(fileContent);
System.out.println(\"Number Of Bytes Read===========>>>\"+numofbytes);
raf.seek(file.length());
raf.write(fileContent);
}
}
catch (FileNotFoundException e1)
{
// Todo Auto-generated catch block
e1.printstacktrace();
}
catch (IOException e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
playAudio();
/*for(int i=0;i<audFullPath.size();i++)
{
Log.d(\"fullpathsize\",Integer.toString(audFullPath.size()));
playAudio(audFullPath.get(i));
}*/
}
public void playAudio()
{
//Log.d(\"value of path\",path);
/*String newFolderName=\"/MyComAudio\";
String extstoredir=Environment.getExternalStorageDirectory().toString();
String filename=\"ComAudio.3gp\";
String path1=extstoredir+newFolderName+filename;
Log.d(\"path1\",path1);*/
String path=\"/sdcard/MyComAudio/ComAudio.3gp\";
player= new MediaPlayer();
try
{
player.setDataSource(path);
player.prepare();
player.start();
}
catch (IllegalArgumentException e)
{
// Todo Auto-generated catch block
e.printstacktrace();
}
catch (IllegalStateException e)
{
// Todo Auto-generated catch block
e.printstacktrace();
}
catch (IOException e)
{
// Todo Auto-generated catch block
e.printstacktrace();
}
}
public void getAudioPath()
{
ReadSDDatas rds=new ReadSDDatas();
audFullPath=rds.getFullAudioPath();
}
public void getAudioNames()
{
ReadSDDatas rds=new ReadSDDatas();
audNames=rds.getFileNames();
}
public String audioFilePath()
{
String newFolderName=\"/MyAudio\";
String extstoredir=Environment.getExternalStorageDirectory().toString();
String path=extstoredir+newFolderName;
File myNewPath=new File(path);
if(!myNewPath.exists())
{
myNewPath.mkdir();
}
cou++;
String audname=\"RecAudio\";
String ext=\".3gp\";
File audio=new File(myNewPath,audname+Integer.toString(cou)+ext);
if(audio.exists())
{
audio.delete();
}
String audpath=path+File.separator+audname+Integer.toString(cou)+ext;
return audpath;
}
}
解决方法
您可以使用MediaPlayer.onCompletionListener在轨道结束时收听事件,以便播放下一首
更新
player.setDataSource(path);
player.prepare();
player.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer player) {
player.stop();
// play next audio file
}
});
player.start();
更新2
您在注释中的代码将无法使用,这可能是一种解决方案:
int i = 0;
//somewhere in your activity you start playing your first file
playAudio(\"/sdcard/MyAudio/RecAudio\"+i+\".3gp\");
public void playAudio(path) {
player.setDataSource(path);
player.prepare();
player.setOnCompletionListener(new OnCompletionListener() {
@Override public void onCompletion(MediaPlayer mp) {
player.stop();
if(i < numberOfFiles) {
i++;
playAudio(\"/sdcard/MyAudio/RecAudio\"+i+\".3gp\");
} else i = 0;
}
});
player.start();
}
,是的,此代码可以正常工作,但是我已经实现了不同的方式,并且在给定的代码下可以更好地工作
因为如果您在setOnCompletionListener方法中播放下一个文件,那么它只会调用一次,即在播放第一个文件时,它会调用完成方法并播放另一个文件,但是这次不调用,因此您需要创建新实例。别担心,只是忘记使用
这个
mc = new CountDownTimer(cownDownTime,1000) {
public void onFinish() {
Log.i(\"call data hrer\",\"aao bhai\");
//initlize();
//updateText();
//startPlayProgressUpdater();
}
即在Countdown timer finish()方法中播放下一个文件,它将高效运行