2013-03-20 84 views
18

开始调用这是我用来从其他类动态获取文件名(.mp3)的代码,因为我的资产文件夹中有很多mp3文件:Android媒体播放器:在状态4错误(-38,0)

playAudioButton.setOnClickListener(new OnClickListener() { 


      @Override 
      public void onClick(View v) 
      { 
       FileName audio=new FileName(); 
       String audioName=audio.getAudioName(count).toString(); 
       if(audioName=="NO Audio") 
       { 

        Toast.makeText(getApplicationContext(), "No Audio for this page", Toast.LENGTH_SHORT).show(); 

       } 
       else 
       { 

        try { 
         afd=getAssets().openFd(audioName + ".mp3"); 
         mp = new MediaPlayer(); 
         mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
         mp.prepareAsync(); 
         mp.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(); 
        } 
       } 




      } 
     }); 


    } 

登录猫:

03-20 11:21:28.726: E/SpannableStringBuilder(4418): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 
03-20 11:21:28.726: E/SpannableStringBuilder(4418): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 
03-20 11:22:24.968: D/libEGL(4579): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so 
03-20 11:22:24.976: D/libEGL(4579): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so 
03-20 11:22:24.984: D/libEGL(4579): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so 
03-20 11:22:25.070: D/OpenGLRenderer(4579): Enabling debug mode 0 
03-20 11:22:38.773: E/MediaPlayer(4579): start called in state 4 
03-20 11:22:38.773: E/MediaPlayer(4579): error (-38, 0) 
03-20 11:22:38.773: E/MediaPlayer(4579): Error (-38,0) 

点要注意: 1.我已经检查类似线程堆栈上溢的回答为使用 2.我已经使用prepareAsync prepareAsync()()

在此先感谢。

回答

19

你也可以用下面的onPrepared()方法来调用启动方法,所以在编制MediaPlayer后调用t start()

mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      // TODO Auto-generated method stub 

      mp.start(); 

     } 
    }); 
+3

我使用的这个,但仍收到此错误。 – WideFide 2016-08-08 18:28:45

2

不要使用此preparedSync/prepareMediaPlayer方法,你可以通过文件路径转换为URI的MediaPlayer.create()

MediaPlayer mediaPlayer = MediaPlayer.create(context, URI.parse("file://"+filePath)); 

这将准备,并开始播放本身

或者另一种方式是使用onPrepareListener()MediaPlayer然后从此准备开始玩

0

状态4是指媒体播放器是在准备状态

,我们调用其他操作,如

Mediaplayer.start() 
Mediaplayer.stop() 
Mediaplayer.pause() 

或任何其他事情。

根据你的代码是Mediaplayer.start();

你需要写onprepare方法

MediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      // TODO Auto-generated method stub 
      mp.start(); 
     } 
    }); 

一旦调用,你可以做进一步的处理

Onprepared()方法只是去除

mp.start() 

mp.prepareAsync(); 

你会好到哪里去