思路 android studio
1:发送请求获取服务器所有视频的路径
2:根据路径获取视频的第一帧
3:使用(RecyclerView) 存放图片 在适配器中添加事件 传给 播放的activate
4:在播放的activate 使用(VideoView) 播放 差不多了 贴代码
后台 myeclipse servlet oracle 操作数据库 mybatis
android studio 端 MainActivity 写的不严谨 但是不影响使用
package wlt.com.video;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import wlt.com.video.adapter.Listadapter;
import wlt.com.video.bean.VideoVo;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private Listadapter listadapte;
private LinearLayoutManager layoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.list);
recyclerView = (RecyclerView) this.findViewById(R.id.recy);
StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
alert();
recyclerView.setLayoutManager(manager);
final List<VideoVo> lise = setdate();
listadapte = new Listadapter(MainActivity.this, lise);
listadapte.notifyDataSetChanged();
recyclerView.setAdapter(listadapte);
listadapte.setMyonitemClick(new Listadapter.MyonitemClick() {
@Override
public void MyOnitemClicks(int positoin) {
Intent intent = new Intent(MainActivity.this, StatcVideo.class);
//这里将视频的路径传过去
intent.putExtra("url", lise.get(positoin).getV_url());
startActivity(intent);
}
});
// recyclerView.addItemDecoration(new SprxxxxxxxxxxxxKK(3));
//添加事件
}
public void alert(){
final ProgressDialog dialog = new ProgressDialog(MainActivity.this);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
// 设置ProgressDialog 标题
dialog.setTitle("溪瑶视频");
// 设置ProgressDialog 提示信息
dialog.setMessage("视频正在加载中……");
// 设置ProgressDialog 标题图标
dialog.setIcon(R.drawable.ic_launcher_background);
// 设置ProgressDialog 进度条进度
//dialog.setProgress(100);
// 设置ProgressDialog 的进度条是否不明确
dialog.setIndeterminate(false);
// 设置ProgressDialog 是否可以按退回按键取消
dialog.setCancelable(true);
dialog.setButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int i) {
// 点击“取消”按钮取消对话框
dialog.cancel();
}
});
// 让ProgressDialog显示
dialog.show();
}
public class SprxxxxxxxxxxxxKK extends RecyclerView.ItemDecoration {
private int space;
public SprxxxxxxxxxxxxKK(int space) {
this.space = space;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.left = space;
outRect.bottom = space;
if (parent.getChildAdapterPosition(view) % 3 == 0) {
outRect.left = 0;
}
}
}
//这是获取 服务器视频路径的请求方法
//.add("username", "android")这无用 我实在 服务器端打印出来看是否 通 作用
public List<VideoVo> setdate() {
final List<VideoVo> list = new ArrayList<>();
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder(Charset.forName("utf-8"))
.add("username", "android")
.build();
Request request = new Request.Builder()
.url("http://192.168.1.106:8080/img/list")
.post(requestBody)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String str = response.body().string();
try {
JSONArray jsonArray = new JSONArray(str);
for (int i = 0; i < jsonArray.length(); i++) {
VideoVo videoVo = new VideoVo();
JSONObject jsonObject = jsonArray.getJSONObject(i);
String emp_der = jsonObject.getString("v_url");
videoVo.setV_url(emp_der);
list.add(videoVo);
}
for (VideoVo v : list) {
System.out.println("--->>>" + v.getV_url());
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
return list;
}
}
videoVo
package wlt.com.video.bean;
import java.io.Serializable;
public class VideoVo implements Serializable{
private String v_url;
public String getV_url() {
return v_url;
}
public void setV_url(String vUrl) {
v_url = vUrl;
}
}
Listadapter
package wlt.com.video.adapter;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.ViewTarget;
import java.util.List;
import wlt.com.video.R;
import wlt.com.video.bean.VideoVo;
import wlt.com.video.utils.VideoUtils;
public class Listadapter extends RecyclerView.Adapter<Listadapter.MyViewHolder> {
private Context context;
private List<VideoVo> list;
public interface MyonitemClick{
void MyOnitemClicks(int positoin);
}
private MyonitemClick myonitemClick;
public void setMyonitemClick(MyonitemClick myonitemClick){
this.myonitemClick=myonitemClick;
}
public Listadapter(Context context, List<VideoVo> list) {
this.context=context;
this.list=list;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item2,null);
Listadapter.MyViewHolder viewHolder=new Listadapter.MyViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
System.out.println("====list==================="+list.size());
//holder.imageView.setImageBitmap(VideoUtils.getNetVideoBitmap(list.get(position).getV_url()));//通过视频videoUrl地址获取第一帧返回bitmap
final ViewTarget<ImageView, Drawable> into = Glide.with(context).load(VideoUtils.Mybyte(VideoUtils.getNetVideoBitmap(list.get(position).getV_url()))).into(holder.imageView);
holder.imageView=into.getView();
if (myonitemClick!=null){
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myonitemClick.MyOnitemClicks(position);
}
});
};
}
@Override
public int getItemCount() {
return list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
public MyViewHolder(View itemView) {
super(itemView);
imageView=(ImageView)itemView.findViewById(R.id.imgss);
}
}
}
VideoUtils
package wlt.com.video.utils;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
public class VideoUtils {
public static Bitmap getNetVideoBitmap(String videoUrl) {
Bitmap bitmap = null;
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
//根据url获取缩略图
retriever.setDataSource(videoUrl, new HashMap());
//获得第一帧图片
bitmap = retriever.getFrameAtTime();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} finally {
retriever.release();
}
return bitmap;
}
public static byte[] Mybyte( Bitmap bitmap){
ByteArrayOutputStream byteout=new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteout);
byte[] bytes=byteout.toByteArray();
return bytes;
};
}
StatcVideo
package wlt.com.video;
import android.app.Activity;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;
public class StatcVideo extends Activity {
private VideoView videoView;
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.statcvideo);
String videoUrl =getIntent().getStringExtra("url");
System.out.println("=======>>>"+videoUrl);
videoView=(VideoView)this.findViewById(R.id.videoView);
MediaController localMediaController = new MediaController(this);
videoView.setMediaController(localMediaController);
videoView.setVideoPath(videoUrl);
if (!videoUrl.equals("")){
videoView.start();
}
}
}
布局
list.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"
android:background="@color/colorPrimary"
>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout
statcvideo.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">
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout
item2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
>
<ImageView
android:id="@+id/imgss"
android:layout_width="match_parent"
android:layout_height="300dp"
android:src="@drawable/abc_vector_test"
/>
</LinearLayout>
别忘加权限
以上是 android studio 短的代码 下面是 后台的myeclipse 使用的是 servlet 访问数据库 用的是 mybatis 这里就不贴jar 代码如下
web.xml
<servlet>
<servlet-name>list</servlet-name>
<servlet-class>wlt.img.servlet.listservlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>list</servlet-name>
<url-pattern>/list</url-pattern>
</servlet-mapping>
listservlet
package wlt.img.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONArray;
import org.apache.ibatis.session.SqlSession;
import wlt.video.vo.VideoVo;
import wlt.video.vo.VideoVo_Mapper_Imp;
public class listservlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
String str= request.getParameter("username");
System.out.println("============>>"+str);
PrintWriter out = response.getWriter();
SqlSession session = wlt.video.vo.MybatisUtil.getSqlSession();
VideoVo_Mapper_Imp imp = session.getMapper(VideoVo_Mapper_Imp.class);
List<VideoVo> list = imp.SelectAll();
JSONArray array = JSONArray.fromObject(list);
response.setContentType("text/json;charset=utf-8");// 设置编码 给android 端 返回数据
out.print(array.toString());
out.flush();
out.close();
}
}
MybatisUtil
package wlt.video.vo;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtil {
private static SqlSessionFactory ssf;
private static SqlSession ss;
public static SqlSession getSqlSession(){
try {
Reader in = Resources.getResourceAsReader("mybatis-config.xml");
ssf = new SqlSessionFactoryBuilder().build(in);
ss = ssf.openSession();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
return ss;
}
}
jdbc.properties
driverClass=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
user=system
password=wltpass
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
<typeAliases>
<package name="wlt.com.vo.Student"/>
</typeAliases>
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="system"/>
<property name="password" value="wltpass"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="wlt/video/vo/VideoImg_Mapper.xml" />
</mappers>
</configuration>
VideoVo_Mapper_Imp
package wlt.video.vo;
import java.util.List;
public interface VideoVo_Mapper_Imp {
void Insertssutdent(VideoVo student);
List<VideoVo> SelectAll();
}
## mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="wlt.video.vo.VideoVo_Mapper_Imp">
<insert id="Insertssutdent" parameterType="wlt.video.vo.VideoVo">
insert into video (v_url )values( #{v_url})
</insert>
<select id="SelectAll" resultType="wlt.video.vo.VideoVo">
select * from video
</select>
</mapper>
## vo
package wlt.video.vo;
import java.io.Serializable;
public class VideoVo implements Serializable{
private String v_url;
public String getV_url() {
return v_url;
}
public void setV_url(String vUrl) {
v_url = vUrl;
}
}
完成 ok