package llf.videomodel; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.content.res.TypedArray; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Handler; import android.os.Looper; import android.support.annotation.AttrRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import java.io.IOException; import java.util.Timer; import java.util.TimerTask; import llf.videomodel.utils.LightUtil; import llf.videomodel.utils.PlayerUtil; import static llf.videomodel.utils.PlayerUtil.dip2px; /** * Created by llf on 2017/3/16. * 视频播放器 */ public class VideoPlayer extends FrameLayout implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, SurfaceHolder.Callback, GestureDetector.OnGestureListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener { private Context context; private Activity activity; private boolean autoPlay; private LinearLayout controlLL, playError, netError; private SurfaceView mSurfaceView; private ImageView ivPlay, ivAdjust, playerLock, ivBattery, ivPlayCenter, gesture_iv_player_volume, gesture_iv_progress; private SeekBar mSeekBar; private TextView tvPlayTime, tvAllTime, tvTitle, tvSystemTime, geture_tv_volume_percentage, geture_tv_progress_time, geture_tv_light_percentage; private RelativeLayout topMenu, playerScreen, gesture_volume_layout, gesture_progress_layout, gesture_light_layout; private ProgressBar mProgressBar; // SurfaceView的创建比较耗时,要注意 private SurfaceHolder surfaceHolder; private MediaPlayer mediaPlayer; private boolean isFullscreen;//是否全屏 private boolean isPrepare; private boolean isLockScreen; private boolean isNeedBatteryListen = true, isNeedNetChangeListen = true; private GestureDetector gestureDetector; private AudioManager audiomanager; private int maxVolume, currentVolume; private String videoPath;//视频地址 private String videoTitle = "视频标题";//标题 private int video_position = 0; private Handler mHandler = new Handler(Looper.getMainLooper()); private Timer timer_controller, timer_video_time; private TimerTask task_controller, task_video_timer; //控件的位置信息 private float mediaPlayerX; private float mediaPlayerY; public VideoPlayer(@NonNull Context context) { this(context, null); } public VideoPlayer(@NonNull Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public VideoPlayer(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; this.activity = (Activity) context; TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.VideoPlayer, defStyleAttr, 0); autoPlay = a.getBoolean(R.styleable.VideoPlayer_autoPlay, true); a.recycle(); init(); } private void init() { View view = View.inflate(context, R.layout.view_player, this); controlLL = (LinearLayout) view.findViewById(R.id.controlLL); mSurfaceView = (SurfaceView) view.findViewById(R.id.surfaceView); ivPlay = (ImageView) view.findViewById(R.id.ivPlay); ivAdjust = (ImageView) view.findViewById(R.id.ivAdjust); tvAllTime = (TextView) view.findViewById(R.id.tvAllTime); tvPlayTime = (TextView) view.findViewById(R.id.tvPlayTime); mSeekBar = (SeekBar) view.findViewById(R.id.progress); tvSystemTime = (TextView) view.findViewById(R.id.tv_system_time); tvTitle = (TextView) view.findViewById(R.id.tv_title); topMenu = (RelativeLayout) view.findViewById(R.id.rl_top_menu); playerScreen = (RelativeLayout) view.findViewById(R.id.player_rl_screen); playerLock = (ImageView) view.findViewById(R.id.player_iv_lock); playError = (LinearLayout) view.findViewById(R.id.player_ll_error); netError = (LinearLayout) view.findViewById(R.id.player_ll_net); mProgressBar = (ProgressBar) view.findViewById(R.id.player_progressBar); ivBattery = (ImageView) view.findViewById(R.id.iv_battery); ivPlayCenter = (ImageView) view.findViewById(R.id.player_iv_play_center); mSeekBar.setOnSeekBarChangeListener(this); ivPlay.setOnClickListener(this); ivAdjust.setOnClickListener(this); playerLock.setOnClickListener(this); playError.setOnClickListener(this); netError.setOnClickListener(this); ivPlayCenter.setOnClickListener(this); //初始化 tvSystemTime.setText(PlayerUtil.getCurrentHHmmTime()); controlLL.setVisibility(View.GONE); topMenu.setVisibility(View.GONE); playerLock.setVisibility(View.GONE); initLock(); playerScreen.setVisibility(View.VISIBLE); mProgressBar.setVisibility(View.VISIBLE); playError.setVisibility(View.GONE); netError.setVisibility(View.GONE); ivPlayCenter.setVisibility(View.GONE); initTopMenu(); if (!autoPlay) { ivPlayCenter.setVisibility(View.VISIBLE); mProgressBar.setVisibility(View.GONE); } //初始化SurfaceView initSurfaceView(); //初始化手势 initGesture(); //存储控件的位置信息 mHandler.postDelayed(new Runnable() { @Override public void run() { mediaPlayerX = getX(); mediaPlayerY = getY(); } }, 1000); } private void initLock() { if (isFullscreen) { playerLock.setVisibility(View.VISIBLE); } else { playerLock.setVisibility(View.GONE); } } private void initTopMenu() { tvTitle.setText(videoTitle); if (isFullscreen) { topMenu.setVisibility(View.VISIBLE); } else { topMenu.setVisibility(View.GONE); } } private void initSurfaceView() { // 得到SurfaceView容器,播放的内容就是显示在这个容器里面 surfaceHolder = mSurfaceView.getHolder(); surfaceHolder.setKeepScreenOn(true); // SurfaceView的一个回调方法 surfaceHolder.addCallback(this); } /** * 没有网络 */ private void showNoNetView() { ivPlayCenter.setVisibility(View.GONE); netError.setVisibility(View.VISIBLE); mProgressBar.setVisibility(View.GONE); playError.setVisibility(View.GONE); } /** * 视频地址操作 */ private void showErrorView() { ivPlayCenter.setVisibility(View.GONE); netError.setVisibility(View.GONE); mProgressBar.setVisibility(View.GONE); playError.setVisibility(View.VISIBLE); } /** * 隐藏下方操作杆 */ private void dismissControllerMenu() { if (isFullscreen && !isLockScreen) { playerLock.setVisibility(View.GONE); } topMenu.setVisibility(View.GONE); controlLL.setVisibility(View.GONE); } /** * 上下菜单的显示和隐藏 */ private void initBottomMenuState() { tvSystemTime.setText(PlayerUtil.getCurrentHHmmTime()); if (controlLL.getVisibility() == View.GONE) { initControllerTask(); controlLL.setVisibility(View.VISIBLE); if (isFullscreen) { topMenu.setVisibility(View.VISIBLE); playerLock.setVisibility(View.VISIBLE); } } else { destroyControllerTask(true); } } /** * 设置计时器,控制器的影藏和显示 */ private void initControllerTask() { timer_controller = new Timer(); task_controller = new TimerTask() { @Override public void run() { destroyControllerTask(false); } }; timer_controller.schedule(task_controller, 5000); initTimeTask(); } private void destroyControllerTask(boolean isMainThread) { if (isMainThread) { dismissControllerMenu(); } else { mHandler.post(new Runnable() { @Override public void run() { dismissControllerMenu(); } }); } if (timer_controller != null && task_controller != null) { timer_controller.cancel(); task_controller.cancel(); timer_controller = null; task_controller = null; } destroyTimeTask(); } /** * 播放进度 */ private void initTimeTask() { timer_video_time = new Timer(); task_video_timer = new TimerTask() { @Override public void run() { mHandler.post(new Runnable() { @Override public void run() { if (mediaPlayer == null) { return; } //设置时间 tvPlayTime.setText(PlayerUtil.long2Str(mediaPlayer.getCurrentPosition())); tvAllTime.setText(PlayerUtil.long2Str(mediaPlayer.getDuration())); //进度条 int progress = mediaPlayer.getCurrentPosition(); mSeekBar.setProgress(progress); } }); } }; timer_video_time.schedule(task_video_timer, 0, 1000); } private void destroyTimeTask() { if (timer_video_time != null && task_video_timer != null) { timer_video_time.cancel(); task_video_timer.cancel(); timer_video_time = null; task_video_timer = null; } } private void unLockScreen() { isLockScreen = false; playerLock.setImageResource(R.drawable.player_lock_open); } private void lockScreen() { isLockScreen = true; playerLock.setImageResource(R.drawable.player_lock_close); } private BatteryReceiver batteryReceiver; private void registerBatteryReceiver() { if (batteryReceiver == null) { //注册广播接受者 IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); //创建广播接受者对象 batteryReceiver = new BatteryReceiver(); //注册receiver context.registerReceiver(batteryReceiver, intentFilter); } } private void unRegisterBatteryReceiver() { if (batteryReceiver != null) { context.unregisterReceiver(batteryReceiver); } } /** * 电量广播接受者 */ class BatteryReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //判断它是否是为电量变化的Broadcast Action if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { //获取当前电量 int level = intent.getIntExtra("level", 0); //电量的总刻度 int scale = intent.getIntExtra("scale", 100); int battery = (level * 100) / scale; ivBattery.setVisibility(View.VISIBLE); if (battery > 0 && battery < 20) { ivBattery.setImageResource(R.drawable.player_battery_01); } else if (battery >= 20 && battery < 40) { ivBattery.setImageResource(R.drawable.player_battery_02); } else if (battery >= 40 && battery < 65) { ivBattery.setImageResource(R.drawable.player_battery_03); } else if (battery >= 65 && battery < 90) { ivBattery.setImageResource(R.drawable.player_battery_04); } else if (battery >= 90 && battery <= 100) { ivBattery.setImageResource(R.drawable.player_battery_05); } else { ivBattery.setVisibility(View.GONE); } } } } private NetChangeReceiver netChangeReceiver; private OnNetChangeListener onNetChangeListener; private void registerNetReceiver() { if (netChangeReceiver == null) { IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); netChangeReceiver = new NetChangeReceiver(); context.registerReceiver(netChangeReceiver, filter); } } private void unregisterNetReceiver() { if (netChangeReceiver != null) { context.unregisterReceiver(netChangeReceiver); } } public class NetChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (onNetChangeListener == null || !isNeedNetChangeListen) { return; } ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo(); if (netInfo != null && netInfo.isAvailable()) { if (netInfo.getType() == ConnectivityManager.TYPE_WIFI) { //WiFi网络 onNetChangeListener.onWifi(); } else if (netInfo.getType() == ConnectivityManager.TYPE_MOBILE) { //3g网络 onNetChangeListener.onMobile(); } else { //其他 } } else { onNetChangeListener.onNoAvailable(); } } } /** * 设置横屏 */ public void setLandscape() { isFullscreen = true; //设置横屏 ((Activity) context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); if (controlLL.getVisibility() == View.VISIBLE) { topMenu.setVisibility(View.VISIBLE); } initLock(); } /** * 设置竖屏 */ public void setProtrait() { isFullscreen = false; //设置横屏 ((Activity) context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); topMenu.setVisibility(View.GONE); unLockScreen(); initLock(); } /** * 系统设置改变触发,如屏幕方向改变 * * @param newConfig */ @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); int screenWidth = PlayerUtil.getScreenWidth(activity); int screenHeight = PlayerUtil.getScreenHeight(activity); ViewGroup.LayoutParams layoutParams = getLayoutParams(); //newConfig.orientation获得当前屏幕状态是横向或者竖向 //Configuration.ORIENTATION_PORTRAIT 表示竖向 //Configuration.ORIENTATION_LANDSCAPE 表示横屏 if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //计算视频的大小16:9 layoutParams.width = screenWidth; layoutParams.height = screenWidth * 9 / 16; setX(mediaPlayerX); setY(mediaPlayerY); } if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); layoutParams.width = screenWidth; layoutParams.height = screenHeight; setX(0); setY(0); } setLayoutParams(layoutParams); } @Override public void onClick(View v) { int i = v.getId(); if (i == R.id.ivPlay) { if (mediaPlayer != null) { if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); ivPlay.setImageResource(R.drawable.video_play); } else { mediaPlayer.start(); ivPlay.setImageResource(R.drawable.video_pause); } } } else if (i == R.id.ivAdjust) { if (isFullscreen) { setProtrait(); } else { setLandscape(); } } else if (i == R.id.player_iv_lock) { if (isFullscreen) { if (isLockScreen) { unLockScreen(); initBottomMenuState(); } else { lockScreen(); destroyControllerTask(true); } } } else if (i == R.id.player_ll_error || i == R.id.player_ll_net || i == R.id.player_iv_play_center) { //播放 playVideo(videoPath, videoTitle, 0); } } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { if (mediaPlayer != null && mediaPlayer.isPlaying()) { //避免拖到最后 int maxCanSeekTo = seekBar.getMax() - 5 * 1000; if (seekBar.getProgress() < maxCanSeekTo) { mediaPlayer.seekTo(seekBar.getProgress()); } else { mediaPlayer.seekTo(maxCanSeekTo); } } } @Override public void surfaceCreated(SurfaceHolder holder) { mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDisplay(holder); // 添加到容器中 //播放完成的监听 mediaPlayer.setOnCompletionListener(this); // 异步准备的一个监听函数,准备好了就调用里面的方法 mediaPlayer.setOnPreparedListener(this); //播放错误的监听 mediaPlayer.setOnErrorListener(this); //缓冲 mediaPlayer.setOnBufferingUpdateListener(this); //第一次初始化需不需要主动播放 if (autoPlay) { //判断当前有没有网络(播放的是网络视频) if (!PlayerUtil.isNetworkConnected(context) && videoPath.startsWith("http")) { showNoNetView(); } else { //手机网络给提醒 if (PlayerUtil.isMobileConnected(context)) { Toast.makeText(context, "请注意,当前网络状态切换为3G/4G网络", Toast.LENGTH_SHORT).show(); } //添加播放路径 try { mediaPlayer.setDataSource(videoPath); // 准备开始,异步准备,自动在子线程中 mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } } } autoPlay = true; } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { //保存播放位置 if (mediaPlayer != null) { video_position = mediaPlayer.getCurrentPosition(); } destroyControllerTask(true); pauseVideo(); } /** * 手势相关 */ private static final float STEP_PROGRESS = 2f;// 设定进度滑动时的步长,避免每次滑动都改变,导致改变过快 private static final float STEP_VOLUME = 2f;// 协调音量滑动时的步长,避免每次滑动都改变,导致改变过快 private static final float STEP_LIGHT = 2f;// 协调亮度滑动时的步长,避免每次滑动都改变,导致改变过快 private int GESTURE_FLAG = 0;// 1,调节进度,2,调节音量 private static final int GESTURE_MODIFY_PROGRESS = 1; private static final int GESTURE_MODIFY_VOLUME = 2; private static final int GESTURE_MODIFY_BRIGHTNESS = 3; private void initGesture() { gesture_volume_layout = (RelativeLayout) findViewById(R.id.gesture_voice_layout); geture_tv_volume_percentage = (TextView) findViewById(R.id.gesture_voice_percentage); gesture_iv_player_volume = (ImageView) findViewById(R.id.gesture_player_voice); gesture_progress_layout = (RelativeLayout) findViewById(R.id.gesture_progress_layout); geture_tv_progress_time = (TextView) findViewById(R.id.gesture_progress_percentage); gesture_iv_progress = (ImageView) findViewById(R.id.gesture_player_progress); //亮度的布局 gesture_light_layout = (RelativeLayout) findViewById(R.id.gesture_light_layout); geture_tv_light_percentage = (TextView) findViewById(R.id.gesture_light_percentage); gesture_volume_layout.setVisibility(View.GONE); gesture_progress_layout.setVisibility(View.GONE); gesture_light_layout.setVisibility(View.GONE); gestureDetector = new GestureDetector(getContext(), this); setLongClickable(true); gestureDetector.setIsLongpressEnabled(true);//是否允许长点击,长按默认允许 audiomanager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); maxVolume = audiomanager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); // 获取系统最大音量 currentVolume = audiomanager.getStreamVolume(AudioManager.STREAM_MUSIC); // 获取当前值 } @Override public boolean onDown(MotionEvent e) { // 刚刚手指接触到触摸屏的那一刹那,就是触的那一下 return true; } @Override public void onShowPress(MotionEvent e) { //手指按在触摸屏上,它的时间范围在按下起效,在长按之前。 } @Override public boolean onSingleTapUp(MotionEvent e) { //手指离开触摸屏的那一刹那。 if (!isPrepare || isLockScreen) { return false; } initBottomMenuState(); return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { //手指在触摸屏上滑动。 if (!isPrepare || isLockScreen) { return false; } int FLAG = 0; // 横向的距离变化大则调整进度,纵向的变化大则调整音量或亮度 if (Math.abs(distanceX) >= Math.abs(distanceY)) { if (mediaPlayer != null && mediaPlayer.isPlaying()) { FLAG = GESTURE_MODIFY_PROGRESS; } } else { int intX = (int) e1.getX(); int screenWidth = PlayerUtil.getScreenWidth((Activity) context); if (intX > screenWidth / 2) { FLAG = GESTURE_MODIFY_VOLUME; } else { //左边是亮度 FLAG = GESTURE_MODIFY_BRIGHTNESS; } } if (GESTURE_FLAG != 0 && GESTURE_FLAG != FLAG) { return false; } GESTURE_FLAG = FLAG; if (FLAG == GESTURE_MODIFY_PROGRESS) { //表示是横向滑动,可以添加快进 gesture_volume_layout.setVisibility(View.GONE); gesture_light_layout.setVisibility(View.GONE); gesture_progress_layout.setVisibility(View.VISIBLE); try { if (mediaPlayer != null && mediaPlayer.isPlaying()) { if (Math.abs(distanceX) > Math.abs(distanceY)) {// 横向移动大于纵向移动 if (distanceX >= dip2px(context, STEP_PROGRESS)) {// 快退,用步长控制改变速度,可微调 gesture_iv_progress.setImageResource(R.drawable.player_backward); if (mediaPlayer.getCurrentPosition() > 3 * 1000) {// 避免为负 int cpos = mediaPlayer.getCurrentPosition(); mediaPlayer.seekTo(cpos - 3000); mSeekBar.setProgress(mediaPlayer.getCurrentPosition()); } else { //什么都不做 mediaPlayer.seekTo(3000); } } else if (distanceX <= -dip2px(context, STEP_PROGRESS)) {// 快进 gesture_iv_progress.setImageResource(R.drawable.player_forward); if (mediaPlayer.getCurrentPosition() < mediaPlayer.getDuration() - 5 * 1000) {// 避免超过总时长 int cpos = mediaPlayer.getCurrentPosition(); mediaPlayer.seekTo(cpos + 3000); // 把当前位置赋值给进度条 mSeekBar.setProgress(mediaPlayer.getCurrentPosition()); } } } String timeStr = PlayerUtil.long2Str(mediaPlayer.getCurrentPosition()) + " / " + PlayerUtil.long2Str(mediaPlayer.getDuration()); geture_tv_progress_time.setText(timeStr); } } catch (IllegalStateException e) { e.printStackTrace(); } } // 如果每次触摸屏幕后第一次scroll是调节音量,那之后的scroll事件都处理音量调节,直到离开屏幕执行下一次操作 else if (FLAG == GESTURE_MODIFY_VOLUME) { //右边是音量 gesture_volume_layout.setVisibility(View.VISIBLE); gesture_light_layout.setVisibility(View.GONE); gesture_progress_layout.setVisibility(View.GONE); currentVolume = audiomanager.getStreamVolume(AudioManager.STREAM_MUSIC); // 获取当前值 if (Math.abs(distanceY) > Math.abs(distanceX)) {// 纵向移动大于横向移动 if (currentVolume == 0) {// 静音,设定静音独有的图片 gesture_iv_player_volume.setImageResource(R.drawable.player_volume_close); } if (distanceY >= dip2px(context, STEP_VOLUME)) {// 音量调大,注意横屏时的坐标体系,尽管左上角是原点,但横向向上滑动时distanceY为正 if (currentVolume < maxVolume) {// 为避免调节过快,distanceY应大于一个设定值 currentVolume++; } gesture_iv_player_volume.setImageResource(R.drawable.player_volume_open); } else if (distanceY <= -dip2px(context, STEP_VOLUME)) {// 音量调小 if (currentVolume > 0) { currentVolume--; if (currentVolume == 0) {// 静音,设定静音独有的图片 gesture_iv_player_volume.setImageResource(R.drawable.player_volume_close); } } } int percentage = (currentVolume * 100) / maxVolume; geture_tv_volume_percentage.setText(String.valueOf(percentage + "%")); audiomanager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0); } } //调节亮度 else if (FLAG == GESTURE_MODIFY_BRIGHTNESS) { gesture_volume_layout.setVisibility(View.GONE); gesture_light_layout.setVisibility(View.VISIBLE); gesture_progress_layout.setVisibility(View.GONE); if (Math.abs(distanceY) > Math.abs(distanceX)) {// 纵向移动大于横向移动 // 亮度调大,注意横屏时的坐标体系,尽管左上角是原点,但横向向上滑动时distanceY为正 int mLight = LightUtil.GetLightness((Activity) context); if (mLight >= 0 && mLight <= 255) { if (distanceY >= dip2px(context, STEP_LIGHT)) { if (mLight > 245) { LightUtil.SetLightness((Activity) context, 255); } else { LightUtil.SetLightness((Activity) context, mLight + 10); } } else if (distanceY <= -PlayerUtil.dip2px(context, STEP_LIGHT)) {// 亮度调小 if (mLight < 10) { LightUtil.SetLightness((Activity) context, 0); } else { LightUtil.SetLightness((Activity) context, mLight - 10); } } } else if (mLight < 0) { LightUtil.SetLightness((Activity) context, 0); } else { LightUtil.SetLightness((Activity) context, 255); } //获取当前亮度 int currentLight = LightUtil.GetLightness((Activity) context); int percentage = (currentLight * 100) / 255; geture_tv_light_percentage.setText(String.valueOf(percentage + "%")); } } return false; } @Override public void onLongPress(MotionEvent e) { //手指按在持续一段时间,并且没有松开。 } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { //手指在触摸屏上迅速移动,并松开的动作。 return false; } @Override public boolean onTouchEvent(MotionEvent event) { // 手势里除了singleTapUp,没有其他检测up的方法 if (event.getAction() == MotionEvent.ACTION_UP) { GESTURE_FLAG = 0;// 手指离开屏幕后,重置调节音量或进度的标志 gesture_volume_layout.setVisibility(View.GONE); gesture_progress_layout.setVisibility(View.GONE); gesture_light_layout.setVisibility(View.GONE); } return gestureDetector.onTouchEvent(event); } @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { if (percent >= 0 && percent <= 100) { int secondProgress = mp.getDuration() * percent / 100; mSeekBar.setSecondaryProgress(secondProgress); } } @Override public void onCompletion(MediaPlayer mp) { ivPlay.setImageResource(R.drawable.video_play); destroyControllerTask(true); video_position = 0; } @Override public boolean onError(MediaPlayer mp, int what, int extra) { if (what != -38) { //这个错误不管 showErrorView(); } return true; } @Override public void onPrepared(MediaPlayer mp) { mediaPlayer.start(); // 开始播放 isPrepare = true; if (video_position > 0) { mediaPlayer.seekTo(video_position); video_position = 0; } // 把得到的总长度和进度条的匹配 mSeekBar.setMax(mediaPlayer.getDuration()); ivPlay.setImageResource(R.drawable.video_pause); tvPlayTime.setText(PlayerUtil.long2Str(mediaPlayer.getCurrentPosition())); tvAllTime.setText(PlayerUtil.long2Str(mediaPlayer.getDuration())); //延时:避免出现上一个视频的画面闪屏 mHandler.postDelayed(new Runnable() { @Override public void run() { initBottomMenuState(); playerScreen.setVisibility(View.GONE); } }, 500); } //+++++++++++++++++++++++++++++++++++++++++++++++++ // ######## 对外提供的方法 ######## //+++++++++++++++++++++++++++++++++++++++++++++++++ /** * 设置视频信息 * * @param url 视频地址 * @param title 视频标题 */ public void setDataSource(String url, String title) { //赋值 videoPath = url; videoTitle = title; } /** * 视频播放相关 */ /** * 播放视频 * * @param url 视频地址 * @param title 视频标题 */ public void playVideo(String url, String title) { playVideo(url, title, video_position); } /** * 播放视频(支持上次播放位置) * 自己记录上一次播放的位置,然后传递position进来就可以了 * * @param url 视频地址 * @param title 视频标题 * @param position 视频跳转的位置 */ public void playVideo(String url, String title, int position) { //地址判空处理 if (TextUtils.isEmpty(url)) { Toast.makeText(context, "播放地址为空", Toast.LENGTH_SHORT).show(); return; } //销毁ControllerView destroyControllerTask(true); //赋值 videoPath = url; videoTitle = title; tvTitle.setText(videoTitle); video_position = position; isPrepare = false; //判断当前有没有网络(播放的是网络视频) if (!PlayerUtil.isNetworkConnected(context) && url.startsWith("http")) { showNoNetView(); return; } //重置MediaPlayer resetMediaPlayer(); //判断广播相关 if (isNeedBatteryListen) { registerBatteryReceiver(); } else { unRegisterBatteryReceiver(); ivBattery.setVisibility(View.GONE); } //网络监听的广播 if (isNeedNetChangeListen) { registerNetReceiver(); } else { unregisterNetReceiver(); } } /** * 重置MediaPlayer */ private void resetMediaPlayer() { try { if (mediaPlayer != null) { if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); mediaPlayer.stop(); } //重置mediaPlayer mediaPlayer.reset(); //添加播放路径 mediaPlayer.setDataSource(videoPath); // 准备开始,异步准备,自动在子线程中 mediaPlayer.prepareAsync(); } } catch (Exception e) { Toast.makeText(context, "播放器初始化失败", Toast.LENGTH_SHORT).show(); } } /** * 播放视频 */ public void startVideo() { if (mediaPlayer != null) { mediaPlayer.start(); ivPlay.setImageResource(R.drawable.video_pause); } } /** * 暂停视频 */ public void pauseVideo() { if (mediaPlayer != null) { mediaPlayer.pause(); ivPlay.setImageResource(R.drawable.video_play); video_position = mediaPlayer.getCurrentPosition(); } } /** * 判断是不是全屏状态 * * @return */ public boolean isFullScreen() { return isFullscreen; } /** * 获取当前播放的位置 */ public int getVideoCurrentPosition() { int position = 0; if (mediaPlayer != null) { position = mediaPlayer.getCurrentPosition(); } return position; } /** * 获取视频总长度 */ public int getVideoTotalDuration() { int position = 0; if (mediaPlayer != null) { position = mediaPlayer.getDuration(); } return position; } /** * 销毁资源 */ public void destroyVideo() { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release();// 释放资源 mediaPlayer = null; } surfaceHolder = null; mSurfaceView = null; video_position = 0; unRegisterBatteryReceiver(); unregisterNetReceiver(); if (onNetChangeListener != null) { onNetChangeListener = null; } destroyTimeTask(); mHandler.removeCallbacksAndMessages(null); } /** * 设置是否需要电量监听 */ public void setIsNeedBatteryListen(boolean isNeedBatteryListen) { this.isNeedBatteryListen = isNeedBatteryListen; } public void setOnNetChangeListener(OnNetChangeListener onNetChangeListener) { this.onNetChangeListener = onNetChangeListener; } /** * 设置是否需要网络变化监听 */ public void setIsNeedNetChangeListen(boolean isNeedNetChangeListen) { this.isNeedNetChangeListen = isNeedNetChangeListen; } public interface OnNetChangeListener { //wifi void onWifi(); //手机 void onMobile(); //不可用 void onNoAvailable(); } }