視頻播放器项目功能需求
1 项目概述
1.1 项目描述
視頻播放器(以及視頻管理系統)是一款由java(Swing,安卓和数据库)做的手机视频播放器,可以看手机本地的各种视频,通过按钮进入手机视频管理器。
1.2 项目需求
实现手机的视频播放以及视频的管理(二者是分开的,视频播放器和视频管理里系统)。
手机视频播放器用安卓来做,视频管理系统用Swing和数据库制作。
1.2.1 基本功能
初始生成一个登陆界面,进入登录注册。
注册之后进入视频播放界面。
用户可以通过HOME键打开手机本地视频。
1.2.2 扩展功能
拖动进度条
调节亮度
调节音量
2 项目知识点覆盖
本项目功能实现涉及并覆盖如下知识点:
Swing图形用户界面。
实现与数据库的交互。
Android多媒体视频播放。
这个视频播放器是用Android studio写的,环境配置的话,自己弄好就行了= =,太久之前写的我有些记不住了。
Global类:
package example.video3;
/**
- Created by Lenovo on 2019/5/30.
*/
public class Global {
public static Global i = new Global();
public String username = ""; // 当前用户的名字
}
MainActivity类:
package example.video3;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.database.Cursor;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.VideoView;
import java.io.File;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity//去頭部!!!头部窗口AppCompatActivity
//我设置的一些图标模块在AppCompatActivity里,如果用Activity,界面的一些图标就会失效,例如播放图标,功能没有消失,但图标失踪
{
final String TAG = "测试";
final int REQ_OPEN_FILE = 101;
Intent intent;//Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,
// Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。Intent这个英语单词的本意是“目的、意向、意图”。
//Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,
// Android会根据意愿的内容选择适当的组件来响应。
VideoView videoView; // 播放器控件
SeekBar videoBar; // 可拖放视频进度条
SeekBar voiceBar; //音量进度条
SeekBar lightBar; //亮度进度条
View controlBar;//控制面板,暂停,播放,进度
View rotateBar;//控制面板,横屏,竖屏(未实现),分享(实现)
View titleBar;//返回上一界面,控制亮度,音量
private AudioManager mAudioManager;
//AudioManager类位于android.Media 包中,该类提供访问控制音量和钤声模式的操作。
private int maxVoice;
private int currentVoice;
Handler msgHandler;//Handler是Android SDK来处理异步消息的核心类。
//子线程与主线程通过Handler来进行通信。子线程可以通过Handler来通知主线程进行UI更新。
Timer timer;
//Timer,定时器,功能是在指定的时间间隔内反复触发指定窗口的定时器事件
TimerTask timerTask;
//Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。
// TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。
@Override
protected void onCreate(Bundle savedInstanceState)
{
// 从字面上看savedInstanceState,是保存实例状态的。实际上,savedInstanceState也就是保存Activity的状态的。
// 那么,savedInstanceState中的状态数据是从何处而来的呢?下面我们介绍Activity的另一个方法saveInstanceState。
// onsaveInstanceState方法是用来保存Activity的状态的。当一个Activity在生命周期结束前,会调用该方法保存状态。
// 这个方法有一个参数名称与onCreate方法参数名称相同。
//requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
// WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
requestWindowFeature(Window.FEATURE_NO_TITLE );//隐藏标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,//设置标题
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);//保存状态
setContentView(R.layout.activity_main);
//R.layout.main是个布局文件即控件都是如何摆放如何显示的,
// setContentView就是设置一个Activity的显示界面,这句话就是设置这个这句话所再的Activity采用R.layout下的main布局文件进行布局
//AudioManager类声明
mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);//音量权限申请
// 权限支持
Permissions.check(this);
// 初始化界面
videoView = (VideoView)findViewById(R.id.id_videoview);// 播放器控件
videoBar = (SeekBar) findViewById(R.id.id_seekbar);//可拖放视频进度条
videoBar.setMax(100);//保险起见,注释掉也可以正茬运行
voiceBar = (SeekBar) findViewById(R.id.id_voiceBar);//音量进度条
lightBar = (SeekBar) findViewById(R.id.id_lightBar);//亮度进度条
//消息支持
msgHandler = new MyHandler();
//Handler是Android SDK来处理异步消息的核心类。
//子线程与主线程通过Handler来进行通信。子线程可以通过Handler来通知主线程进行UI更新。
//测试方法
initViews();//初始化
initLight();
initVoice();
// 播放控制(暂停、继承)
final ImageButton playstop = (ImageButton) findViewById(R.id.id_paly_pause);//播放键
playstop.setOnClickListener(new View.OnClickListener() {//监听器,点击按钮调用另外的方法
@Override
public void onClick(View v) {
if(videoView.isPlaying())
{
videoView.pause();
playstop.setImageDrawable(getDrawable(R.drawable.go_next1));
}
else
{
videoView.start();
playstop.setImageDrawable(getDrawable(R.drawable.pause3));
}
}
});
//播放控制(进度播放)
videoBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// * 拖动条进度改变的时候调用
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// * 拖动条开始拖动的时候调用
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {// * 拖动条停止拖动的时候调用
// 控制视频跳转到目标位置
if(videoView.isPlaying())
{
int progress = seekBar.getProgress();//获取当前seekBar的值
int position = progress * videoView.getDuration() / 100;//getDuration()获取载入的视频文件的时长
videoView.seekTo( position );//从指定位置播放视频
}
}
});
// 控制面板的显示和隐藏
controlBar = findViewById(R.id.id_control_bar);//三個佈局,下方
rotateBar = findViewById(R.id.id_rotate_bar);//侧
titleBar = findViewById(R.id.id_title_bar);//头部
videoView.setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
Log.d(TAG, “点中画面…”);
if(controlBar.getVisibility() == View.GONE)
{
controlBar.setVisibility(View.VISIBLE);//显示面板
rotateBar.setVisibility(View.VISIBLE);
titleBar.setVisibility(View.VISIBLE);
}
else
{
controlBar.setVisibility(View.GONE);//隐藏面板
rotateBar.setVisibility(View.GONE);
titleBar.setVisibility(View.GONE);
Log.d(TAG, “隐藏播放控制面板…”);
}
return false;
}
});
// 接受外部调用
Intent intent = getIntent();
Uri mediaUri = intent.getData();
/**理解URI和URL的区别,我们引入URN这个概念。
URI = Universal Resource Identifier 统一资源标志符
URL = Universal Resource Locator 统一资源定位符
URN = Universal Resource Name 统一资源名称
这三者的关系如下图:
也就是说,URI分为三种,URL or URN or (URL and URI)
URL代表资源的路径地址,而URI代表资源的名称。
通过URL找到资源是对网络位置进行标识,:*/
if(mediaUri != null)
{
videoView.setVideoURI(mediaUri);
videoView.start();
}
}
@Override
protected void onStart()
{
//只是在activity界面启动时候调用,如何想要在播放后实行横竖屏切换就要重新创造一个activity
//或者刷新界面
//横屏播放控制
if(getRequestedOrientation()!= ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)//横向打印
{ // 取得当前屏幕方向,如果不是横屏打印,就换成横屏打印
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
super.onStart();
if(timer == null)
{
// 启动定时器(间隔500ms)
timerTask = new MyTimerTask();
timer = new Timer();
timer.schedule(timerTask, 500, 500);//就是看进度条跑的速度
}
}
@Override
protected void onStop()
{
if(timer != null)
{
//本界面隐藏时,要停止定时器(因为本界面已经隐藏了,如果继续刷新界面将毫无意义、白白耗费CPU)
timer.cancel();
timer = null;
}
super.onStop();
}
//点击 '横竖屏切换'按钮
// 点击 '打开' 按钮