2013-07-27 6 views
4

MediaController를 표시하기위한 코드가 있지만 Show() 메서드를 호출 할 때 치명적인 오류가 발생합니다.MediaController - Show() 호출시 오류가 발생했습니다.

MediaPlayer는 Service에서 작동하고 MediaPlayerControl 인터페이스에서 인 텐트를 가져옵니다.

내 코드 :

@Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

      mediaController = new MediaController(this, false); 
      mediaController.setMediaPlayer(mediaPlayerControl); 
      mediaController.setAnchorView(findViewById(R.id.mediaController)); 
      mediaController.setEnabled(true); 
      mediaController.show(0); 
    } 

    //implements MediaPlayerControl interface 
    private MediaPlayerControl mediaPlayerControl = new MediaPlayerControl() 
    { 

      //Override the methods to send Intent to the MediaPlayer Service 
      .... 
      .... 
    }; 

내 로그 캣 :

07-27 11 : 03 : 07.365 : E는/AndroidRuntime (328) : 치명적인 예외 : 주요 07-27 11시 3분 : 07.365 : E/AndroidRuntime (328) : java.lang.RuntimeException : 활동을 시작할 수 없습니다. ComponentInfo {com.example.radius100fm/com.example.radius100fm.MainActivity} : android.view.WindowManager $ BadTokenException : 창을 추가 할 수 없습니다 - - 토큰 null이 유효하지 않습니다. 당신의 활동은 실행 중입니까? 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1647) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1663) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : android.app.ActivityThread.access $ 1500 (ActivityThread.java:117) 07- 27 11 : 03 : 07.365 : E/AndroidRuntime (328) : android.app.ActivityThread $ H.handleMessage (ActivityThread.java:931) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : android에서 .os.Handler.dispatchMessage (Handler.java:99) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : android.os.Looper.loop (Looper.java:123) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : android.app.ActivityThread.main (ActivityThread.java:3683) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : java.lang.reflect.Method.invokeNative (네이티브 메소드) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : java .lang.reflect.Method.invoke (Method.java:507) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java : 839) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : com.android.internal.os.ZygoteInit.main (ZygoteInit.java:597) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : at dalvik.system.NativeStart.main (네이티브 메소드) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : 원인 : android.view.WindowManager $ BadTokenException : 창을 추가 할 수 없습니다. - 토큰 null이 유효하지 않습니다. 당신의 활동은 실행 중입니까? 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : android.view.ViewRoot.setView (ViewRoot.java:527) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : at android.view.WindowManagerImpl.addView (WindowManagerImpl.java:17) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : android.view.WindowManagerImpl.addView (WindowManagerImpl.java:91) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : android.view.Window $ LocalWindowManager.addView (Window.java:424) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : android. widget.MediaController.show (MediaController.java:304) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : com.example.radius100fm.MainActivity.onCreate (MainActivity.java:100) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) : android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1611) 07-27 11 : 03 : 07.365 : E/AndroidRuntime (328) :. .. 11 더

내 코드의 문제점은 무엇입니까?

+0

누군가 제발! – BTob

답변

0

그래, 정교하게 대답을 찾았습니다. 문제는 일치한다 :

mediaController.show(0); 

onCreate()에서 호출 앱이 아직 활성화되지 때문입니다. 클릭하면 클릭하면 mediaController.show(0);가 호출되어 앱이 완벽하게 작동한다는 것을 바닥에 추가했습니다.

이제 앱을 활성화 한 후에이 줄을 호출해야합니다. onStart() 및 onResume() 시도하고 작동하지 않습니다. 같은 오류 logCat.

어떻게 해결할 수 있습니까 ??

1

나는 동일한 문제를 가지고 있고 몇 시간 후에 해결책을 얻었다.

요약 :

활동 클래스는 인터페이스를 구현합니다 MediaPlayer.OnPreparedListener 및 MediaController.MediaPlayerControl

  • 에서 OnCreate 나는 다음과 같은했다. setContentView.

  • onStart MediaPlayer와 MediaController를 만들고 setOnPreparedListener로 리스너를 시작하고 MediaPlayer의 prepare() 메소드를 호출합니다.

  • 구현 방법 onPrepared. mediaController를 mediaPlayer에 연결하고, mediaPlayer를 시작하십시오. 여기서 mediaPlayer가 준비되었음을 알 때만 핸들러를 사용하여 show() 메서드를 호출합니다.

내 코드는 :

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener, MediaController.MediaPlayerControl { 

private static final String TAG = "AudioPlayer"; 

private MediaPlayer mediaPlayer; 

private MediaController mediaController; 

private Handler handler = new Handler(); 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 


} 

@Override 
protected void onStart() { 
    Log.d(TAG, "Play - onStart"); 
    super.onStart(); 

    mediaPlayer = new MediaPlayer(); 
    mediaController = new MediaController(this); 

    mediaPlayer.setOnPreparedListener(this); 

    try { 
     AssetFileDescriptor afd = getApplicationContext().getResources().openRawResourceFd(R.raw.audio_example); 
     mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); 

     mediaPlayer.prepare(); 
     afd.close(); 
    } catch (IOException e) { 
     Log.e(TAG, "Error opening audio: " + e.getCause()); 
    } 

} 

// override this method because of the OnPreparedListener interface 

@Override 
public void onPrepared(MediaPlayer mediaPlayer) { 
    Log.d(TAG, "Play - onPrepared"); 
    mediaController.setMediaPlayer(this); 
    mediaController.setAnchorView(findViewById(R.id.mediaController1)); 
    mediaPlayer.start(); 

    handler.post(new Runnable() { 

     @Override 
     public void run() { 
      mediaController.setEnabled(true); 
      mediaController.show(0); 

     } 
    }); 

} 

    // override these methods because of the MediaController.MediaPlayerControl interface 

@Override 
public boolean canPause() { 
    return true; 
} 

@Override 
public boolean canSeekBackward() { 
    return true; 
} 

@Override 
public boolean canSeekForward() { 
    return true; 
} 

@Override 
public int getAudioSessionId() { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public int getBufferPercentage() { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public int getCurrentPosition() { 
    return mediaPlayer.getCurrentPosition(); 
} 

@Override 
public int getDuration() { 
    return mediaPlayer.getDuration(); 
} 

@Override 
public boolean isPlaying() { 
    return mediaPlayer.isPlaying(); 
} 

@Override 
public void pause() { 
    mediaPlayer.pause(); 
} 

@Override 
public void seekTo(int pos) { 
    mediaPlayer.seekTo(pos); 
} 

@Override 
public void start() { 
    mediaPlayer.start(); 
} 

    // release resources before kill the Activity 

@Override 
protected void onStop() { 
    Log.d(TAG, "Play - onStop"); 
    super.onStop(); 
    if (mediaPlayer != null) { 
     mediaController.hide(); 
     mediaPlayer.stop(); 
     mediaPlayer.release(); 
     mediaPlayer = null; 
    } 
} } 
0

는 나는 이미 실행 MediaPlayer를로를 MediaController를 표시하는 데 필요한, 그래서 e_v_e 말했듯이 나는 OnPreparedListener을 설정할 수 없습니다.

이 질문에 대한 답변 : Can't fix MediaController.show() exception 모든 활동 라이프 사이클 메소드가 호출되기 전에 show 메소드가 호출되었음을 발견했습니다. 제안 된 솔루션 (지연 표시 설정)은 작동하지만 지연을 피하기 위해 show를 모든 activity lifecycle 메소드 다음에 호출되는 onAttachedToWindow 메소드 내에 배치 할 수 있습니다.

3

이 방법을 사용하십시오.

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if(mediaController != null) 
     mediaController.show(0); 
} 
관련 문제