JCVideoPlayerStandard是一個使用很簡單的視頻開源庫,而且功能很強大,3行代碼實現簡單的視頻播放
特徵:
- 視頻全屏和浮動小窗口
- 完全定製ui
- 在
ListView
,ViewPager
和ListView
,ViewPager
和Fragment
其他嵌套片段和視圖的情況下,它工作得很好 - Gestrues修改進度和音量
- 適應屏幕尺寸,其中至少視頻的寬度或長度是自適應的,而另一個在屏幕上居中
- 進入或退出全屏時不會打擾或改變播放狀態
- 重力傳感器全自動全屏
- 具有本地視頻控制的WebView
- 支持https和rtsp
- 小於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" />