工具:android studio

使用android 播放视频,一开始是使用的vitamio 的,人家的代码写得特别好,可惜我是在android studio里调用的,哎呀,各种报错,什么R文件不识别啦,Gradle 版本的问题,无奈网上可以找到的资料实在是有限,我还傻傻的配置了NDK 的环境,可以也是没有用。

后来使用优酷的 SDK 代码,参考:http://blog.csdn.net/elsdnwn/article/details/44984011

优酷:http://cloud.youku.com/app

按照介绍一步一步试咯 我下载的是精简版

android studio AIDL文件与java的关联和Eclipse是不一样的,studio需要手动在main\下新建aidl文件夹,将.aidl文件复制过来

Android Studio实现Service AIDL http://www.linuxidc.com/Linux/2015-01/111148.htm

经历了很多次的失败,什么复制文件啦,整体文件复制,包名都一样,删掉工程重建一个,一个文件一个文件复制,drawable里的文件全部复制,可是还是会报错,

这里要说一下 直接新建module -> android library 因为youkupalyersdk 是作为类库使用的,不需要生成apk

最后发现一个方法(亲测可行):

首先下载优酷提供的sdk http://cloud.youku.com/down

在Android Studio中新建一个工程名 xxx ,再把YoukuPlayerOpenSDK以模块的形式导入到新建的工程当中,接着将YoukuPlayerOpenSDK模块下的build.gradle文件中的compileSdkVersion、buildToolsVersion、minSdkVersion和targetSdkVersion都修改成跟app模块下的build.gradle相应字段一样的数据。

哎,这么简单的方法,在android studio 里直接使用开源的SDK

然后,就可以飞啦


不过优酷的有一个限制就是只可以播放优酷库里的视频,可以根据视频的网络地址,获取网页的数据得到视频的id


于是继续使用vitamio ,由于有了上面的经验,一个浪费了很长时间得到的经验,这个只要不涉及到修改别人的源码,开发就很快

首先是 到Vitamio的Github地址https://github.com/yixia/VitamioBundle下载SDK

先是做一个读取sd卡里的视频(读取本地文件)的播放器,这个是有参考的

扫描SD卡的文件

 private void scanMovieFiles() {        fileList = new ArrayList<String>();        fileListPath = new ArrayList<String>();        //要获取SD卡首先要确认SD卡是否装载        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {            Log.e(TAG, "SD Card not mounted.");        }        //获取sd卡上所有的文件        final File[] file = Environment.getExternalStorageDirectory().listFiles();        readFile(file);        files = fileList.toArray(new String[1]);        filesPath = fileListPath.toArray(new String[1]);    }    /*读取视频文件 会处理 fileList  和  fileListPath   */    private void readFile(final File[] file) {        for (int i = 0; (file != null) && (i < file.length); i++) {            if (file[i].isFile() && (file[i].getName().endsWith("mp4") || file[i].getName().endsWith("mkv")                    || file[i].getName().endsWith("MP4") || file[i].getName().endsWith("MKV")                    || file[i].getName().endsWith("avi") || file[i].getName().endsWith("AVI")                    || file[i].getName().endsWith("rmvb") || file[i].getName().endsWith("RMVB"))) {                fileList.add(file[i].getName());                fileListPath.add(file[i].getPath());            } else if (file[i].isDirectory()) {                //如果是文件夹,递归读取                final File[] tempFileList = new File(file[i].getAbsolutePath()).listFiles();                readFile(tempFileList);            }        }    }
还添加了播放时手势控制,双击暂定/播放,左右滑动开尽快退,上下滑动调音量

 private GestureDetector gestureDetector;    /*最大声音*/    private int maxVolume;    /*当前声音*/    private int currentVolume = -1;    /**/    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        /*        * 去屏保        * */        getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);        videoView = (VideoView) this.findViewById(R.id.surface_view);        if (!movieUrl.isEmpty()) {            if (movieUrl.startsWith("http:")) {                videoView.setVideoURI(Uri.parse(movieUrl));            } else {                videoView.setVideoPath(movieUrl);            }            //设置成撑满全屏            videoView.setVideoLayout(VideoView.VIDEO_LAYOUT_STRETCH, 0);            videoView.setMediaController(mediaController);            videoView.requestFocus();            videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {                @Override                public void onPrepared(MediaPlayer mp) {                    mp.setPlaybackSpeed(1.0f);                    duration = mp.getDuration();                }            });        gestureDetector = new GestureDetector(this, new CustomGestureListener());    }    @Override    public boolean onTouchEvent(MotionEvent event) {        if (gestureDetector.onTouchEvent(event)) {            return true;        }        switch (event.getAction() & MotionEvent.ACTION_MASK) {            case MotionEvent.ACTION_UP:                endGesture();                break;        }        return super.onTouchEvent(event);    }    private void endGesture() {        currentVolume = -1;        mDismissHandler.removeMessages(0);        mDismissHandler.sendEmptyMessageDelayed(0, 500);    }    private class CustomGestureListener extends GestureDetector.SimpleOnGestureListener {        /*        * 双击操作,开始和暂停        * */        /**         * 这个方法不同于onSingleTapUp,他是在GestureDetector确信用户在第一次触摸屏幕后,没有紧跟着第二次触摸屏幕,也就是不是“双击”的时候触发         * */        @Override        public boolean onDoubleTap(MotionEvent e) {            if (videoView.isPlaying()) {                videoView.pause();            } else {                videoView.start();            }            return super.onDoubleTap(e);        }        /**         * @param e1 The first down motion event that started the scrolling.         @param e2 The move motion event that triggered the current onScroll.         @param distanceX The distance along the X axis(轴) that has been scrolled since the last call to onScroll. This is NOT the distance between e1 and e2.         @param distanceY The distance along the Y axis that has been scrolled since the last call to onScroll. This is NOT the distance between e1 and e2.         无论是用手拖动view,或者是以抛的动作滚动,都会多次触发 ,这个方法在ACTION_MOVE动作发生时就会触发 参看GestureDetector的onTouchEvent方法源码          * */        @Override        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {            //上下滑动            if (Math.abs(distanceY) / Math.abs(distanceX) > 3) {                float mOldY = e1.getY();                int y = (int) e2.getRawY();                Display disp = getWindowManager().getDefaultDisplay();                int windowHeight = disp.getHeight();                onVolumeSlide((mOldY - y) / windowHeight);            }            return super.onScroll(e1, e2, distanceX, distanceY);        }        /*         * 滑动操作         * */        /**         * @param e1 第1个ACTION_DOWN MotionEvent 并且只有一个         * @param e2 最后一个ACTION_MOVE MotionEvent         * @param velocityX X轴上的移动速度,像素/秒         * @param velocityY Y轴上的移动速度,像素/秒         * 这个方法发生在ACTION_UP时才会触发 参看GestureDetector的onTouchEvent方法源码         *         * */        @Override        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {            currentPosition = videoView.getCurrentPosition();            /*向左滑*/            if (e1.getX() - e2.getX() > 120) {                if (currentPosition < 10000) {                    currentPosition = 0;                    videoView.seekTo(currentPosition);                } else {                    videoView.seekTo(currentPosition - 10000);                }            } else if (e2.getX() - e1.getX() > 120) {            /*向右滑*/                if (currentPosition + 10000 > duration) {                    currentPosition = duration;                    videoView.seekTo(currentPosition);                } else {                    videoView.seekTo(currentPosition + 10000);                }            }            return super.onFling(e1, e2, velocityX, velocityY);        }    }    /*    * 定时隐藏    * */    private Handler mDismissHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            mVolumeBrightnessLayout.setVisibility(View.GONE);        }    };    /**     * 滑动改变声音大小     */    private void onVolumeSlide(float percent) {        if (currentVolume == -1) {            currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);            if (currentVolume < 0)                currentVolume = 0;            // 显示            mOperationBg.setImageResource(R.drawable.video_volumn_bg);            mVolumeBrightnessLayout.setVisibility(View.VISIBLE);        }        int value = currentVolume + (int) (percent * maxVolume);        if (value > maxVolume) {            value = maxVolume;        } else if (value < 0) {            value = 0;        }        // 变更声音        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, value, 0);        // 变更进度条        ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();        lp.width = findViewById(R.id.operation_full).getLayoutParams().width * value / maxVolume;        mOperationPercent.setLayoutParams(lp);    }
都是官方提供好的方法,直接使用 它提供的VideoView和MediaController,通过手指滑动来控制音量大小则用的是FrameLayout。

播放界面布局:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical">    <io.vov.vitamio.widget.VideoView        android:id="@+id/surface_view"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:layout_centerHorizontal="true"        android:layout_centerVertical="true" />    <FrameLayout        android:id="@+id/operation_volume"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:background="#00000000"        android:orientation="horizontal"        android:padding="0dip"        android:visibility="invisible">        <ImageView            android:id="@+id/operation_bg"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center"            android:src="@drawable/video_volumn_bg" />        <FrameLayout            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="bottom|center_horizontal"            android:paddingBottom="25dip">            <ImageView                android:id="@+id/operation_full"                android:layout_width="94dip"                android:layout_height="wrap_content"                android:layout_gravity="left"                android:src="@drawable/video_num_bg" />            <ImageView                android:id="@+id/operation_percent"                android:layout_width="0dip"                android:layout_height="wrap_content"                android:layout_gravity="left"                android:scaleType="matrix"                android:src="@drawable/video_num_front" />        </FrameLayout>    </FrameLayout></RelativeLayout>
附件:优 酷的源码http://download.csdn.net/detail/i_do_can/9410485

votamino的源码太大了

更多相关文章

  1. Android自学笔记:应用程序基本原理
  2. Android(安卓)开发必读:如何成为一名优秀的Android开发者
  3. Android解决输入法自动弹出方法大全
  4. Android使用cmake+ndk输出原生Log
  5. 关于AVD启动失败的问题--找不到文件篇
  6. 浅谈Java中Collections.sort对List排序的两种方法
  7. NPM 和webpack 的基础使用
  8. Python list sort方法的具体使用
  9. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程

随机推荐

  1. Android:子线程向UI主线程发送消息
  2. Android(安卓)根文件系统启动分析
  3. Android(安卓)屏幕截图 代码
  4. 初体验Android的两个小不爽
  5. 猫猫学iOS之二维码学习,快速生成二维码
  6. Android——智能指针
  7. Android环境配置 AndroidStudio安装教程
  8. Android下的实现对本地指定和筛选文件的
  9. android staticlayout使用讲解
  10. Android解析KML