2012-03-21 65 views
2

我有一個應用程序,它的主要目標是播放特定的視頻文件。Android VideoView錯誤1,0

它有時會播放視頻。但其他時候,它給了我這個錯誤:

03-21 14:52:36.181: I/AwesomePlayer(119): 
setDataSource_l('/data/data/my.package.name/files/MyMovie.mp4') 
03-21 14:52:36.196: W/VideoView(26612): Unable to open content: /data/data/my.package.name/files/MyMovie.mp4 
03-21 14:52:36.196: W/VideoView(26612): java.lang.IllegalArgumentException: The surface has been released 
03-21 14:52:36.196: W/VideoView(26612):  at android.media.MediaPlayer._setVideoSurface(Native Method) 
03-21 14:52:36.196: W/VideoView(26612):  at android.media.MediaPlayer.setDisplay(MediaPlayer.java:633) 
03-21 14:52:36.196: W/VideoView(26612):  at android.widget.VideoView.openVideo(VideoView.java:222) 
03-21 14:52:36.196: W/VideoView(26612):  at android.widget.VideoView.access$2000(VideoView.java:49) 
03-21 14:52:36.196: W/VideoView(26612):  at android.widget.VideoView$6.surfaceCreated(VideoView.java:465) 
03-21 14:52:36.196: W/VideoView(26612):  at android.view.SurfaceView.updateWindow(SurfaceView.java:533) 
03-21 14:52:36.196: W/VideoView(26612):  at android.view.SurfaceView.access$000(SurfaceView.java:81) 
03-21 14:52:36.196: W/VideoView(26612):  at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169) 
03-21 14:52:36.196: W/VideoView(26612):  at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590) 
03-21 14:52:36.196: W/VideoView(26612):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1617) 
03-21 14:52:36.196: W/VideoView(26612):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 
03-21 14:52:36.196: W/VideoView(26612):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-21 14:52:36.196: W/VideoView(26612):  at android.os.Looper.loop(Looper.java:137) 
03-21 14:52:36.196: W/VideoView(26612):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
03-21 14:52:36.196: W/VideoView(26612):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-21 14:52:36.196: W/VideoView(26612):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-21 14:52:36.196: W/VideoView(26612):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-21 14:52:36.196: W/VideoView(26612):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-21 14:52:36.196: W/VideoView(26612):  at dalvik.system.NativeStart.main(Native Method) 
03-21 14:52:36.196: D/VideoView(26612): Error: 1,0 

我使用的準備監聽調用這樣開始:

mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer arg0) { 
     mVideoView.start(); 

    } 
}); 

我設置數據源與此:

file = new File(this.getFilesDir() + File.separator + VIDEO_FILE_NAME); 
mVideoView.setVideoPath(file.getAbsolutePath()); 

我知道文件確實存在並且是正確的格式。

我的應用程序能夠從警報觸發器啓動。這似乎只是一個問題,當觸發器觸發並啓動我的應用程序,而設備屏幕關閉(我的應用程序將打開一個喚醒鎖屏)。如果我手動啓動應用程序,或觸發發生在視頻屏幕上播放良好。此錯誤也僅在Galaxy Nexus上發生。我可以在Nexus S上運行完全相同的代碼(以及其他一系列的代碼),並且每次都可以正常運行。

有沒有人知道可能會導致此行爲的Galaxy Nexus或ICS特有的任何內容?有什麼可以嘗試解決的建議嗎?

回答

7

UThis已連接到您的SurfaceView。 在MediaPlayer上調用準備並確保可見後,請確保不要觸摸SurfaceView。在你試圖喚醒屏幕的情況下,確保所有事情都按照正確的順序進行。因此準備MediaPlayer進行播放是您的應用程序應該做的最後一件事。可能是在應用程序完全清醒之前啓動了準備/回放,導致應用程序試圖操作SurfaceView。

後續的代碼示例說明了如何觸發類型的異常:

private void setupVideo(String file){ 
     ... 
     mSurfaceView = (SurfaceView) findViewById(R.id.surface); 
     mHolder = mSurfaceView.getHolder(); // DON'T TOUCH BEHIND THIS POINT 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     mMediaPlayer.setDisplay(mHolder); 
     mMediaPlayer.setOnPreparedListener(this); 
     mMediaPlayer.prepare(); 
    } 
    @Override 
    public void onPrepared(final MediaPlayer mp) { 
     mSurfaceView.setVisibility(View.VISIBLE); // THIS WILL CAUSE THE ERROR 
     mp.start(); 
    } 
+0

這個最應該得到由VideoView抽象出來,雖然不應該嗎?我必須做的唯一調用是.prepare(),然後是.start()。開始被聽衆調用,就像你設置的一樣。所以prepare()是我的Activities範圍中唯一被調用的。 – FoamyGuy 2012-04-02 16:18:53

+0

優秀,非常感謝 – braden 2012-05-25 20:52:26

1

我解決此問題得到了與下面的執行。

@Override 
protected void onPause() 
{ 
    Log.v("MediaVideo", "onPause"); 
    super.onPause(); 
    this.mVideoView.pause(); 
    this.mVideoView.setVisibility(View.GONE); 
} 

@Override 
protected void onDestroy() 
{ 
    Log.v("MediaVideo", "onDestroy"); 
    super.onDestroy(); 
} 

@Override 
protected void onResume() 
{ 
    Log.v("MediaVideo", "onResume"); 
    super.onResume(); 
    this.mVideoView.resume(); 
} 

重寫OnPause並調用mVideoView.pause()和設置可見性GONE。 這樣我可以解決「活動有泄漏窗口」日誌錯誤問題。

0

您的Galaxy Nexus是否有任何根植和運行Keyboard Manager應用程序的機會? 我看到完全相同的堆棧跟蹤你的測試我的應用程序出來的時候,並保持在注意到我的logcat以下行轉儲:

06-26 08:42:49.511 I/ActivityManager( 218): START {flg=0x10050000 cmp=com.ne0fhykLabs.android.utility.km/.TransitionDialog} from pid 11150 

這是鍵盤管理程序,一旦屏幕方向改變了踢。

一旦我禁用了鍵盤管理器服務,所有事情都再次開始與我的視頻一起工作。

據我所知,他們都使用相同的SurfaceHolder,並且當鍵盤管理器完成它時,它被釋放,導致VideoView試圖使用它的異常。

爲了解決這個問題,你可以試試here(該網站是中文網站,但鏈接已被翻譯)。我還沒有嘗試過,但希望它可以工作,因爲它使用了自己專用的SurfaceView。

+1

nope Gnexus是股票,沒有鍵盤管理器 – FoamyGuy 2012-06-28 04:35:59

0

覆蓋onpauseonresume回調似乎爲我解決了這個問題,它只對NEXUS Galaxy有這個問題。

7

我與ICS無名片有同樣的問題。

時setDisplay方法被調用未創建SurfaceHolder,這導致:

03-21 14:52:36.196: W/VideoView(26612): java.lang.IllegalArgumentException: The surface has been released 

要解決它,我用:

private void setupVideo(String file){ 
    ... 
    mMediaPlayer.setOnPreparedListener(this); 
    mHolder=mSurfaceView.getHolder(); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    mHolder.setKeepScreenOn(true); 
    mHolder.addCallback(new SurfaceHolder.Callback() { 
     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      mHolder=holder; 
      mMediaPlayer.setDisplay(mHolder); 
      ... 
      mMediaPlayer.prepare(); 
     } 
     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { ... } 
     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { ... } 
    }); 
} 

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