Android视频播放器开发

本文介绍了使用VideoView和MediaController开发Android视频播放器的实例,详细讲解了如何实现播放、暂停、快进和快退功能。在创建的VideoView项目中,重点阐述了布局设计、生命周期管理和权限设置,同时分享了三个Android Studio的实用快捷键。

Android视频播放器开发

第一个播放器开发的实例,是通过VideoView+MediaController的方式实现的
主要实现了视频播放、暂停、快进、快退的功能
创建项目的名称为VideoView,建立类名为MyVideoView
一、项目的布局写法
代码中注释的部分记得去掉
注:横竖屏切换时会导致重走生命周期,为了避免这种情况,在在AndroidManifest中配置

    <activity android:name=".MainActivity"
              android:configChanges="keyboardHidden|orientation|screenSize">

除此之外还需要在AndroidManifest中添加网络权限和sd卡权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在activity_main.xml中添加视图布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.eddie.videoview.MainActivity">

    <RelativeLayout
        android:id="@+id/rl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center">

        //控制视频大小
        <com.example.eddie.videoview.MyVideoView
            android:id="@+id/videoview"
            android:layout_width="380dp"
            android:layout_height="380dp" />
    </RelativeLayout>

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_below="@id/rl"
        android:text="开始" />

    <Button
        android:id="@+id/btn_2"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_below="@id/btn"
        android:text="全屏" />
</RelativeLayout>

二、主程序
记录三个AndroidStudio快捷键:
1、ctrl+Alt+Shift+L用于初始化代码,让代码对齐
2、ctrl+Alt+Shift+T可以抽取代码中的变量为成员变量
3、ctrl+d用于复制代码到下一行

public class MainActivity extends AppCompatActivity {

    private VideoView videoView;//播放视频的视图
    private Button btn;//播放按钮
    private Button btn_2;//全屏播放按钮
    private MediaController mMediaController;//视频播放控制器
    private boolean isFullScreen;//是否全屏的判断
    private boolean isWantExit;//判断是否真的想退出
    private MainActivity mMainActivity;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mMainActivity = this;
        initView();//绑定视图
        initListener();//绑定事件

    }

    /*
    * 绑定视图
    * */
    private void initView() {
        videoView = (VideoView) findViewById(R.id.videoview);
        btn = (Button) findViewById(R.id.btn);
        btn_2 = (Button) findViewById(R.id.btn_2);
        mMediaController = new MediaController(this);//初始化视频播放控制器
    }

    /*
    *设置点击事件以及监听
    * */
    private void initListener() {
        //设置准备完成监听
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                //TODO 视频准备完成后,调用此处方法

            }
        });
        //设置播放完成监听
        videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                //TODO 视频播放完成后,调用此处方法
            }
        });

        //设置视频播放出错时候的监听
        videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                //TODO 视频播放解析出错,调用此处方法
                return true;
            }
        });

        //给“开始”button设置点击事件,在点击后进行播放视频,并且将控制器与视频绑定
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //设置播放视频地址,要提前配置权限
                videoView.setVideoPath("http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8");
                //videoview绑定控制器
                videoView.setMediaController(mMediaController);
                //把控制器视图平铺到哪一个视图上(Mediacontroller底层是一个popupwindow)
                mMediaController.setAnchorView(videoView);
                videoView.start();
            }
        });
        btn_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                changeScreen();
            }
        });
    }

    //半屏变全屏
    public void changeScreen() {
        if (isFullScreen) {//如果是全屏就变为半屏
            //1、将当前activity设置为竖屏
            mMainActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            //2、给videoview设置半屏参数
            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(dp2px(this, 300), dp2px(this, 300));//代码中写的都是px值
            videoView.setLayoutParams(layoutParams);
            isFullScreen = false;
        } else {//如果不是全屏就变为全屏
            //1、把屏幕编程全屏
            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//width,height
            //2、把当前activity设置为全屏
            mMainActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            //3、给videoview设置全屏参数
            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);//width,height
            videoView.setLayoutParams(layoutParams);
            isFullScreen = true;
        }
    }

    /*
    * 当点击屏幕的时候会调用,如果返回true表示消费掉该事件,如果返回false表示不消费该事件,只是处理方法内业务逻辑,之后事件继续传递
    * */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {//判断按钮是否为返回键
            if (isFullScreen) {//如果是全屏就退出全屏
                changeScreen();
                return false;
            } else {//如果不是全屏,就开始退出app
                exit();//开始退出,做一个判断用户是否想退出
                return false;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //2s后如果用户没有再次点击回退键,就将用户是否想退出的布尔值变为false,标识用户不想退出
            isWantExit = false;
        }
    };

    private void exit() {
        if (!isWantExit) {
            isWantExit = true;//用户表示我想退出
            Toast.makeText(this, "你真的想退出吗", Toast.LENGTH_SHORT).show();
            //增加异步处理的延迟
            mHandler.sendEmptyMessageDelayed(0, 2000);
        } else {//表示真的想退出了
            finish();
            System.exit(0);//把app占用的线程杀死,彻底退出 app

        }
    }

    /*
    * 工具类方法
    * */
    public static int px2dp(Context context, float pxValue) {
        float density = context.getResources().getDisplayMetrics().density;//获得当前屏幕,获得屏幕原型,获得屏幕密度
        return (int) (pxValue / density + 0.5f);
    }

    public static int dp2px(Context context, float dpValue) {
        float density = context.getResources().getDisplayMetrics().density;//获得当前屏幕,获得屏幕原型,获得屏幕密度
        return (int) (dpValue * density + 0.5f);
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值