2015-02-10 2 views
1

я получил следующее исключение:VideoView и MediaController в рамках DayDream?

02-10 15:30:03.676 12841-12841/hu.stuff.dreamE/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: hu.stuff.dream, PID: 12841 
    android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
      at android.view.ViewRootImpl.setView(ViewRootImpl.java:536) 
      at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259) 
      at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 
      at android.app.Dialog.show(Dialog.java:286) 
      at android.app.AlertDialog$Builder.show(AlertDialog.java:951) 
      at android.widget.VideoView$5.onError(VideoView.java:516) 
      at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:2248) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5034) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:731) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 
      at dalvik.system.NativeStart.main(Native Method) 

Для следующего кода:

public class MyDreamService extends DreamService { 
    VideoView vidView; 

    @Override 
    public void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     setInteractive(false); 
     setFullscreen(true); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public void onDreamingStarted() { 
     super.onDreamingStarted(); 
     vidView = (VideoView)findViewById(R.id.myVideo); 
     vidView.setVideoPath("Voice_Activated_Corgi.mp4"); 
     vidView.start(); 
    } 

    @Override 
    public void onDreamingStopped() { 
     super.onDreamingStopped(); 
     vidView.stopPlayback(); 
    } 

    @Override 
    public void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
    } 
} 

Совершенно очевидно, что проблема заключается в том, что это не Activity контекст, это Window в DreamService. Я действительно не хочу запускать Activity из службы (это может испортить смысл мечты, не так ли?), Но я также не хочу переопределять VideoView.

Хотя, скорее всего, мне придется идти другим путем вместо VideoView и надеюсь, что они не будут использовать диалоговые окна под ними (MediaPlayer и SurfaceView).

Любые идеи по устранению проблемы использования VideoView в DreamServiceWindow без получения BadTokenException?

ответ

1

Работает подход MediaPlayer и SurfaceView.

public class MyDreamService extends DreamService implements SurfaceHolder.Callback, MediaPlayer.OnPreparedListener { 
    private MediaPlayer mediaPlayer; 
    private SurfaceHolder vidHolder; 
    private SurfaceView vidSurface; 

    @Override 
    public void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     setInteractive(false); 
     setFullscreen(true); 
     setContentView(R.layout.activity_main); 
     vidSurface = (SurfaceView) findViewById(R.id.surfView); 
     vidHolder = vidSurface.getHolder(); 
     vidHolder.addCallback(this); 
    } 

    @Override 
    public void onDreamingStarted() { 
     super.onDreamingStarted(); 
    } 

    @Override 
    public void onDreamingStopped() { 
     super.onDreamingStopped(); 
     if(mediaPlayer.isPlaying()) { 
      mediaPlayer.stop(); 
     } 
    } 

    @Override 
    public void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      mediaPlayer = MediaPlayer.create(this, R.raw.voice_activated_corgi); 
      mediaPlayer.setLooping(true); 
      mediaPlayer.setDisplay(vidHolder); 
      mediaPlayer.setOnPreparedListener(this); 
      mediaPlayer.prepare(); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 

    } 

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

и

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:background="#000000" 
       android:paddingBottom="@dimen/activity_vertical_margin" 
       android:paddingLeft="@dimen/activity_horizontal_margin" 
       android:paddingRight="@dimen/activity_horizontal_margin" 
       android:paddingTop="@dimen/activity_vertical_margin" > 

    <SurfaceView 
     android:id="@+id/surfView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</RelativeLayout> 

на основе руководства по

http://code.tutsplus.com/tutorials/streaming-video-in-android-apps--cms-19888

Примечание: У меня есть ощущение, что мне нужно, чтобы справиться с onDreamStarted() и onPrepared() в немного умнее моды. Но это работает на данный момент. Но если бы мне нужен MediaController, то это было бы немного сложнее.