2012-03-21 7 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에서만 발생합니다. 나는 넥서스 S (정확히는 다른 사람들의 긴 목록)에서 똑같은 코드를 실행할 수 있으며, 매번 잘 시작된다.

누구나 Galaxy Nexus 또는 ICS와 관련하여이 문제가 발생할 수있는 특정 사항을 알고 있습니까? 그리고 내가 고칠 수있는 것에 대한 제안이 있습니까?

답변

7

U이 커넥터는 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

안 그래? 내가해야하는 유일한 호출은 .prepare()와 .start()입니다. 그리고 청취자가 시작한 것은 설정 한 것과 같습니다. 그래서 prepare()가 내 활동 범위에서 호출되는 유일한 객체입니다. – FoamyGuy

+0

우수, 고맙습니다 more – 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으로 호출하십시오. 이렇게하면 "액티비티가 유실되었습니다"로그 오류 문제를 해결할 수 있습니다.

0

Galaxy Nexus에 키보드 관리자 앱이 뿌리를 내리고 작동하고 있습니까? 나는 내 응용 프로그램을 테스트 할 때 같이 동일한 스택 추적을보고 내 로그 캣에 다음 줄 덤프 몰래 보관 :

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

0

onpauseonresume 콜백을 무시하면 콜백이 문제를 해결 한 것처럼 보였습니다.이 문제가있는 넥서스 갤럭시 전용입니다.

7

ICS 이름없는 태블릿과 동일한 문제가있었습니다. 원인

setDisplay 메소드가 호출 될 때 SurfaceHolder에이 만들어지지 않습니다 :

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

이 문제를 해결하려면, 내가 사용

이의 대부분은 비록 VideoView를 지켜 보면서로 떨어져 추상화지고해야
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(); 
} 
관련 문제