2011-05-25 67 views
2

我使用下面的代碼來錄製音頻文件並播放。我有一個恢復功能,可以重新開始錄製。音頻文件存儲在SD卡中。我的問題是,這些文件被存儲在SD卡中,但單獨播放文件。我需要一個接一個地播放所有錄製的文件。提出建議。我的時間不多了......在android中一個接一個地播放音頻文件

ReadSDData.java

包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

包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; 導入android.widget。按鈕;

public class AudioResume1 extends活動{ArrayList audNames = new ArrayList(); ArrayList audFullPath = new ArrayList(); 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; 
} 

}

+0

嗨maikandan,我面對的問題,結合3GP文件。你怎麼結合?請幫幫我。我正在爲此工作超過2個月,實際上已經耗盡我的時間。請幫幫我。 – 2012-08-02 06:35:39

+0

您不能將3gp文件組合在一起。 – Manikandan 2012-08-02 09:48:51

+0

你能說,你到底想要什麼? – Manikandan 2012-08-02 09:54:41

回答

8

您可以使用MediaPlayer.onCompletionListener聽事件時,曲目結束,這樣就可以玩下一個

UPDATE

player.setDataSource(path); 
player.prepare(); 
player.setOnCompletionListener(new OnCompletionListener() { 

     @Override 
     public void onCompletion(MediaPlayer player) { 
      player.stop(); 

      // play next audio file 

     } 

    }); 
player.start(); 

UPDATE 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(); 
} 
+0

你可以具體與我的代碼請。 – Manikandan 2011-05-25 14:08:49

+0

我已經更新了答案,但我不確定代碼中可播放文件的列表在哪裏,這有點混亂。無論如何,你只需要得到下一個文件播放,完成後事件提出和當前文件已結束.. – BFil 2011-05-25 14:22:56

+0

我用這個代碼,第一個文件播放,程序突然運行。 – Manikandan 2011-05-25 15:03:26

0

是該代碼將正常工作,但我有不同的方式實現,這將作爲給定的代碼 更細的,因爲如果你玩在setOnCompletionListener方法中的下一個文件,那麼它將只調用單個時間,即當播放第一個文件時,它將調用完成方法並播放另一個文件,但這次它不會調用,因此您需要創建新實例。不要擔心忘掉使用 這個

mc = new CountDownTimer(cownDownTime, 1000) { 
     public void onFinish() { 
      Log.i("call data hrer","aao bhai"); 
      //initlize(); 
      //updateText(); 
      //startPlayProgressUpdater(); 
     } 

即播放下一個文件的倒計時結束()方法內,將運行效率

相關問題