2013-08-31 38 views
9

Tôi đang tạo trình phát đa phương tiện cho video trực tuyến, nhưng khi tôi cố gắng chạy, tôi nhận được lỗi này: "Bề mặt đã được giải phóng". Đây là mã của tôi:..Lỗi "Bề mặt đã được phát hành"

public class VideoSample1 extends Activity implements Callback, 
    OnPreparedListener, OnCompletionListener, 
    OnClickListener, OnSeekCompleteListener, android.view.SurfaceHolder.Callback 
    { 
     public String video_path = "My video URL"; 
     private SurfaceView surfaceViewFrame; 
     private MediaPlayer player; 
     private SurfaceHolder holder; 
     private Bundle extras; 
     private static final String TAG = "log_tag"; 
     private boolean b =false; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.customvideoview); 
      extras = getIntent().getExtras(); 

      surfaceViewFrame = (SurfaceView) findViewById(R.id.surfaceViewFrame); 
      surfaceViewFrame.setOnClickListener(this); 
      surfaceViewFrame.setClickable(false); 

      holder = surfaceViewFrame.getHolder(); 
      holder.addCallback(this); 
      holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

      player = new MediaPlayer(); 
      player.setOnPreparedListener(this); 
      player.setOnCompletionListener(this); 

      player.setOnSeekCompleteListener(this); 
      player.setScreenOnWhilePlaying(true); 
      player.setDisplay(holder); 
     } 
     @Override 
     protected void onDestroy() 
     { 
      super.onDestroy(); 
      player.stop(); 
      player.release(); 
      player = null; 
      Toast.makeText(VideoSample1.this, "back",Toast.LENGTH_SHORT).show(); 
      finish(); 
     } 
     private void playVideo() 
     { 

      new Thread(new Runnable() 
      { 
       public void run() 
       { 
        try 
        { 

         player.setDataSource(VideoSample1.this, Uri.parse(extras.getString("Video URL"))); 
         player.prepareAsync(); 
        } 
        catch (IllegalArgumentException e) 
        { 
         Log.d("admin","Error while playing video"); 
         e.printStackTrace(); 
         Log.i(TAG,"tag"+ e.getMessage()); 
        } 
        catch (IllegalStateException e) 
        { 
         Log.d("admin","Error1 while playing video"); 
         e.printStackTrace(); 
         Log.i(TAG, "tag"+e.getMessage()); 
        } 
        catch (IOException e) 
        { 
         e.printStackTrace(); 
         Log.d("admin","Error while playing video.Please, check your network connection"); 
         Log.i(TAG, "tag"+e.getLocalizedMessage()); 
        } 
       } 
      }).start(); 
     } 


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

     } 

     public void surfaceCreated(SurfaceHolder holder) 
     { 
      playVideo(); 
     } 

     public void surfaceDestroyed(SurfaceHolder holder) 
     { 

     } 

     public void onPrepared(MediaPlayer mp) 
     { 
      if (!player.isPlaying()) 
      { 
       b = true; 
       player.start(); 
      } 

     } 

     public void onCompletion(MediaPlayer mp) 
     { 
      mp.stop(); 

      finish(); 
     } 


     public void onSeekComplete(MediaPlayer mp) 
     { 

     } 
     @Override 
     public void invalidateDrawable(Drawable who) 
     { 

     } 

     @Override 
     public void scheduleDrawable(Drawable who, Runnable what, long when) 
     { 
    // TODO Auto-generated method stub 

     } 

     @Override 
     public void unscheduleDrawable(Drawable who, Runnable what) 
     { 
    // TODO Auto-generated method stub 

     } 


     @Override 
     public void onClick(View v) 
     { 
    // TODO Auto-generated method stub 

     } 

} 

tôi gọi this, và các trang web stack overflow khác nhưng không làm việc với tôi :-(Lỗi là gần setdisplay (giữ) Và đây là thông điệp Logcat tôi:

08-31 10:18:01.512: E/AndroidRuntime(1162): FATAL EXCEPTION: main 
08-31 10:18:01.512: E/AndroidRuntime(1162): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.msense.msenseplayer/com.msense.msenseplayer.VideoSample1}: java.lang.IllegalArgumentException: The surface has been released 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at android.os.Looper.loop(Looper.java:137) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at android.app.ActivityThread.main(ActivityThread.java:4429) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at dalvik.system.NativeStart.main(Native Method) 
08-31 10:18:01.512: E/AndroidRuntime(1162): Caused by: java.lang.IllegalArgumentException: The surface has been released 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at android.media.MediaPlayer._setVideoSurface(Native Method) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at android.media.MediaPlayer.setDisplay(MediaPlayer.java:641) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at com.msense.msenseplayer.VideoSample1.onCreate(VideoSample1.java:53) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at android.app.Activity.performCreate(Activity.java:4578) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
08-31 10:18:01.512: E/AndroidRuntime(1162):  ... 11 more 

Trả lời

10

Hi cuối cùng tôi giải quyết lỗi của tôi. đơn giản của nó mà tôi thêm player.setdisplay theo phương pháp surfacecreated như

public void surfaceCreated(SurfaceHolder holder) 
{ 
playVideo(); 
player.setDisplay(holder); 
} 

và điều này giải quyết vấn đề của tôi.

3

Vấn đề là bạn đang thiết lập SurfaceHolder cho MediaPlayer trước khi tạo SurfaceView. Bạn có thể đợi cho đến khi Chế độ xem bề mặt được tạo hoặc gọi phương thức setDisplay bên trong phương thức surfaceCreated.