Android中視頻播放器JCVideoPlayerStandard

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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章