Android中视频播放器JCVideoPlayerStandard

来源:互联网 发布:苹果打碟软件 编辑:程序博客网 时间:2024/06/05 06:55

           JCVideoPlayerStandard是一个使用很简单的视频开源库,而且功能很强大,3行代码实现简单的视频播放

特征:

  1. 视频全屏和浮动小窗口
  2. 完全定制ui
  3. ListViewViewPagerListViewViewPagerFragment其他嵌套片段和视图的情况下,它工作得很好
  4. Gestrues修改进度和音量
  5. 适应屏幕尺寸,其中至少视频的宽度或长度是自适应的,而另一个在屏幕上居中
  6. 进入或退出全屏时不会打扰或改变播放状态
  7. 重力传感器全自动全屏
  8. 具有本地视频控制的WebView
  9. 支持https和rtsp
  10. 小于100kb

GitHub:https://github.com/lipangit/JieCaoVideoPlayer

效果图(在Listview显示每个视频):                                                      结构图:

                            






还是相同的套路,先使用okhttp获取到json数据,然后解析json数据显示到listview上,这里会使用到okhttp(网络请求库)、Picasso(图片缓存库)和jiecaovideoplayer(视频播放库)

1、导入相应的库

okhttp

Picasso

jiecaovideoplayer



2、activity_main布局添加listview

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.wdl.video_demo.MainActivity">    <ListView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/lv" /></LinearLayout>

3、创建listview的item布局lv_item.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent">    <fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard        android:layout_marginTop="5dp"        android:id="@+id/videoplayer"        android:layout_width="match_parent"        android:layout_height="200dp"/></LinearLayout>

4、MainActivity.java

public class MainActivity extends AppCompatActivity {    public ListView lv;    String date;    public video_item video;    public ArrayList<Map<String, Object>> list = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //listview控件        lv = (ListView) findViewById(R.id.lv);        //获取到json数据        initdate();    }    private void initdate() {        list.clear();        //线程        new Thread(new Runnable() {            @Override            public void run() {                OkHttpClient okHttpClient=new OkHttpClient();                //服务器返回的地址                Request request=new Request.Builder()                        .url("http://192.168.1.6:8080/date.json").build();                try {                    Response response=okHttpClient.newCall(request).execute();                    //得到数据                    date=response.body().string();                    //打印出是否得到数据,因为线程中无法执行主线程操作所以我们使用handler                    Message mes=new Message();                    mes.what=2;                    handler.sendMessage(mes);                    //解析json数据                    JsonJX(date);                } catch (IOException e) {                    e.printStackTrace();                }            }        }).start();    }    public void JsonJX(String date) {        //数据是否为空        if (date != null) {            try {                //数据的解析                JSONObject video_object = new JSONObject(date);                String flag = video_object.getString("flag");                if (flag.equals("success")) {                    JSONArray array = video_object.getJSONArray("activity");                    for (int i = 0; i < array.length(); i++) {                        JSONObject object = array.getJSONObject(i);                        String video_titie=object.getString("video_title");                        String video_url=object.getString("video_url");                        String  video_pic=object.getString("video_pic");                        //存入Map                        Map<String,Object> map=new HashMap<>();                        map.put("title",video_titie);                        map.put("url",video_url);                        map.put("pic",video_pic);                        list.add(map);                    }                }                //调用适配器                Message mes=new Message();                mes.what=1;                handler.sendMessage(mes);            } catch (JSONException e) {                e.printStackTrace();            }        } else {            Message mes=new Message();            mes.what=3;            handler.sendMessage(mes);        }    }    public Handler handler=new Handler(){        @Override        public void handleMessage(Message msg) {            switch (msg.what){                case 1:                    video=new video_item(MainActivity.this,list);                    lv.setAdapter(video);                    break;                case 2:                    Log.i("TAG","-------------"+date);                    break;                case 3:                    Toast.makeText(MainActivity.this,"数据是空的!",Toast.LENGTH_LONG).show();                    break;            }        }    };    //监听返回键如果不写视频播放在全屏时点击返回则直接退出.    @Override    public void onBackPressed() {        if (JCVideoPlayer.backPress()) {            return;        }        super.onBackPressed();    }    @Override    protected void onPause() {        super.onPause();        JCVideoPlayer.releaseAllVideos();    }}

5、创建适配器video_item

public class video_item extends BaseAdapter {    public Context con;    public ArrayList<Map<String,Object>> list;    public LayoutInflater inflater;    public video_item(Context context, ArrayList<Map<String,Object>> list){        this.con=context;        this.list=list;        this.inflater=LayoutInflater.from(con);    }    @Override    public int getCount() {        return list.size();    }    @Override    public Object getItem(int position) {        return list.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder;        if (convertView==null){            holder=new ViewHolder();            convertView=inflater.inflate(R.layout.lv_item,null);            holder.jcVideoPlayerStandard= (JCVideoPlayerStandard) convertView.findViewById(R.id.videoplayer);            convertView.setTag(holder);        }else{            holder= (ViewHolder) convertView.getTag();        }//加载视频        holder.jcVideoPlayerStandard.setUp(list.get(position).get("url").toString(),                JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL,                list.get(position).get("title").toString());        //判断获取的图片是否为空        if (TextUtils.isEmpty(list.get(position).get("pic").toString())){            //空时            Picasso                    .with(con)                    .cancelRequest(holder.jcVideoPlayerStandard.thumbImageView);            holder.jcVideoPlayerStandard.thumbImageView.                    setImageDrawable(con.getResources().                            getDrawable(R.mipmap.f));//当图片为空时显示的图片        }else {            //这需要的图片是显示在视频没播放的情况下显示的图片            Picasso                    .with(con)                    .load(list.get(position).get("pic").toString())                    .placeholder(con.getResources().getDrawable(R.mipmap.timg))//图片加载中显示                    .into(holder.jcVideoPlayerStandard.thumbImageView);        }        return convertView;    }    class ViewHolder{        JCVideoPlayerStandard jcVideoPlayerStandard;    }}

最后一步网络权限添加:

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