android - restart() 时如何为视频播放重新创建 surfaceview?

标签 android

我想制作一个视频播放器。 当我运行应用程序时,下面的代码正在运行。 但如果我单击主页键并返回 Activity ,声音会传来但视频消失了。 我认为这是因为 surfaceview 被破坏了。

我尝试了几种方法来重新创建 serfaceView,但没有奏效。 每次都只发出声音。

请查看我的代码并帮助我~!

我现在正在制作一些自定义 UI.. 所以我不能使用 videoview 和 mediacontroller。 请仅针对 MediaPlayer 的情况提出建议..

谢谢!

public class AndroidVideoPlayerActivity extends Activity implements SurfaceHolder.Callback{
SurfaceView surface;
SurfaceHolder sh;
MediaPlayer mp;
String web_video = "http://xxx.mp4";  //some address
Button startB, stopB;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    startB = (Button)findViewById(R.id.startB);
    stopB = (Button)findViewById(R.id.stopB);
    surface = (SurfaceView)findViewById(R.id.surfaceView1);
    sh = surface.getHolder();
    sh.addCallback(this);
    sh.setFixedSize(400, 300);
    sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    mp = new MediaPlayer();
    mp.setDisplay(surface.getHolder());



    startB.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            playVideo();
        }
    });

    stopB.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            stopVideo();
        }
    });

}//onCreate

@Override
protected void onPause() {
    super.onPause();
    mp.pause();
}

@Override
protected void onRestart() {
    super.onRestart();
    mp.start();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mp.stop();
    mp.release();
    mp = null;
}

private void playVideo(){
    try{
        mp.setDataSource(web_video);
        mp.prepare();
        mp.start();

    }catch(Exception e){
        Log.d("ERROR", e+"");
    }



}

private void stopVideo(){
    mp.stop();
    mp.release();
    mp = null;
}

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

@Override
public void surfaceCreated(SurfaceHolder holder) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}

最佳答案

我自己回答。

我在 surfaceCreated 中放了两行,它起作用了。

public void surfaceCreated(SurfaceHolder holder) {
    if(mp == null)mp = new MediaPlayer();
    mp.setDisplay(holder);

}

关于android - restart() 时如何为视频播放重新创建 surfaceview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296655/

相关文章:

android - 有办法选择要构建的构建变体吗?

android - 从 firebase 检索图像多次显示相同的图像

android - 如何在android中将一个线性布局设置在另一个线性布局下方

无法重新分配 Android val

android - 方向改变时键盘隐藏

java - 升级Android项目以使用java 8并超出GC开销限制

android - 用一个 flavor 和多个配置构建多个apk

android - 相对布局 : Many options if elements are GONE

android - Environment.getExternalStoragePublicDirectory 提供内部存储

Android ImageView : Fit Width