2013-03-20 18 views
18

これは、アセットフォルダにmp3ファイルが多数あるため、他のクラスからファイル名(.mp3)を動的に取得するコードです。Android Media Player:状態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) 

ポイントが注意すべき:私は()

答えは私がprepareAsyncを使用している 2. prepareAsyncを()を使用しているスタックオーバーフローに似たスレッドをチェックして

ありがとうございます。

答えて

19

onPrepared()のメソッドを使用してstartメソッドを呼び出すこともできますMediaPlayerを用意した後にt start()が呼び出されます。

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

      mp.start(); 

     } 
    }); 
+3

を行ってもいい私はこれを使用して、それでもこのエラーを取得しています。 – WideFide

2

代わりのMediaPlayerこのpreparedSync/prepare方法を使用して、あなただけの、これはそれを準備し、それ自体

の再生を開始するか、別の方法が使用onPrepareListener()あるだろうMediaPlayer.create()

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

にURIに変換するファイルのパスを渡すことができますMediaPlayerを入力し、次にこれを準備して再生を開始します

0

状態4は、メディアプレーヤは、状態

を準備していると我々は

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

や他のことのように他のアクションを呼び出すこと。

それはあなたがちょうど

mp.start() 
を削除し、さらにプロセスに

を行うことができますと呼ばれるOnprepared()メソッドたら方法

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

をonprepare記述する必要がMediaplayer.start();

であなたのコードを1として

01以降
mp.prepareAsync(); 

そして、あなたは

関連する問題