用Android做的一个简单的视频播放器

本文介绍了使用Android开发的一款视频播放器应用,包括基本的视频播放功能和视频管理。用户可以登录并播放手机本地视频,支持进度拖动、亮度和音量调节。项目涉及Swing图形界面、数据库交互和Android多媒体播放技术。
摘要由CSDN通过智能技术生成

視頻播放器项目功能需求
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();
}
//点击 '横竖屏切换'按钮

// 点击 '打开' 按钮
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值