音视频播放、横竖屏切换

一、音频播放

为了保证当前只有一首歌曲播放,建立一个MediaPlayer的工具类,使用单例模式建立,可是为了节省资源,咱们须要采用懒汉式去建立

工具类胆码

package com.example.day8_medioplayer;

import android.media.MediaPlayer;

import java.io.IOException;
import java.util.ArrayList;

public class MedioPlayerUtils {

    MediaPlayer mediaPlayer;
    public static MedioPlayerUtils medioPlayerUtils;
    ArrayList<Music> list = new ArrayList();
    int index = 0;
    public static final int NEXT = 0;//下一首
    public static final int DAN = 1;//单曲循环
    public static final int RAN = 2;//随机播放
    int type = 0;//当前播放歌曲类型

    // TODO 构造私有化
    private MedioPlayerUtils() {
        //确保只有一个MediaPlayer对象
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                switch (type) {
                    case NEXT:
                        next();
                        break;
                    case DAN:
                        setDataSource(index);
                        break;
                    case RAN:
                        int ran = (int) (Math.random() * list.size());
                        index = ran;
                        next();
                        break;
                }
            }
        });
    }

    // TODO 获取工具类对象
    public static MedioPlayerUtils getInstnce() {
        if (medioPlayerUtils == null) {
            synchronized (String.class) {
                if (medioPlayerUtils == null) {
                    medioPlayerUtils = new MedioPlayerUtils();
                }
            }
        }
        return medioPlayerUtils;
    }

    // TODO 设置播放模式
    public int setType() {
        switch (type) {
            case NEXT:
                type = DAN;
                break;
            case DAN:
                type = RAN;
                break;
            case RAN:
                type = NEXT;
                break;
        }
        return type;

    }

    // TODO 设置资源的方法
    public void setDataSource(int position) {
        try {
            mediaPlayer.reset();//重置
            mediaPlayer.setDataSource(list.get(position).getData());//设置资源
            mediaPlayer.prepare();//准备
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                }
            });
            index = position;

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // TODO 开始播放
    public void start() {
        if (mediaPlayer != null) {
            mediaPlayer.start();
        }
    }

    // TODO 暂停播放
    public void pause() {
        if (mediaPlayer != null) {
            mediaPlayer.pause();
        }
    }

    // TODO 下一首
    public void next() {
        index++;
        if (index >= list.size() - 1) {
            index = 0;
        }
        setDataSource(index);
    }

    // TODO 上一首
    public void pre() {
        index--;
        if (index <= 0) {
            index = list.size() - 1;
        }
        setDataSource(index);
    }

    // TODO 判断当前是否播放
    public boolean isPlaying() {
        if (mediaPlayer != null) {
            boolean playing = mediaPlayer.isPlaying();
            return playing;
        }
        return false;
    }

    // TODO 设置资源集合
    public void setList(ArrayList<Music> list) {
        this.list = list;
    }


    // TODO 获取歌曲总时长
    public long getDuration() {
        long duration = 0;
        if (mediaPlayer != null) {
            duration = mediaPlayer.getDuration();
        }
        return duration;
    }

    // TODO 获取歌曲当前时长
    public long getCurrentPosition() {
        long currentPosition = 0;
        if (mediaPlayer != null) {
            currentPosition = mediaPlayer.getCurrentPosition();
        }
        return currentPosition;
    }


    // TODO 修改歌曲当前进度
    public void seekTo(int msec) {
        if (mediaPlayer != null) {
            mediaPlayer.seekTo(msec);
        }
    }

    // TODO 返回当前歌手
    public String getArtist() {
        if (mediaPlayer != null) {
            String artist = list.get(index).getArtist();
            return artist;
        }
        return null;
    }

    // TODO 返回当前歌曲
    public String getTitle() {
        if (mediaPlayer != null) {
            String title = list.get(index).getTitle();
            return title;
        }
        return null;
    }


}

二、视频播放

用MediaPlayer去播放视频,须要采用方法将SurfaceView和MediaPlayer绑定在一块儿
@Override
    public void surfaceCreated(SurfaceHolder holder) {
        MedUtils.mediaPlayer.setDisplay(surfaceHolder);
    }

三、横竖屏切换

//LANDSCAPE 山 横屏 PORTRAIT 肖像 竖
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {//横屏
              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏
        } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {//竖屏
              setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏
        }

四、动态获取权限

String[] strings = new String[]{Manifest.permission.INTERNET};
	 	//判断安卓手机版本是否大于23,也就是安卓6.0以上
		if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
			//循环权限数组,受权
            for(int i=0;i<strings.length;i++){
                int permission = ActivityCompat.checkSelfPermission(this, strings[i]);
                if(permission== PackageManager.PERMISSION_DENIED){
                    requestPermissions(strings,101);
                }
            }
        }