2014-04-24 2 views
1

MediaPlayer를 확장하는 단일 클래스로 SoundManagement 용 패키지를 만들었습니다. 이 변수를 전역 적으로 제어하기를 바랬습니다. Android MediaPlayer 오류 (상태 1에서 시작, 오류 (-38,0), 오류 (-38,0))

package soundmanagement; 

import android.content.Context; 

import android.media.MediaPlayer; 

import java.io.IOException; 

public class MusicManager extends MediaPlayer { 

    public static MediaPlayer mediaPlayer = new MediaPlayer(); 

    public void MusicManager() { 
    } 

    public static MediaPlayer create(Context context, int musicID) { 
     if (mediaPlayer != null) { 
      mediaPlayer.release(); 
     } 
     mediaPlayer.create(context, musicID); 
     try { 
      mediaPlayer.prepare(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return mediaPlayer.create(context, musicID); 
    } 

    public void prepare() { 
     try { 
      mediaPlayer.prepare(); 
      super.prepare(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void start() { 
     if (mediaPlayer != null) { 
      mediaPlayer.start(); 
     } 
     super.start(); 
    } 

    public void pause() { 
     mediaPlayer.pause(); 
     super.pause(); 
    } 

    public void stop() { 
     super.stop(); 
     mediaPlayer.release(); 
    } 

    public void release() { 
     mediaPlayer.release(); 
     super.release(); 
    } 

    public boolean isPlaying(boolean isPlaying) { 
     super.isPlaying(); 
     return isPlaying; 
    } 

    public void setLooping(boolean setLoop) { 
     mediaPlayer.setLooping(setLoop); 
     super.setLooping(setLoop); 
    } 
} 

그리고 내 MainActivity.class에서

가에서 onCreate()에서, 내가 모두가 onCreate()에서이 코드를 작성할 수 있습니다 : :

MusicManager.mediaPlayer.create(MainActivity.this, R.raw.riseofcc); 
MusicManager.mediaPlayer.start(); 

응용 프로그램 컴파일을하고 잘 실행 그냥 여기 내 코드입니다 일단 음악이 시작되면 음악이 재생되지 않습니다.

public static MediaPlayer create(Context context, int musicID) { 
     if (mediaPlayer != null) { 
      mediaPlayer.release(); 
     } 
     mediaPlayer.create(context, musicID); 
     try { 
      mediaPlayer.prepare(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return mediaPlayer.create(context, musicID); 
    } 

당신은 mediaPlayer.create을 (전화), 다음 .prepare는(), 후 작성 (: 당신은 MediaPlayer를에 호기심 접근 방식을 취하고

+0

경우'MediaPlayer'는 다음'** **'MediaPlayer'입니다 오브젝트 MusicManager'. 그렇다면 왜 새로운'MediaPlayer'를 만들려고합니까? 그래서 두 개의'MediaPlayer'가 있습니까? 이게 네가 원하는거야? 어쩌면 그것이 당신이 원하는 것일 수도 있습니다. 나는 당신의 코드를 이해하지 못하지만, 그 실수를 전에 보았습니다. – ajb

+0

@ajb ... 나는 문제는 MediaPlayer가 많은 내부 작업을 노출시키지 않고 마지막으로 많은 메서드를 표시한다는 것입니다. 그러나, 여전히 최적의 방법은 아닙니다. – ajacian81

+0

예, 죄송합니다. 전 단지 전체 응용 프로그램 내에서 글로벌 미디어 플레이어가되고 싶었습니다. 여러 가지 활동을 조작 (일시 중지, 시작, 작성)하고 별도의 형식으로 필요합니다. 나는 각 Activity 내에서 하나의 MediaPlayer를 사용하려고 시도했으며, 일들이 빠르게 복잡해졌습니다. – Azurai

답변

1

, 그러나 나를 밖으로 이동 한 것은 이것이다 ...) 다시?

또한 create는 정적 메서드이므로 MediaPlayer.create로 호출해야하며 이에 대한 참조를 보유해야합니다. prepare()를 호출 할 때 작성되지 않은 MediaPlayer 객체에서 prepare()를 호출합니다.

편집 :이 방법을 유지하려면, 적절하게 수정 : 당신의 클래스가 확장

public static MediaPlayer create(Context context, int musicID) { 
     if (mediaPlayer != null) { 
      mediaPlayer.release(); 
     } 
     mediaPlayer = MediaPlayer.create(context, musicID); 
     try { 
      mediaPlayer.prepare(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return mediaPlayer; 
    } 
+0

반환이 필요하다는 것을 알려주고 반환을 시도했습니다. return mediaPlayer; || return mediaPlayer.create (...); 그리고이 코드는 제가 여기에서 물어보기 전에 마지막 시도 중 하나였습니다. 나는 당신이 말하는 것을보고 그것을 다시하려고 노력할 것입니다. – Azurai

+0

답안을 업데이트했습니다. – ajacian81

+0

감사합니다. 고맙습니다. 다른 시간에는 슈퍼 클래스 내의 메소드에 대해 API 클래스를 확장해야합니다. 명시된대로 생성자를 사용하는 것이 가장 좋습니다 : mediaPlayer = MediaPlayer.create (..); – Azurai

관련 문제