android播放音频,视频的操作及注意事项

android播放音频视频

首先,申请权限,音频视频的权限都是一样的
注意的是,音频视频都只要WRITE_EXTERNAL_STORAGE这个权限,Intnet权限是为了获取网络uri的视频而给的权限。
一开始oncreat里面的手动申请权限 音频视频都为这一个权限。

值得注意的是,seekbar这个内部类,需要重写三个方法,分别是
onProgressChanged(),onStartTrackingTouch(),onStopTrackingTouch()
三个方法。

android自带的视频控制器,是没有记录拖动播放的功能的,所以必须自己去定义。手机获取的音频视频时长都为毫秒,需要/1000才是秒。

以下代码就在手机SD卡目录中的一个音频,视频播放,如果联网,需要uri.parse()去解析,再去根据uri并联网执行(需要联网权限)。

最后,重写onDestroy()方法时,要记得释放资源

  @Override
    public void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null) {
            mediaPlayer.stop();
            mediaPlayer.release();
        }
        if (videoView != null) {
            videoView.suspend();
        }
    }
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
public class MainActivity extends AppCompatActivity implements View.OnClickListener {


    @Bind(R.id.seek_view_bar)
    SeekBar seekViewBar;
    private MediaPlayer mediaPlayer = new MediaPlayer();
    private boolean isChanging = false;
    private boolean isStarting = false;
    // private int currentPosition;//目前简单功能还不需要记录进度,所以用不到该int
    private Timer timer;

    @Bind(R.id.start_btn)
    Button startBtn;
    @Bind(R.id.pause_btn)
    Button pauseBtn;
    @Bind(R.id.cancel_btn)
    Button cancelBtn;
    @Bind(R.id.time_txt)
    TextView timeTxt;
    @Bind(R.id.seek_bar)
    SeekBar seekBar;

    //  private VideoView videoView;//问题出在一直重复声明videoview导致错误。很傻逼.@Bind已经全部完成了的
    @Bind(R.id.vedio_view)
    VideoView videoView;
    @Bind(R.id.start_video_btn)
    Button startVideoBtn;
    @Bind(R.id.pause_video_btn)
    Button pauseVideoBtn;
    @Bind(R.id.replay_video_btn)
    Button replayVideoBtn;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        // videoView = (VideoView) this.findViewById(R.id.vedio_view); //错啊错
        startBtn.setOnClickListener(this);
        pauseBtn.setOnClickListener(this);
        cancelBtn.setOnClickListener(this);
        startVideoBtn.setOnClickListener(this);
        pauseVideoBtn.setOnClickListener(this);
        replayVideoBtn.setOnClickListener(this);

        //手动申请权限,视频音频权限为同一个
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.
                WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{
                    Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);//权限返回码为1
        } else {
            initAudio();
            initVideo();
        }
    }

    /**
     * 打开mp4文件,文件名为movie.mp4
     */
    private void initVideo() {
        File file = new File(Environment.getExternalStorageDirectory(), "movie.mp4");
        //这是针对网络视频的加载uri。但是对网络视频有许多限制。
        //网络uri视频,需要加入联网权限。切记,否则无法播放视频
        //  Uri uri =  Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
        //  videoView.setVideoURI(uri);
        videoView.setVideoPath(file.getPath());
        videoView.requestFocus();
        videoView.setMediaController(new MediaController(this));//调出视频控制器,前后进什么的
    }

    /**
     * 为固定的SD卡目录下music.mp3文件播放
     */
    private void initAudio() {
        try {
            File file = new File(Environment.getExternalStorageDirectory(), "music.mp3");
            mediaPlayer.setDataSource(file.getPath());//准备文件
            mediaPlayer.prepare();//完成准备工作
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 依旧是申请权限
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    initAudio();
                } else {
                    Toast.makeText(this, "您禁止了权限,所以无法访问~", Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
            default:
                break;
        }
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.start_btn:
                if (!mediaPlayer.isPlaying()) {
                    mediaPlayer.start();
                    int time = mediaPlayer.getDuration();
                    //获得的时间长度除以1000才是秒数
                    int min = time / 1000 / 60;
                    int s = (time / 1000) % 60;
                    Toast.makeText(this, "" + min + "分钟" + s + "秒", Toast.LENGTH_SHORT).show();
                    timeTxt.setText("" + min + "分钟" + s + "秒");

                    //设置定时器,配合seekbar使用更新进度
                    timer = new Timer();
                    timer.schedule(new TimerTask() {
                        @Override
                        public void run() {
                            if (!isChanging) {
                                seekBar.setMax(mediaPlayer.getDuration());//设置进度条最大值
                                seekBar.setOnSeekBarChangeListener(new MySeekbar());//Myseekbar的类实例
                                seekBar.setProgress(mediaPlayer.getCurrentPosition());//seekbar设置进度
                            }
                        }
                    }, 0, 50);


                }
                break;
            case R.id.pause_btn:
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.pause();
                }
                break;
            case R.id.cancel_btn:
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.reset();
                    initAudio();
                }
                break;
            case R.id.start_video_btn:
                if (!videoView.isPlaying()) {
                    videoView.start();

                    timer = new Timer();
                    timer.schedule(new TimerTask() {
                        @Override
                        public void run() {
                            if (!isStarting) {
                                seekViewBar.setMax(videoView.getDuration());
                                seekViewBar.setOnSeekBarChangeListener(new MyMySeekbar());
                                seekViewBar.setProgress(videoView.getCurrentPosition());
                            }
                        }
                    }, 0, 100);
                    /**
                     * 该段代码,动态设置全屏模式。
                     */
                 /*   LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.MATCH_PARENT,
                            LinearLayout.LayoutParams.MATCH_PARENT);

                    videoView.setLayoutParams(layoutParams);*/
                }
                break;
            case R.id.pause_video_btn:
                if (videoView.isPlaying()) {
                    videoView.pause();
                }
                break;
            case R.id.replay_video_btn:
                if (videoView.isPlaying()) {
                    videoView.resume();
                }
                break;
            default:
                break;
        }
    }

    class MyMySeekbar implements SeekBar.OnSeekBarChangeListener {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
        //这里面是写进度改变的代码
          //  int targettime = videoView.getDuration()*seekViewBar.getProgress()/100;
        //    videoView.seekTo(targettime);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            isStarting = true;
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            videoView.seekTo(seekViewBar.getProgress());
            isStarting = false;
        }
    }

    /**
     * MySeekbar需要一个内部类,重写三个方法
     */
    class MySeekbar implements SeekBar.OnSeekBarChangeListener {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

        }

        //滚动时暂停后台的定时器
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            isChanging = true;
        }

        //滑动结束后,重新设定值
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            mediaPlayer.seekTo(seekBar.getProgress());
            isChanging = false;
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null) {
            mediaPlayer.stop();
            mediaPlayer.release();
        }
        if (videoView != null) {
            videoView.suspend();
        }
    }
}

你可能感兴趣的:(android开发)