先展示下本次做好的效果:

    

下面是播放时的画面,只截取了视频框

  

  接着上次的说,上次说到了去获取手机里的视频信息,下面就用listview来展示视频列表与调用系统播放器来播放视频。

    1、根据获取到的视频列表,去设置适配器Adapter,然后利用前面写的listview的例子,来展示数据,这个就不详细说明了。

    2、点击单个listview的数据,来监听其事件,在监听的方法里,去调取播放方法。

        2.1利用隐式意图去调用所有符合要求的播放器。

        

    class MyOnItemClickListener implements AdapterView.OnItemClickListener {        @Override        public void onItemClick(AdapterView
 parent, View view, int position, long id) {            //根据position获取list中的结果            MediaItem item = mediaList.get(position);            //Toast.makeText(context,"当前视频名称"+item.getName(),Toast.LENGTH_SHORT).show();            //调取系统播放器  ---隐式意图            Intent intent=new Intent(Intent.ACTION_VIEW);           Uri uri=Uri.parse("file://"+item.getData());            intent.setDataAndType(uri,"video/mp4"); //所有格式            context.startActivity(intent);        }    }

    在这里就是要注意了,网上有的文章里,是这样写的

             Intent intent=new Intent(Intent.ACTION_VIEW);            intent.setDataAndType(item.getData(),"video/mp4"); //所有格式            context.startActivity(intent);

    这样写就导致无法弹出系统里符合播放条件的播放器,需要在URI做下处理,在前面加上

    2.2 利用显示意图,直接调用mediaplayer来播放,自己封装了一下mediaplayer,以后可以自己定义播放器的样式,甚至打广告。这个SystemVideoPlayer是自己写的类。

Intent intent=new Intent(context,SystemVideoPlayer.class);Uri uri=Uri.parse("file://"+item.getData());intent.setDataAndType(uri,"video/mp4"); //所有格式context.startActivity(intent);

    2.3 自定义的systemVideoPlayer,注意这个类继承Activity,要去AndroidManifext.xml里注册

    在这个类里,去监听videoView的准备播放状态,播放出错状态,播放完成状态,并且设置控制器来控制视频的暂停,快进,快退功能

package com.yuanlp.mobileplayer.activity;import android.app.Activity;import android.media.MediaPlayer;import android.net.Uri;import android.os.Bundle;import android.support.annotation.Nullable;import android.widget.MediaController;import android.widget.Toast;import android.widget.VideoView;import com.yuanlp.mobileplayer.R;/** * Created by 原立鹏 on 2017/7/16. * 系统播放器 * 注意去Manifext.xml里注册 */public class SystemVideoPlayer extends Activity{    private VideoView videoview;    private Uri uri;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.system_video_player); //自定义的播放器样式,暂时为简单版            videoview= (VideoView) findViewById(R.id.videoview);        //得到播放地址,从intent中获取        uri = getIntent().getData();        if (uri!=null){            videoview.setVideoURI(uri);        }        //准备好的监听,监听是否视频准备好        videoview.setOnPreparedListener(new MyOnPreparedListener());        //播放出错了的监听        videoview.setOnErrorListener(new MyOnErrorListener());        //播放完成的监听        videoview.setOnCompletionListener(new MyOnCompletionListener());        //设置控制面板,系统自带的        videoview.setMediaController(new MediaController(this));    }    /**     * 准备好播放时的监听     */    class MyOnPreparedListener implements MediaPlayer.OnPreparedListener {        @Override        public void onPrepared(MediaPlayer mp) {            videoview.start(); //开始播放        }    }    /**     * 播放出错     */    class MyOnErrorListener implements MediaPlayer.OnErrorListener {        @Override        public boolean onError(MediaPlayer mp, int what, int extra) {            //出错后,系统会自动提示播放出错,同时自己也弹一个吐司            Toast.makeText(SystemVideoPlayer.this,"播放出错",Toast.LENGTH_SHORT).show();            return false;        }    }    /**     * 播放完成的监听     */    class MyOnCompletionListener implements MediaPlayer.OnCompletionListener {        @Override        public void onCompletion(MediaPlayer mp) {            Toast.makeText(SystemVideoPlayer.this, "播放完成", Toast.LENGTH_SHORT).show();        }    }}

    2.4 播放器样式布局

    

3、VideoPager的完整代码

package com.yuanlp.mobileplayer.pager;import android.content.ContentResolver;import android.content.Context;import android.content.Intent;import android.database.Cursor;import android.net.Uri;import android.os.Handler;import android.os.Message;import android.os.SystemClock;import android.provider.MediaStore;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;import com.yuanlp.mobileplayer.R;import com.yuanlp.mobileplayer.activity.SystemVideoPlayer;import com.yuanlp.mobileplayer.adapter.MyAdapter;import com.yuanlp.mobileplayer.base.BasePager;import com.yuanlp.mobileplayer.bean.MediaItem;import com.yuanlp.mobileplayer.utils.LogUtil;import com.yuanlp.mobileplayer.utils.Utils;import java.util.ArrayList;import java.util.List;/** * Created by 原立鹏 on 2017/7/13. * 本地视频的页面 */public class VideoPager extends BasePager {    private ListView listview;    private TextView nomedia;    private ProgressBar pb_loding;    private Utils utils;    //保存所有的媒体信息的集合    private List
 mediaList;    private MyAdapter myAdapter;    public VideoPager(Context context) {        super(context);        utils=new Utils();    }    private Handler handler=new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            if (mediaList!=null&&mediaList.size()>0){                //有数据                //设置适配器                myAdapter=new MyAdapter(context,mediaList);                listview.setAdapter(myAdapter);               //Toast.makeText(context,"有数据",Toast.LENGTH_SHORT).show();                nomedia.setVisibility(View.GONE);            }else{                //没有数据                //文本显示                Toast.makeText(context,"没有数据",Toast.LENGTH_SHORT).show();            }            pb_loding.setVisibility(View.GONE);            //progressbar隐藏        }    };    /**     * 强制子类实现特定的效果     *     * @return     */    @Override    public View initView() {        LogUtil.e("本地视频被初始化了");       View view=View.inflate(context, R.layout.video_pager,null);        listview= (ListView) view.findViewById(R.id.listview);        nomedia= (TextView) view.findViewById(R.id.tv_nomedia);        pb_loding= (ProgressBar) view.findViewById(R.id.pb_loading);        //设置listview的item的点击事件        listview.setOnItemClickListener(new MyOnItemClickListener());        return view;    }    @Override    public void initData() {        super.initData();        LogUtil.e("本地视频页面的数据被初始化了");        //加载本地数据        getDataFromLocal();    }    class MyOnItemClickListener implements AdapterView.OnItemClickListener {        @Override        public void onItemClick(AdapterView
 parent, View view, int position, long id) {            //根据position获取list中的结果            MediaItem item = mediaList.get(position);            //Toast.makeText(context,"当前视频名称"+item.getName(),Toast.LENGTH_SHORT).show();//            //调取系统播放器  ---隐式意图//            Intent intent=new Intent(Intent.ACTION_VIEW);//           Uri uri=Uri.parse("file://"+item.getData());//            intent.setDataAndType(uri,"video/mp4"); //所有格式//            context.startActivity(intent);            //调用自己写的播放器 ---显示意图            Intent intent=new Intent(context,SystemVideoPlayer.class);            Uri uri=Uri.parse("file://"+item.getData());            intent.setDataAndType(uri,"video/mp4"); //所有格式            context.startActivity(intent);        }    }    /**     * 从本地sd卡获取数据,有2中办法     * 1、遍历sd卡,根据后缀名     * 2、从内容提供者中获取,系统有自己会去扫描所有media信息。     * 3/6.0后的系统,需要加上动态权限     */    private void getDataFromLocal() {        mediaList=new ArrayList<>();        new Thread(){            @Override            public void run() {                super.run();                SystemClock.sleep(2000);                //根据上下文,去获取内容解析者                ContentResolver resolver = context.getContentResolver();                Uri uri= MediaStore.Video.Media.EXTERNAL_CONTENT_URI;                String[] objs={                       MediaStore.Video.Media.DISPLAY_NAME, //视频文件名称                        MediaStore.Video.Media.DURATION,  //视频时长                        MediaStore.Video.Media.SIZE, //文件大小                        MediaStore.Video.Media.DATA, //视频的绝对地址                        MediaStore.Video.Media.ARTIST,  //歌曲的演唱者,艺术家(音频可能会有该字段)                };                Cursor cursor = resolver.query(uri, objs, null, null, null);                if (cursor!=null){                    while(cursor.moveToNext()){                        MediaItem item=new MediaItem();                        String name=cursor.getString(0); //名称                        item.setName(name);                        long duration=cursor.getLong(1); //时长                        item.setDuration(duration);                        long size=cursor.getLong(2); //视频大小                        item.setSize(size);                        String data=cursor.getString(3); //视频的绝对地址                        item.setData(data);                        String artist=cursor.getString(4); //艺术家                        item.setArtist(artist);                        mediaList.add(item); //把每个item数据放到集合中                    }                    cursor.close();                }                //发消息,提示加载完media                handler.sendEmptyMessage(0);            }        }.start();    }}

4、SystemVideoPlayer 自定义播放器类的代码

package com.yuanlp.mobileplayer.activity;import android.app.Activity;import android.media.MediaPlayer;import android.net.Uri;import android.os.Bundle;import android.support.annotation.Nullable;import android.widget.MediaController;import android.widget.Toast;import android.widget.VideoView;import com.yuanlp.mobileplayer.R;/** * Created by 原立鹏 on 2017/7/16. * 系统播放器 * 注意去Manifext.xml里注册 */public class SystemVideoPlayer extends Activity{    private VideoView videoview;    private Uri uri;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.system_video_player);        videoview= (VideoView) findViewById(R.id.videoview);        //得到播放地址,从intent中获取        uri = getIntent().getData();        if (uri!=null){            videoview.setVideoURI(uri);        }        //准备好的监听,监听是否视频准备好        videoview.setOnPreparedListener(new MyOnPreparedListener());        //播放出错了的监听        videoview.setOnErrorListener(new MyOnErrorListener());        //播放完成的监听        videoview.setOnCompletionListener(new MyOnCompletionListener());        //设置控制面板,系统自带的        videoview.setMediaController(new MediaController(this));    }    /**     * 准备好播放时的监听     */    class MyOnPreparedListener implements MediaPlayer.OnPreparedListener {        @Override        public void onPrepared(MediaPlayer mp) {            videoview.start(); //开始播放        }    }    /**     * 播放出错     */    class MyOnErrorListener implements MediaPlayer.OnErrorListener {        @Override        public boolean onError(MediaPlayer mp, int what, int extra) {            //出错后,系统会自动提示播放出错,同时自己也弹一个吐司            Toast.makeText(SystemVideoPlayer.this,"播放出错",Toast.LENGTH_SHORT).show();            return false;        }    }    /**     * 播放完成的监听     */    class MyOnCompletionListener implements MediaPlayer.OnCompletionListener {        @Override        public void onCompletion(MediaPlayer mp) {            Toast.makeText(SystemVideoPlayer.this, "播放完成", Toast.LENGTH_SHORT).show();        }    }}