2013-05-22 33 views
10

Tôi đang xây dựng trình phát video với đối tượng trình phát phương tiện Android. Tôi có thể nghe thấy âm thanh nhưng video không xuất hiện trên bề mặt. đây là mã của tôiLàm thế nào để đính kèm MediaPlayer với SurfaceView trong Android?

public class PlayerActivity extends Activity implements SurfaceHolder.Callback { 
    String path; 
    private MediaPlayer mp; 
    private SurfaceView mPreview; 
    private SurfaceHolder holder; 
    boolean pausing = false; 
    public static String filepath; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_player); 

     getWindow().setFormat(PixelFormat.UNKNOWN); 
     mPreview = (SurfaceView)findViewById(R.id.surfaceView); 
     holder = mPreview.getHolder(); 
     holder.setFixedSize(176, 144); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     mp = new MediaPlayer(); 

     mp.setDisplay(holder); 
     try { 
      Intent intent = getIntent(); 
      Uri fileuri = intent.getData(); 
      filepath=fileuri.getPath(); 
     } catch(Exception e) {} 

     try { 
      mp.setDataSource(filepath); 
      mp.prepare(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     mp.start(); 
    } 
} 

mục tiêu là Android 2.3 trở lên. cách khắc phục sự cố, hãy giúp tôi ..

Trả lời

20

cuối cùng tôi đã tự sửa nó. chỉ được gọi là mp.setDisplay(holder); bên trong hàm surfaceCreated(). và mã cuối cùng được

public class PlayerActivity extends Activity implements SurfaceHolder.Callback { 
    String path; 
    private MediaPlayer mp; 
    private SurfaceView mPreview; 
    private SurfaceHolder holder; 
    boolean pausing = false; 
    public static String filepath; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_player); 

     getWindow().setFormat(PixelFormat.UNKNOWN); 
     mPreview = (SurfaceView)findViewById(R.id.surfaceView); 
     holder = mPreview.getHolder(); 
     holder.setFixedSize(800, 480); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     mp = new MediaPlayer(); 


     try{ 
      Intent intent = getIntent(); 

      Uri fileuri = intent.getData(); 
      filepath=fileuri.getPath(); 
     }catch(Exception e){} 


    } 
    protected void onPause(){ 
     super.onPause(); 
     mp.release(); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     mp.setDisplay(holder); 
     play(); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 
    void play(){ 
     try { 
      mp.setDataSource(filepath); 

      mp.prepare(); 

     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     mp.start(); 
    } 
} 
+0

nó không phải là làm việc cho tôi ném lỗi ngoại lệ nhà nước bất hợp pháp trong SurfaceCreated() phương pháp tại dòng mp.setDisplay (chủ); –

1

Nó không phải là làm việc cho tôi, ném lỗi trái phép ngoại lệ nhà nước trong surfaceCreated() phương pháp tại dòng mp.setDisplay(holder);

Khai mp.setDisplay(holder) như đưa ra dưới đây:

@Override 
public void surfaceCreated(SurfaceHolder holder) 
{ 
    mediaPlayer.setDataSource(this,uri); 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    mediaPlayer.prepare(); 
    mp.setDisplay(holder); 
    mp.start; 
}