2013-03-20 87 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(); 

你會好到哪裏去