Как подключить MediaPlayer с SurfaceView в Android?

Я создаю видеопроигрыватель с объектом медиа-плеера 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(); } } 

Цель – Android 2.3 и выше. Как исправить это, пожалуйста, помогите мне ..

Solutions Collecting From Web of "Как подключить MediaPlayer с SurfaceView в Android?"

Наконец, я исправил это сам. Просто называется mp.setDisplay(holder); Внутри функции surfaceCreated (). И конечный код

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

Это не работает для меня, бросая ошибку незаконного состояния в surfaceCreated() в строке mp.setDisplay(holder);

mp.setDisplay(holder) как указано ниже:

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