如何在模拟器中播放本地保存的文件?

时间:2013-02-05 07:43:29

标签: android text-to-speech android-mediaplayer

我正在实现一个用于播放音频文件的应用程序(从文本到语音输出并存储在mnt/sdcard/audiofiles/audio.mp3中)。当我尝试使用MediaPlayer播放时,我收到一个错误。请看下面的代码,并告诉我。

代码:

MediaPlayer  mMediaPlayer = new MediaPlayer();
try {
  mMediaPlayer.setDataSource("/mnt/sdcard/audiofiles/audio01.mp3");
  mMediaPlayer.prepare();
} 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();
}
mMediaPlayer.start();

错误:

  02-05 13:11:40.859: I/SynthProxy(286): setting pitch to 100<br>
  02-05 13:11:40.898: E/MediaPlayer(15651): error (1, -2147483648)<br>
  02-05 13:11:40.898: W/System.err(15651): java.io.IOException: Prepare failed.: status=0x1<br>
  02-05 13:11:40.898: W/System.err(15651):  at android.media.MediaPlayer.prepare(Native Method)<br>
  02-05 13:11:40.898: W/System.err(15651):  at com.example.testmedai1.MainActivity$MySpeech.onInit(MainActivity.java:93)<br>
  02-05 13:11:40.898: W/System.err(15651):  at android.speech.tts.TextToSpeech$1.onServiceConnected(TextToSpeech.java:451)<br>
  02-05 13:11:40.898: W/System.err(15651):  at android.app.ActivityThread$PackageInfo$ServiceDispatcher.doConnected(ActivityThread.java:1247)<br>
  02-05 13:11:40.898: W/System.err(15651):  at android.app.ActivityThread$PackageInfo$ServiceDispatcher$RunConnection.run(ActivityThread.java:1264)<br>
  02-05 13:11:40.898: W/System.err(15651):  at android.os.Handler.handleCallback(Handler.java:587)<br>
  02-05 13:11:40.898: W/System.err(15651):  at android.os.Handler.dispatchMessage(Handler.java:92)<br>
  02-05 13:11:40.898: W/System.err(15651):  at android.os.Looper.loop(Looper.java:123)<br>
  02-05 13:11:40.898: W/System.err(15651):  at android.app.ActivityThread.main(ActivityThread.java:4627)<br>
  02-05 13:11:40.898: W/System.err(15651):  at java.lang.reflect.Method.invokeNative(Native Method)<br>
  02-05 13:11:40.898: W/System.err(15651):  at java.lang.reflect.Method.invoke(Method.java:521)<br>
  02-05 13:11:40.898: W/System.err(15651):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)<br>
  02-05 13:11:40.898: W/System.err(15651):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)<br>
  02-05 13:11:40.898: W/System.err(15651):  at dalvik.system.NativeStart.main(Native Method)<br>
  02-05 13:11:40.898: E/MediaPlayer(15651): start called in state 0<br>
  02-05 13:11:40.898: E/MediaPlayer(15651): error (-38, 0)<br>
  02-05 13:11:40.918: E/MediaPlayer(15651): Error (-38,0)<br>                                        

修改1:

这是我正在尝试的总代码,当按钮1单击时,我创建了一个音频文件。我使用DDMS-&gt; File Exploring检查了文件并将其保存到我的桌面并播放。它工作正常。但是当我尝试以实用方式访问它并尝试播放时,我收到了错误。

 package com.example.testmedai1;

 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.HashMap;


 import android.media.MediaPlayer;
 import android.os.Bundle;
 import android.os.Environment;
 import android.app.Activity;
 import android.speech.tts.TextToSpeech;
 import android.speech.tts.TextToSpeech.OnInitListener;
 import android.util.Log;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.Toast;

 public class MainActivity extends Activity {

Button store, play;
EditText input;
String speakTextTxt;
TextToSpeech mTts;
private String path;
HashMap<String, String> myHashRender = new HashMap<String, String>();
String tempDestFile ;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    store = (Button) findViewById(R.id.button1);
    play = (Button) findViewById(R.id.button2);
    input = (EditText) findViewById(R.id.editText1);
    store.setOnClickListener(new OnClickListener()  {

        public void onClick(View v) {


            speakTextTxt = "Hello world Hello world Hello world Hello world Hello world";
            HashMap<String, String> myHashRender = new HashMap<String, String>();
            myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, speakTextTxt);

            String exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();
            Log.d("MainActivity", "exStoragePath : "+exStoragePath);
            File appTmpPath = new File(exStoragePath + "/audiofiles/");
            boolean isDirectoryCreated = appTmpPath.mkdirs();
            Log.d("MainActivity", "directory "+appTmpPath+" is created : "+isDirectoryCreated);
            String tempFilename = "audio01.mp3";
            tempDestFile = appTmpPath.getAbsolutePath() + File.separator + tempFilename;
            Log.d("MainActivity", "tempDestFile : "+tempDestFile);
            new MySpeech(speakTextTxt);
        }
    });
}

class MySpeech implements OnInitListener
{

            String tts;

    public MySpeech(String tts)
    {
        this.tts = tts;
        mTts = new TextToSpeech(MainActivity.this, this);
    }

    public void onInit(int status) 
    {
        Log.d("MainActivity", "onInit() called");

        int i = mTts.synthesizeToFile(speakTextTxt, myHashRender, tempDestFile);
        if(i == TextToSpeech.SUCCESS)
        {

          Toast toast = Toast.makeText(MainActivity.this, "Saved "+i, Toast.LENGTH_SHORT);
          toast.show();   

        path = "/mnt/sdcard/audiofiles/audio01.mp3";

        //FileInputStream fis;


        MediaPlayer  mMediaPlayer = new MediaPlayer();
        try {
            //fis = new FileInputStream();
            mMediaPlayer.setDataSource("/mnt/sdcard/audiofiles/audio01.mp3");
            mMediaPlayer.prepare();
        } 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();
        }

        mMediaPlayer.start();
        }
        else {
            Log.v("MainActivity", "error saving wav file : "+i);
        }
    }
  }

}

编辑2:

我尝试使用以下代码,但仍然遇到同样的错误。

class MySpeech implements OnInitListener
{

            String tts;

    public MySpeech(String tts)
    {
        this.tts = tts;
        mTts = new TextToSpeech(MainActivity.this, this);
    }

    public void onInit(int status) 
    {
        Log.d("MainActivity", "onInit() called");

        int i = mTts.synthesizeToFile(speakTextTxt, myHashRender, tempDestFile);
        if(i == TextToSpeech.SUCCESS)
        {

          Toast toast = Toast.makeText(MainActivity.this, "Saved "+i, Toast.LENGTH_SHORT);
          toast.show();   

        try 
        {
            audioPlayer("mnt/sdcard/audiofiles" , "audio01.mp3");  // your file location
        } 
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 



        }
        else {
            Log.v("MainActivity", "error saving wav file : "+i);
        }
    }
  }

 public void audioPlayer(String path, String fileName) throws IOException
 {        
        if (mp != null) 
        {   System.out.println("before mp.reset() ");
               mp.reset();     
               System.out.println("after mp.reset() ");
          }

        try 
        {
            System.out.println("after path fileName ");
            mp.setDataSource(path+"/"+fileName);
            System.out.println("after path fileName ");
        } 
        catch (IllegalArgumentException e)
        {
            // TODO Auto-generated catch block
            //mp.reset();
            System.out.println("IllegalArgumentException ");
            e.printStackTrace();
        } 
        catch (IllegalStateException e)
        {
            // TODO Auto-generated catch block
            System.out.println("IllegalStateException ");
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            System.out.println("IOException ");
            e.printStackTrace();
        }
        try 
        {
            mp.prepare();
        } catch (IllegalStateException e) 
        {
            // TODO Auto-generated catch block
            System.out.println("On prepare ");
            e.printStackTrace();
        }  
        System.out.println("Before starting");
        mp.start();


 }

3 个答案:

答案 0 :(得分:0)

试试这个:

<强> main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   >
<Button id="@+id/cmd_play"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Play the music !!!"
   />
</LinearLayout>

<强> MusicPlayer.java

public class MusicPlayer extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    // Find the Button from the xml-file.
    Button cmd_play = (Button)this.findViewById(R.id.cmd_play);
    cmd_play.setOnClickListener(new OnClickListener(){
      @Override
      public void onClick(View arg0) {
        MediaPlayer mp = MediaPlayer.create(MusicPlayer.this, R.raw.everlast);
        mp.prepare();
        mp.start();
        // ie. react on the end of the music-file:
        mp.setOnCompletionListener(new OnCompletionListener(){
          // @Override
          public void onCompletion(MediaPlayer arg0) {
          // File has ended !!! <img src="http://www.anddev.org/images/smilies/wink.png" alt=";)" title="Wink" />
          }
        });
      }
    });
  }
}

答案 1 :(得分:0)

尝试使用以下方法播放文件。

 public class MainActivity extends Activity {
    Button store, play;
    EditText input;
    String speakTextTxt;
    TextToSpeech mTts;
    private String path;
    HashMap<String, String> myHashRender = new HashMap<String, String>();
    String tempDestFile;
    MediaPlayer mMediaPlayer;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    store = (Button) findViewById(R.id.button1);
    play = (Button) findViewById(R.id.button2);
    input = (EditText) findViewById(R.id.editText1);
    mMediaPlayer = new MediaPlayer();
    store.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            speakTextTxt = "Hello world Hello world Hello world Hello world Hello world";
            HashMap<String, String> myHashRender = new HashMap<String, String>();
            myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,
                    speakTextTxt);
            String exStoragePath = Environment  .getExternalStorageDirectory().getAbsolutePath();
            Log.d("MainActivity", "exStoragePath : " + exStoragePath);
            File appTmpPath = new File(exStoragePath + "/audiofiles/");
            boolean isDirectoryCreated = appTmpPath.mkdirs();
            Log.d("MainActivity", "directory " + appTmpPath
                    + " is created : " + isDirectoryCreated);
            String tempFilename = "audio01.mp3";
            tempDestFile = appTmpPath.getAbsolutePath() + File.separator
                    + tempFilename;
            Log.d("MainActivity", "tempDestFile : " + tempDestFile); 
             try {
                    audioPlayer(exStoragePath ,tempFilename);  // your file location
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
            } 
        }
    });
}
public void audioPlayer(String path, String fileName) throws IOException {
    if (mMediaPlayer != null) {
        mMediaPlayer.reset();
    }
    try {
        mMediaPlayer.setDataSource(path + "/" + fileName);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        // mp.reset();
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
 }

<强>编辑: 检查链接HERE它将指导您如何实现文本到语音 - 使用MediaPlayer在TTS中实现暂停和恢复。

我希望它能帮到你..

感谢。

答案 2 :(得分:0)

希望你在清单文件中给予读写权限,如果没有,那么给它并看看下面的例子,它会帮助你。

Play mp3 in SD Card, using Android's MediaPlayer