2 zhangyicheng9 zhangyicheng9 于 2016.02.14 23:24 提问

Android学习surfaceView遇到问题。可能很简单,希望有人指点迷津

我这几天用surfaceView来做视频播放的时候,file文件读取是没有问题的,但是在之后setDataSource()和.prepare()这两个方法的其中一个(抱歉,我实在不能确定问题到底出在这两个中的哪一个)抛出了IO异常。具体代码如下,我都做注释

package com.example.zyc.surfaceview;

import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Surface;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
private MediaPlayer mediaPlayer;
private SurfaceView surfaceView;
private File file;
private Button playButton;
private Button pauseButton;
private Button stopButton;
private boolean isPlay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

    //实现各种控件
    mediaPlayer = new MediaPlayer();
    surfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
    playButton = (Button)findViewById(R.id.play);
    pauseButton = (Button)findViewById(R.id.pause);
    stopButton = (Button)findViewById(R.id.stop);

    //初始化一些变量
    isPlay = false;
    file = new File(Environment.getExternalStorageDirectory().getPath()+"/ss.mp4");
    pauseButton.setEnabled(false);

    //用来检查file是否读取正确
    if(file.exists()){
        Toast.makeText(MainActivity.this,"文件已经被获取 文件长度为"+file.length(),Toast.LENGTH_LONG).show();
    }else{
        Toast.makeText(MainActivity.this,"文件没有获得",Toast.LENGTH_LONG).show();
    }

    //实现三个按钮的方法
    playButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mediaPlayer.reset(); //重置MediaPlay对象

            try {
                mediaPlayer.setDataSource(file.getAbsolutePath());  //读取视频文件地址
                mediaPlayer.prepare();                              //预加载视频
                mediaPlayer.setDisplay(surfaceView.getHolder());  //将视频画面输出到surface上
                mediaPlayer.start();                                //开始播放
                pauseButton.setText("暂停");                        //pause此时为暂停
                pauseButton.setEnabled(true);                       //pause按钮此时可用
                isPlay = true;
            }catch (IOException e){
                Toast.makeText(MainActivity.this,"发生错误",Toast.LENGTH_LONG).show();
            }

        }
    });

    pauseButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (isPlay == true) {
                pauseButton.setText("继续");
                mediaPlayer.pause();
                isPlay = false;
            } else {
                mediaPlayer.start();
                pauseButton.setText("暂停");
                isPlay = true;
            }
        }
    });

    stopButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(isPlay==true){
                mediaPlayer.stop();
                Toast.makeText(MainActivity.this,"已停止",Toast.LENGTH_LONG).show();
                pauseButton.setEnabled(false);
            }
        }
    });
}

}
用的android studio,三星真机模拟
运行后的截图,(我还没点播放)
图片说明
可以看到,文件长度。说明file的没有问题的

但是点击播放以后
图片说明

实在是不明白这怎么能错,其他人貌似也没有我这毛病啊

4个回答

zhangyicheng9
zhangyicheng9   2016.02.16 00:16
已采纳

这个问题已经 解决了 问题在于AndroidMainfest.xml文件中我没有设置应用读取本地文件的权限
加在application标签后面即可

zhangyicheng9
zhangyicheng9   2016.02.14 23:59

顶上去,有人会的帮一下吧

lidec
lidec   2016.02.15 00:24

是android4.4吗 不行换个播放器,别用安卓自带MediaPlayer

lidec
lidec 回复张弋丞是很不努力的程序员: 我原来做一个东西也有这种情况,我是延时了一会儿,大概1s左右吧。总的来说感觉自带的MediaPlayer不好用
接近 2 年之前 回复
zhangyicheng9
zhangyicheng9 文件的获取是没有问题的。就是setDataSource死活不能把mp4文件给mediaplay
接近 2 年之前 回复
zhangyicheng9
zhangyicheng9 除了这个,我知道的就只有videoview了。
接近 2 年之前 回复
zhangyicheng9
zhangyicheng9 是mediaplay不好吗?
接近 2 年之前 回复
zhangyicheng9
zhangyicheng9   2016.02.15 09:10

顶起来顶起来顶起来,别沉啊,

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!