2011-01-12 2 views
0

버튼 클릭을 기반으로 몇 가지 음악 (wav 형식) 파일을 재생하려고합니다. MediaPlayer가 제대로 작동하지 않습니다. MediaPlayer 클래스의 객체를 인스턴스화하려고 할 때마다 create()에서 실패합니다. 코드를 게시하기 전에 여기에 내가하고있는 일이 있습니다.
1. 두 개의 버튼이 포함 된 레이아웃 파일.
2. 해당 단추는 읽고 정의 된 onClickListeners입니다.
3. 클릭 한 단추에 따라 playAudioFile(View)이라는 함수가 호출되어 MediaPlayer 인스턴스를 만들고 파일을 재생합니다. 내가 여기에 위의 문제에 유래하는 세부 솔루션에 게시물을 많이 겪었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 : 파일 경로 앞에 추가 \를 추가하면 setDataSource()에서 mediaplayer가 실패하지 않았습니까? 왜 prepare()에서? 내가 한 제안을 시험해 보겠습니다. – Sriram

+0

@chirag : no, 파일 경로가 변경되지 않기 전에 '\'를 제거하십시오. 감사! – Sriram

답변

2
I는이 어떤 식 으로든 당신을 도울 것입니다 내 플레이어, 희망의 내 구현 당신이

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

@ 센 : 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

틀린 것이 아니라면 mpPpare()가 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(); 

} 

저를 들려 simpliest 코드는 다음과 같이 할 수 있습니다.

PD : 시뮬레이터가 아닌 테스트 용 장치를 사용하는 것이 좋습니다. 일부 클래스는 제대로 작동하지 않습니다 (MediaPlayer는 시뮬레이터에서 비디오를 재생할 수 없습니다). 그리고 오디오를 지원하는지 기억이 안납니다.

+0

안녕하세요, 답해 주셔서 감사합니다. 백그라운드 서비스에서 말한 것을 시도했지만 logcat에 다음 메시지가 나타납니다. ''MediaPlayer에서 Create()가 실패했습니다. " –

+0

이것은 여전히 ​​null이라는 것을 의미하므로 어떻게 수정해야합니까? –

+0

당신의 streamUri은 무엇입니까? 그것을 확인하십시오 – gian1200

0

문제점에 대한 이해 : MediaPlayer.create(...) 메서드를 호출하고 null을 반환합니다. 즉, MediaPlayer instance 생성에 실패했습니다. 이 게시물 MediaPlayer.create() always returns null의 대답에 따르면 그것은 corrupted audio file 예정이다.

사운드가 재생되는 드문 경우지만 create() 메소드도 null을 반환하는 문제가 있습니다. 차례를 기반으로 한 게임에서 소리를 사용합니다. 각 차례마다 소리가납니다. 나는 항상 create 메소드를 호출하고, 플레이어를 시작한 다음, 완료 될 때 해제합니다. 그것은 매 턴마다 발생하고 300 회에 한 번처럼 create 메소드가 null을 반환합니다. 따라서 제 경우에는 다른 것이어야합니다. 너의 경우에는 아마도 mp3 파일의 손상과 관련이있을 수 있습니다.

관련 문제