Android 使用mediaplayer播放视频时,表面查看空白

Android 使用mediaplayer播放视频时,表面查看空白,android,media-player,surfaceview,Android,Media Player,Surfaceview,这是我的代码,但当我启动mediaplayer时,它只发出声音,而表面没有显示任何内容。为什么? 我对此一无所知。你有一些代码可以帮我学习吗 videoV = (SurfaceView) findViewById(R.id.SurfaceView1); sh = videoV.getHolder(); File path = Environment.getExternalStorageDirectory(); File file = new File(path,

这是我的代码,但当我启动mediaplayer时,它只发出声音,而表面没有显示任何内容。为什么?

我对此一无所知。你有一些代码可以帮我学习吗

    videoV = (SurfaceView) findViewById(R.id.SurfaceView1);
    sh = videoV.getHolder();

    File path = Environment.getExternalStorageDirectory();
    File file = new File(path, "sample2.mp4");

    sh.addCallback(this);     
    mp = new MediaPlayer();
    mp.setDataSource(file.getAbsolutePath());
    mp.setDisplay(sh);
    mp.prepare();
    mp.start();

试试这段代码

resource
是您想要播放的文件名,
1。2
是程序包名,您的路径可能类似于
android。resource://package_name/raw/file_name

VideoView video=(VideoView) findViewById(R.id.videoview);
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(video);
video.setMediaController(mediaController);
//Uri uri = Uri.parse("android.resource://play.vedio/"+R.raw.dobeernotdrugs);
video.setKeepScreenOn(true);
video.setVideoPath("android.resource://one.two/raw/"+resource);
video.start();
video.requestFocus();

再看一下这个

您是否添加了准备好的侦听器?我在该方法中实现了start,因为它是指示视频何时准备好渲染的触发器

sh.addCallback(this);     
mp = new MediaPlayer();
mp.setDataSource(file.getAbsolutePath());
mp.setDisplay(sh);
mp.setOnPreparedListener(this);
mp.prepare();

public void onPrepared(MediaPlayer arg0) {
    mp.start();
}
尝试在后面添加

sh.addCallback(this);
这个

对我来说,这很有帮助

这对android新手或任何看到这一点的人来说都是有益的

在我的例子中,在
OnCreate
方法中使用此代码片段帮助我找到可以使用
SurfaceView

    if (
            GLES20.glGetString(GLES20.GL_RENDERER) == null ||
                    GLES20.glGetString(GLES20.GL_VENDOR) == null ||
                    GLES20.glGetString(GLES20.GL_VERSION) == null ||
                    GLES20.glGetString(GLES20.GL_EXTENSIONS) == null ||
                    GLES10.glGetString(GLES10.GL_RENDERER) == null ||
                    GLES10.glGetString(GLES10.GL_VENDOR) == null ||
                    GLES10.glGetString(GLES10.GL_VERSION) == null ||
                    GLES10.glGetString(GLES10.GL_EXTENSIONS) == null) {
        // try to use SurfaceView
    } else {
        // try to use TextureView
    }

要了解
SurfaceView
TextureView
之间的差异,请参阅。

自蜂巢起,方法setType已被弃用。
    if (
            GLES20.glGetString(GLES20.GL_RENDERER) == null ||
                    GLES20.glGetString(GLES20.GL_VENDOR) == null ||
                    GLES20.glGetString(GLES20.GL_VERSION) == null ||
                    GLES20.glGetString(GLES20.GL_EXTENSIONS) == null ||
                    GLES10.glGetString(GLES10.GL_RENDERER) == null ||
                    GLES10.glGetString(GLES10.GL_VENDOR) == null ||
                    GLES10.glGetString(GLES10.GL_VERSION) == null ||
                    GLES10.glGetString(GLES10.GL_EXTENSIONS) == null) {
        // try to use SurfaceView
    } else {
        // try to use TextureView
    }