2011-01-12 29 views
0

ボタンのクリックに基づいていくつかの音楽(wav形式)ファイルを再生しようとしています。 MediaPlayerを正しく動作させることができません。 MediaPlayerクラスのオブジェクトをインスタンス化しようとするたびに、create()で失敗します。私がコードを投稿する前に、私がやっていることの流れを次に示します。
1. 2つのボタンを含むレイアウトファイル。
2.これらのボタンが読み込まれ、onClickListenersが定義されています。
3.クリックされたボタンに応じて、playAudioFile(View)という関数が呼び出され、MediaPlayerインスタンスが作成され、ファイルが再生されます。私はここで、上記の問題へのStackOverflowそのディテールソリューションにポストの多くを経ていMediaPlayerでCreate()が失敗する - android

public void playAudioFile(View v) { 
     /*Steps: 
     * 1. Take in id of the button. 
     * 2. Using id, identify what file needs to be played. 
     * 3. Play file. 
     */ 

     String path_to_file = null; //this is the path to the file. 

     if(b01.getId() == ((Button)v).getId()) { 
      Log.v(this.toString(), "Button 01 pressed."); 
      path_to_file = "/sdcard/audio/temp1.wav"; 
     } else if(b02.getId() == ((Button)v).getId()) { 
      Log.v(this.toString(), "Button02 pressed."); 
      path_to_file = "/sdcard/audio/temp2.wav"; 
     } 
     path_to_file = "file://" + path_to_file; 
     Uri streamUri = Uri.parse(path_to_file); 
     Log.v(this.toString(), "Path of file = " + path_to_file); 
     MediaPlayer mp = MediaPlayer.create(this, streamUri); 

     if(mp == null) { 
      Log.v(this.toString(), "Create() on MediaPlayer failed."); 
     } 

     mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       // TODO Auto-generated method stub 
       try { 
        mp.start(); 
       } catch (IllegalStateException e) { 
        e.printStackTrace(); 
        Log.v(this.toString(), "Illegal state exception thrown in start."); 
       } 
      } 
     }); 

     mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
       // TODO Auto-generated method stub 
       mp.release(); 
      } 
     }); 
    } 

次のようにplayAudioFile(ビュー)のためのコードです。私はそこになされたすべての提案を組み込んだ後、この問題に遭遇しています。どんな助けも大歓迎です。

おかげで、
スリラム

+0

ファイルパスの前に余分な\を追加すると思います。 –

+0

@chirag:ファイルパスの前に余分な\を追加していた場合、mediaplayerはsetDataSource()で失敗していないはずですか?なぜprepare()で?あなたの提案を試してみます。 – Sriram

+0

@chirag:いいえ、ファイルパスが何も変更しないうちに '\'を削除します。ありがとう! – Sriram

答えて

2
私はこれはこれはいくつかの方法であなたを助ける私のプレーヤー、希望の私の実装であるあなたが

MediaPlayer mp = MediaPlayer.create(this, streamUri); 

をやろうとしている理由を理解しない

MediaPlayer mp = new MediaPlayer(); 

     setContentView(R.layout.player); 

     Intent intent = getIntent(); 

     String path = ""; 

     System.out.println("My Scheme : "+intent.getData().toString().substring(8)); 

     if (intent.getData().getScheme().equals("video")) { 

      path = intent.getData().toString().substring(8); 
      System.out.println("Path : "+path); 

      if(path.endsWith(".mp3")) { 
      setContentView(R.layout.musicplayer); 
      setContentView(R.layout.controls); 

       Log.e("MusicPlayer", "Playing: " + path); 
       try { 

        Notification notification = new Notification(
          R.drawable.playbackstart, path, System.currentTimeMillis()); 
        nm.notify(NOTIFY_ID, notification); 

        mp.reset(); 
        mp.setDataSource(path); 
        mp.prepare(); 
        mp.start(); 
        mp.setOnCompletionListener(new OnCompletionListener() { 

         public void onCompletion(MediaPlayer arg0) { 
          System.out.println("Hi i am at the End"); 

         } 
        }); 
       }catch {expression} 
+0

@Sen:mp3ではなく、再生するwavファイルがあります。 MediaPlayerでもwavファイルを再生できますか? – Sriram

+0

@Sen:私がcreate()を使用した理由は、ドキュメンテーション自体がこう書いているからです。リンク:http://developer.android.com/reference/android/media/MediaPlayer.html#create(android.content.Context,%20android.net.Uri,%20android.view.SurfaceHolder) – Sriram

+0

@Sriram:__ Can MediaPlayerもwavファイルを再生しますか?はい。__ http://developer.android.com/guide/appendix/media-formats.htmlを参照してください。 – Sen

2

私が間違っていない場合は、mpPrepare()がMediaPlayer.create()内で呼び出されるため、onPrepareを使用することはできません。最も単純コードはこのようなものになることができます:あなたはより多くの精緻何かをしたい場合は

MediaPlayer mp = MediaPlayer.create(this, streamUri); 
mp.start(); 

、あなたはこれを試すことができます:それはあなたを助けている場合

MediaPlayer mp = MediaPlayer.create(this, streamUri);   
if(mp == null) {    
    Log.v(this.toString(), "Create() on MediaPlayer failed.");  
} else { 
    mp.setOnCompletionListener(new OnCompletionListener() { 

    @Override 
     public void onCompletion(MediaPlayer mp) { 
      //here you should call the methods to release memory 
      mp.stop(); 
      mp.release(); 
     } 
    }); 
    mp.start(); 

} 

は教えてください。

PD:シミュレータではなくテスト用のデバイスを使用する方が良いでしょう。一部のクラスは正しく動作しません(MediaPlayerはシミュレータでビデオを再生できません)。オーディオがサポートされているかどうかはわかりません。

+0

ねえ、答えてくれてありがとう。私はバックグラウンドサービスであなたが言ったことを試しましたが、logcatにこのメッセージがあります: '' MediaPlayerのCreate()は失敗しました。 '' –

+0

これはまだヌルなので、どうすれば修正できますか? –

+0

あなたのstreamUriとは何ですか?それを確認してください – gian1200

0

あなたの問題を理解する限り:MediaPlayer.create(...)メソッドを呼び出していて、nullを返します。つまり、MediaPlayer instanceの作成に失敗しました。このポストMediaPlayer.create() always returns nullの受け入れられた答えによると、それはcorrupted audio fileのためです。

サウンドが再生されるが、まれにcreate()メソッドもnullを返すという問題もあります。私はターンベースのゲームでサウンドを使用し、各ターンの後にサウンドが再生されます。私はいつもcreateメソッドを呼び出し、プレイヤーを起動し、完了したら解放します。それは毎回発生し、300回に1度のように、createメソッドはnullを返します...私の場合、それは他のものでなければなりません。あなたの中にはおそらくmp3ファイルの破損と関係があります。

関連する問題