2012-03-21 3 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. Убедитесь, что вы не прикасаетесь к SurfaceView после того, как вы вызвали приготовление на MediaPlayer и что он виден. В вашем случае, когда вы пытаетесь проснуться на экране, убедитесь, что все происходит в правильном порядке. Поэтому подготовка 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() является единственным, вызываемым из области действия. – FoamyGuy

+0

отлично, спасибо много – braden

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. Таким образом, я могу решить проблему с ошибкой журнала «Activity is leaked window».

0

Является ли ваш Galaxy Nexus каким-либо образом внедренным и запущенным приложением для управления клавиатурой? я видел точно такую ​​же трассировку стеки, как вы при тестировании моего приложения хранил заметить следующую строку в моей LogCat отвалов:

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

Это приложение клавиатуры менеджера ног, как только ориентация экрана изменилась.

Как только я отключил службу Keyboard Manager, все снова возобновилось с моим видео.

Насколько я могу судить, они оба использовали один и тот же SurfaceHolder, и когда Keyboard Manager был с ним выполнен, он был выпущен, что вызвало это исключение, когда VideoView попытался его использовать.

Чтобы обойти это, вы можете попробовать, что упоминается here (сайт на китайском языке, но ссылка переведена). Я еще не пробовал, но, надеюсь, это сработает, поскольку использует собственный выделенный SurfaceView.

+1

nope Gnexus - это запас, и никакой менеджер клавиатуры – FoamyGuy

0

Переопределение onpause и onresume обратных вызовов, казалось, исправить это для меня, и это ТОЛЬКО для галактики NEXUS, у которой есть эта проблема.

7

У меня была та же проблема с ICS без названия планшета.

SurfaceHolder не создается, когда метод setDisplay вызывается, которые вызывают:

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(); 
}