开发者

Playing audio files one after another in android

开发者 https://www.devze.com 2023-03-08 02:50 出处:网络
I use the following code to record audio files and play. I have a resume function which starts recording again. The audio files are stored in sdcard. My problem is, the files get stored in the sdcard

I use the following code to record audio files and play. I have a resume function which starts recording again. The audio files are stored in sdcard. My problem is, the files get stored in the sdcard but the file alone play. I need to play all the recorded files one after another. Give suggestions. I am running out of time...

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;
    }
}


You can use MediaPlayer.onCompletionListener to listen to the event when a track ends, so that you can play the next one

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

Your code in the comment won't work, this could be a solution:

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


Yes this code will work fine but i have implemented differently and this will work more fine as given code because if you play next file inside setOnCompletionListener method then it will call only single time i.e when playing first file it will call completion method and play another file but this time it will not call so you need to create new instance . dont worry just forget use this

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

i.e play next file inside the Countdown timer finish() method it will run efficiently

0

精彩评论

暂无评论...
验证码 换一张
取 消