Android VideoView Ошибка 1,0 - PullRequest
       23

Android VideoView Ошибка 1,0

2 голосов
/ 22 марта 2012

У меня есть приложение, основной целью которого является воспроизведение определенного видеофайла.

иногда корректно воспроизводит видео.Но иногда это дает мне эту ошибку:

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

Я использую подготовленный слушатель для вызова start, как это:

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, которое может вызвать это?поведение?И есть ли какие-либо предложения, которые я мог бы попытаться исправить?

Ответы [ 5 ]

7 голосов
/ 01 октября 2012

У меня была такая же проблема с планшетом 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();
}
7 голосов
/ 02 апреля 2012

UЭто связано с вашим SurfaceView.Убедитесь, что вы не трогаете SurfaceView после того, как вы вызвали prepare на вашем 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();
   }
1 голос
/ 26 июня 2012

Я справился с этой проблемой с помощью приведенной ниже реализации.

@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 голосов
/ 14 августа 2012

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

0 голосов
/ 28 июня 2012

Является ли ваш 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

Это приложение Keyboard Manager, которое запускается сразу после изменения ориентации экрана.

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

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

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

...