在android中一个接一个地播放音频文件

问题描述 投票:2回答:2

我使用以下代码来录制音频文件和播放。我有一个恢复功能,它会再次开始录制。音频文件存储在sdcard中。我的问题是,文件存储在sdcard中,但文件单独播放。我需要一个接一个地播放所有录制的文件。提出建议。我的时间不多了......

read SD data.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;
    }
}

audio resume1.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;
    }
}
android audio
2个回答
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();

更新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
投票

是的,这个代码可以正常工作,但我已经实现了不同,这将作为给定的代码工作更好,因为如果你在setOnCompletionListener方法内播放下一个文件,那么它将只调用一次,即当播放第一个文件时,它将调用完成方法并播放另一个文件但是这次它不会调用所以你需要创建新的实例。别担心忘记使用这个

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

即在Countdown timer finish()方法中播放下一个文件,它将高效运行

© www.soinside.com 2019 - 2024. All rights reserved.