工具: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();        fileListPath = new ArrayList();        //要获取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"?>                                                            
附件:优 酷的源码http://download.csdn.net/detail/i_do_can/9410485

votamino的源码太大了

更多相关文章

  1. [Android] Eclipse Android中设置模拟器屏幕大小几种方法
  2. android项目中每个文件的作用
  3. Fast File Transfer – 让 Android 通过 WIFI 传输文件到任何无
  4. 使用Android Studio查看Android 5.x源码
  5. Android工具箱APP源码分享:“一个工具箱”
  6. Android开发5——文件读写
  7. Android布局文件属性笔记
  8. VS2019中用xamarin开发Android,显示需要android sdk28的解决方法

随机推荐

  1. Android有效加载图片 之 有效加载大图片
  2. Android文件读写实例代码
  3. Android应用程序与SurfaceFlinger服务的
  4. [Android 新特性] Android 4.3 Top 5新功
  5. 程序结构设计理论(Android)
  6. Hello World Kotlin
  7. android中关于手机屏幕的相关操作(获取屏
  8. Android(安卓)Launcher3修改应用图标,隐藏
  9. [转]Jollen 的 Android 教學,#2: Activit
  10. android-menu菜单的应用