Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android中视频播放器JCVideoPlayerStandard

$
0
0

           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" />






作者:qq_26650589 发表于2017/9/4 11:43:29 原文链接
阅读:84 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>