当前位置:   article > 正文

嵌入式应用开发安卓——摄像头和视频流_百科荣创嵌入式小车代码

百科荣创嵌入式小车代码

1.分享一下我的页面布局

静态资源请从百科荣创官网案例里面移植 

1.1 .activity_login

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:gravity="left"
  5. android:fitsSystemWindows="true">
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:background="#03A9F4"
  10. android:orientation="vertical">
  11. <ImageView
  12. android:layout_width="200dp"
  13. android:layout_height="0dp"
  14. android:layout_gravity="center_horizontal"
  15. android:layout_weight="1.5"
  16. android:background="@mipmap/logo"
  17. android:backgroundTint="@color/CDP_color"
  18. android:scaleType="fitCenter" />
  19. <LinearLayout
  20. android:layout_width="match_parent"
  21. android:layout_height="0dp"
  22. android:layout_gravity="center_vertical"
  23. android:layout_marginLeft="100dp"
  24. android:layout_marginTop="30dp"
  25. android:layout_marginRight="100dp"
  26. android:layout_weight="1.5"
  27. android:orientation="horizontal">
  28. <TextView
  29. android:layout_width="0dp"
  30. android:layout_height="wrap_content"
  31. android:layout_gravity="center_vertical"
  32. android:layout_weight="1"
  33. android:gravity="center"
  34. android:padding="3dp"
  35. android:text="@string/deviceid"
  36. android:textColor="@color/black"
  37. android:textSize="20sp" />
  38. <EditText
  39. android:id="@+id/deviceid"
  40. android:layout_width="0dp"
  41. android:layout_height="wrap_content"
  42. android:layout_margin="1dp"
  43. android:layout_weight="3"
  44. android:background="@drawable/editviewcase"
  45. android:cursorVisible="true"
  46. android:hint="CDP"
  47. android:paddingStart="10dp"
  48. android:selectAllOnFocus="true"
  49. android:text="CDP"
  50. android:textColorHint="#c0c0c0" />
  51. </LinearLayout>
  52. <LinearLayout
  53. android:layout_width="match_parent"
  54. android:layout_height="0dp"
  55. android:layout_gravity="center_vertical"
  56. android:layout_marginLeft="100dp"
  57. android:layout_marginTop="10dp"
  58. android:layout_marginRight="100dp"
  59. android:layout_weight="1.5"
  60. android:orientation="horizontal">
  61. <TextView
  62. android:layout_width="0dp"
  63. android:layout_height="wrap_content"
  64. android:layout_gravity="center_vertical"
  65. android:layout_weight="1"
  66. android:gravity="center"
  67. android:text="@string/loginname"
  68. android:textColor="@color/black"
  69. android:textSize="20sp" />
  70. <EditText
  71. android:id="@+id/loginname"
  72. android:layout_width="0dp"
  73. android:layout_height="wrap_content"
  74. android:layout_margin="1dp"
  75. android:layout_weight="3"
  76. android:background="@drawable/editviewcase"
  77. android:cursorVisible="true"
  78. android:hint="CDP"
  79. android:maxLength="10"
  80. android:paddingStart="10dp"
  81. android:selectAllOnFocus="true"
  82. android:text="CDP"
  83. android:textColorHint="#c0c0c0" />
  84. </LinearLayout>
  85. <LinearLayout
  86. android:layout_width="match_parent"
  87. android:layout_height="0dp"
  88. android:layout_gravity="center_vertical"
  89. android:layout_marginLeft="100dp"
  90. android:layout_marginTop="10dp"
  91. android:layout_marginRight="100dp"
  92. android:layout_weight="1.5"
  93. android:gravity="center"
  94. android:orientation="horizontal">
  95. <TextView
  96. android:layout_width="0dp"
  97. android:layout_height="wrap_content"
  98. android:layout_weight="1"
  99. android:gravity="center"
  100. android:padding="3dp"
  101. android:text="密 码"
  102. android:textColor="@color/black"
  103. android:textSize="20sp" />
  104. <LinearLayout
  105. android:layout_width="0dp"
  106. android:layout_height="wrap_content"
  107. android:layout_weight="3"
  108. android:background="@drawable/editviewcase"
  109. android:gravity="center">
  110. <EditText
  111. android:id="@+id/loginpasswd"
  112. android:layout_width="0dp"
  113. android:layout_height="wrap_content"
  114. android:layout_margin="1dp"
  115. android:layout_weight="3"
  116. android:background="#00000000"
  117. android:hint="@string/loginpsd"
  118. android:inputType="textPassword"
  119. android:maxLength="16"
  120. android:paddingStart="10dp"
  121. android:selectAllOnFocus="true"
  122. android:text="CDP"
  123. android:textColorHint="#c0c0c0" />
  124. <ImageView
  125. android:id="@+id/remember"
  126. android:layout_width="wrap_content"
  127. android:layout_height="wrap_content"
  128. android:layout_alignParentEnd="true"
  129. android:layout_marginEnd="10dp"
  130. android:background="@drawable/ic_off"
  131. android:text="显示密码"
  132. android:textSize="18sp" />
  133. </LinearLayout>
  134. </LinearLayout>
  135. <LinearLayout
  136. android:layout_width="match_parent"
  137. android:layout_height="0dp"
  138. android:layout_marginTop="10dp"
  139. android:layout_weight="1.5"
  140. android:orientation="horizontal">
  141. <Button
  142. android:id="@+id/reset"
  143. android:layout_width="wrap_content"
  144. android:layout_height="wrap_content"
  145. android:layout_marginLeft="150dp"
  146. android:layout_marginRight="100dp"
  147. android:layout_weight="1"
  148. android:background="@drawable/loginbutton"
  149. android:text="重 置"
  150. android:textColor="@color/white"
  151. android:textSize="20sp" />
  152. <Button
  153. android:id="@+id/connect"
  154. android:layout_width="wrap_content"
  155. android:layout_height="wrap_content"
  156. android:layout_marginRight="150dp"
  157. android:layout_weight="1"
  158. android:background="@drawable/loginbutton"
  159. android:text="连 接"
  160. android:textColor="@color/white"
  161. android:textSize="20sp" />
  162. </LinearLayout>
  163. </LinearLayout>
  164. </RelativeLayout>

1.2.activity_main

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. android:background="@color/blue"
  9. tools:context=".Activity.MainActivity">
  10. <RelativeLayout
  11. android:layout_width="match_parent"
  12. android:layout_height="0dp"
  13. android:background="@drawable/bg_selete_all"
  14. android:layout_weight="1">
  15. <ImageView
  16. android:layout_width="140dp"
  17. android:layout_height="50dp"
  18. android:layout_centerInParent="true"
  19. android:layout_marginLeft="10dp"
  20. android:layout_marginTop="10dp"
  21. android:layout_marginRight="10dp"
  22. android:layout_marginBottom="10dp"
  23. android:background="@mipmap/logo"
  24. android:backgroundTint="@color/CDP_color"
  25. android:scaleType="fitCenter" />
  26. <TextureView
  27. android:id="@+id/video_view"
  28. android:layout_width="match_parent"
  29. android:layout_height="match_parent"
  30. android:layout_marginStart="5dp"
  31. android:layout_marginTop="5dp"
  32. android:layout_marginEnd="5dp"
  33. android:layout_marginBottom="5dp"
  34. android:visibility="visible" />
  35. </RelativeLayout>
  36. <androidx.recyclerview.widget.RecyclerView
  37. android:id="@+id/center_view"
  38. android:layout_width="match_parent"
  39. android:layout_weight="1"
  40. android:layout_height="0dp"
  41. android:background="@drawable/bg_selete_all"/>
  42. <LinearLayout
  43. android:layout_marginTop="5dp"
  44. android:layout_width="match_parent"
  45. android:layout_height="0dp"
  46. android:background="@drawable/bg_selete_all"
  47. android:layout_weight="1"
  48. android:orientation="horizontal">
  49. <LinearLayout
  50. android:layout_width="0dp"
  51. android:orientation="vertical"
  52. android:layout_weight="1"
  53. android:padding="5dp"
  54. android:layout_height="match_parent">
  55. <Button
  56. android:id="@+id/Traffic_Light"
  57. android:layout_width="match_parent"
  58. android:gravity="center"
  59. android:layout_weight="1"
  60. android:background="@drawable/loginbutton"
  61. android:text="红绿灯识别"
  62. android:textColor="@color/white"
  63. android:textSize="13sp"
  64. android:layout_height="0dp"/>
  65. <Button
  66. android:id="@+id/Traffic"
  67. android:layout_marginTop="5dp"
  68. android:gravity="center"
  69. android:layout_width="match_parent"
  70. android:layout_weight="1"
  71. android:background="@drawable/loginbutton"
  72. android:text="交通标志识别"
  73. android:textColor="@color/white"
  74. android:textSize="13sp"
  75. android:layout_height="0dp"/>
  76. <Button
  77. android:id="@+id/FaceMask"
  78. android:layout_marginTop="5dp"
  79. android:gravity="center"
  80. android:layout_width="match_parent"
  81. android:layout_weight="1"
  82. android:background="@drawable/loginbutton"
  83. android:text="口罩识别"
  84. android:textColor="@color/white"
  85. android:textSize="13sp"
  86. android:layout_height="0dp"/>
  87. <Button
  88. android:id="@+id/Shap"
  89. android:layout_marginTop="5dp"
  90. android:gravity="center"
  91. android:layout_width="match_parent"
  92. android:layout_weight="1"
  93. android:background="@drawable/loginbutton"
  94. android:text="图形识别"
  95. android:textColor="@color/white"
  96. android:textSize="13sp"
  97. android:layout_height="0dp"/>
  98. <Button
  99. android:id="@+id/QR_Code"
  100. android:layout_marginTop="5dp"
  101. android:layout_width="match_parent"
  102. android:layout_weight="1"
  103. android:gravity="center"
  104. android:background="@drawable/loginbutton"
  105. android:text="多二维码识别"
  106. android:textColor="@color/white"
  107. android:textSize="13sp"
  108. android:layout_height="0dp"/>
  109. </LinearLayout>
  110. <LinearLayout
  111. android:layout_width="0dp"
  112. android:orientation="vertical"
  113. android:padding="5dp"
  114. android:layout_weight="1"
  115. android:layout_height="match_parent">
  116. <Button
  117. android:id="@+id/Color_Qr"
  118. android:gravity="center"
  119. android:layout_width="match_parent"
  120. android:layout_weight="1"
  121. android:background="@drawable/loginbutton"
  122. android:text="彩色二维码识别"
  123. android:textColor="@color/white"
  124. android:textSize="13sp"
  125. android:layout_height="0dp"/>
  126. <Button
  127. android:layout_marginTop="5dp"
  128. android:id="@+id/Chepai"
  129. android:layout_width="match_parent"
  130. android:layout_weight="1"
  131. android:gravity="center"
  132. android:background="@drawable/loginbutton"
  133. android:text="车牌识别"
  134. android:textColor="@color/white"
  135. android:textSize="13sp"
  136. android:layout_height="0dp"/>
  137. <Button
  138. android:id="@+id/shapchepai"
  139. android:layout_marginTop="5dp"
  140. android:gravity="center"
  141. android:layout_width="match_parent"
  142. android:layout_weight="1"
  143. android:background="@drawable/loginbutton"
  144. android:text="指定车型车牌识别"
  145. android:textColor="@color/white"
  146. android:textSize="13sp"
  147. android:layout_height="0dp"/>
  148. <Button
  149. android:id="@+id/color_chepai"
  150. android:layout_width="match_parent"
  151. android:gravity="center"
  152. android:layout_marginTop="5dp"
  153. android:layout_weight="1"
  154. android:background="@drawable/loginbutton"
  155. android:text="指定颜色车牌识别"
  156. android:textColor="@color/white"
  157. android:textSize="13sp"
  158. android:layout_height="0dp"/>
  159. <Button
  160. android:id="@+id/Clear_img"
  161. android:layout_marginTop="5dp"
  162. android:layout_width="match_parent"
  163. android:gravity="center"
  164. android:layout_weight="1"
  165. android:background="@drawable/loginbutton"
  166. android:text="清空"
  167. android:textColor="@color/white"
  168. android:textSize="13sp"
  169. android:layout_height="0dp"/>
  170. </LinearLayout>
  171. <LinearLayout
  172. android:layout_width="0dp"
  173. android:orientation="vertical"
  174. android:padding="5dp"
  175. android:layout_weight="1"
  176. android:layout_height="match_parent">
  177. <Button
  178. android:id="@+id/wenzi"
  179. android:gravity="center"
  180. android:layout_width="match_parent"
  181. android:layout_weight="1"
  182. android:background="@drawable/loginbutton"
  183. android:text="文字识别"
  184. android:textColor="@color/white"
  185. android:textSize="13sp"
  186. android:layout_height="0dp"/>
  187. <Button
  188. android:layout_marginTop="5dp"
  189. android:id="@+id/Dxcj"
  190. android:layout_width="match_parent"
  191. android:layout_weight="1"
  192. android:gravity="center"
  193. android:background="@drawable/loginbutton"
  194. android:text="定向裁剪"
  195. android:textColor="@color/white"
  196. android:textSize="13sp"
  197. android:layout_height="0dp"/>
  198. <Button
  199. android:id="@+id/TFT"
  200. android:layout_marginTop="5dp"
  201. android:gravity="center"
  202. android:layout_width="match_parent"
  203. android:layout_weight="1"
  204. android:background="@drawable/loginbutton"
  205. android:text="TFT_A"
  206. android:textColor="@color/white"
  207. android:textSize="13sp"
  208. android:layout_height="0dp"/>
  209. <Button
  210. android:id="@+id/TFT_B"
  211. android:layout_width="match_parent"
  212. android:gravity="center"
  213. android:layout_marginTop="5dp"
  214. android:layout_weight="1"
  215. android:background="@drawable/loginbutton"
  216. android:text="TFT_B"
  217. android:visibility="invisible"
  218. android:textColor="@color/white"
  219. android:textSize="13sp"
  220. android:layout_height="0dp"/>
  221. <Button
  222. android:layout_marginTop="5dp"
  223. android:layout_width="match_parent"
  224. android:gravity="center"
  225. android:layout_weight="1"
  226. android:visibility="invisible"
  227. android:background="@drawable/loginbutton"
  228. android:text="暂定"
  229. android:textColor="@color/white"
  230. android:textSize="13sp"
  231. android:layout_height="0dp"/>
  232. </LinearLayout>
  233. </LinearLayout>
  234. </LinearLayout>

 1.3 testimage 这个为中间滚动显示部分

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.cardview.widget.CardView
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:app="http://schemas.android.com/apk/res-auto"
  5. android:layout_width="match_parent"
  6. android:layout_height="wrap_content"
  7. android:layout_marginStart="10dp"
  8. android:layout_marginEnd="10dp"
  9. android:layout_marginTop="10dp"
  10. app:cardCornerRadius="5dp">
  11. <LinearLayout
  12. android:background="@drawable/bg_selete_all"
  13. android:orientation="vertical"
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"
  16. >
  17. <ImageView
  18. android:id="@+id/test_image"
  19. android:padding="3dp"
  20. android:layout_width="240dp"
  21. android:layout_height="180dp"
  22. android:scaleType="fitCenter"
  23. android:layout_gravity="center_horizontal" />
  24. <TextView
  25. android:id="@+id/test_name"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:textSize="13sp"
  29. android:layout_marginTop="2dp"
  30. android:layout_marginBottom="2dp" />
  31. <TextView
  32. android:id="@+id/test_name2"
  33. android:layout_width="wrap_content"
  34. android:layout_height="wrap_content"
  35. android:layout_marginTop="2dp"
  36. android:layout_marginBottom="2dp"
  37. android:textSize="13sp" />
  38. </LinearLayout>
  39. </androidx.cardview.widget.CardView>

2.项目结构

2.1.CameraSearchService.java 可以直接复制粘贴,不用理解太深

  1. package com.example.test_car.CameraUtile;
  2. import android.app.IntentService;
  3. import android.content.Intent;
  4. import android.util.Log;
  5. import java.io.IOException;
  6. import java.io.UnsupportedEncodingException;
  7. import java.net.DatagramPacket;
  8. import java.net.DatagramSocket;
  9. import java.net.InetAddress;
  10. import java.net.InetSocketAddress;
  11. import java.net.SocketException;
  12. import java.net.UnknownHostException;
  13. import java.util.Timer;
  14. import java.util.TimerTask;
  15. public class CameraSearchService extends IntentService {
  16. public CameraSearchService() {
  17. super("CameraSearchService");
  18. }
  19. //摄像头ͷIP
  20. private String IP = null;
  21. @Override
  22. protected void onHandleIntent(Intent intent) {
  23. SearchCameraUtil searchCameraUtil;
  24. for (int i = 0;i < 1 && IP == null;i++) {
  25. searchCameraUtil = new SearchCameraUtil();
  26. IP = searchCameraUtil !=null ? searchCameraUtil.send(): null;
  27. try {
  28. Thread.sleep(500);
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. Intent mintent = new Intent(CameraConnectUtil.A_S);
  34. mintent.putExtra("IP", XcApplication.cameraip);
  35. mintent.putExtra("IP", IP + ":81");
  36. mintent.putExtra("pureip", IP);
  37. sendBroadcast(mintent);
  38. }
  39. class SearchCameraUtil {
  40. private String IP = "";
  41. private String TAG = "UDPClient";
  42. private final int PORT = 3565;
  43. private final int SERVER_PORT = 8600;
  44. private byte[] mbyte = new byte[]{68, 72, 1, 1};
  45. private DatagramSocket dSocket = null;
  46. private byte[] msg = new byte[1024];
  47. boolean isConn = false;
  48. public SearchCameraUtil() {
  49. }
  50. public String send() {
  51. InetAddress local = null;
  52. try {
  53. local = InetAddress.getByName("255.255.255.255");
  54. Log.e(this.TAG, "已找到服务器,连接中...");
  55. } catch (UnknownHostException var7) {
  56. Log.e(this.TAG, "未找到服务器.");
  57. var7.printStackTrace();
  58. return null;
  59. }
  60. try {
  61. if (this.dSocket != null) {
  62. this.dSocket.close();
  63. this.dSocket = null;
  64. }
  65. // 第一次连接没有报错,第二次开始报这个错误。字面意思看出是由于端口被占用,未释放导致。
  66. // 虽然程序貌似已经退出,个人猜测是由于系统还没有及时释放导致的。
  67. // this.dSocket = new DatagramSocket(3565);
  68. if(dSocket == null){
  69. dSocket = new DatagramSocket(null);
  70. dSocket.setReuseAddress(true);
  71. dSocket.bind(new InetSocketAddress(PORT));
  72. }
  73. Log.e(this.TAG, "正在连接服务器...");
  74. } catch (SocketException var6) {
  75. var6.printStackTrace();
  76. Log.e(this.TAG, "服务器连接失败.");
  77. return null;
  78. }
  79. DatagramPacket sendPacket = new DatagramPacket(this.mbyte, 4, local, SERVER_PORT);
  80. DatagramPacket recPacket = new DatagramPacket(this.msg, this.msg.length);
  81. try {
  82. this.dSocket.send(sendPacket);
  83. Timer timer = new Timer();
  84. timer.schedule(new TimerTask() {
  85. @Override
  86. public void run() {
  87. if (isConn){
  88. dSocket.close();
  89. this.cancel();
  90. }
  91. isConn = true;
  92. }
  93. }, 0, 500);
  94. this.dSocket.receive(recPacket);
  95. timer.cancel();
  96. String text = new String(this.msg, 0, recPacket.getLength());
  97. if (text.substring(0, 2).equals("DH")) {
  98. this.getIP(text);
  99. }
  100. Log.e("IP值", this.IP);
  101. this.dSocket.close();
  102. Log.e(this.TAG, "消息发送成功!");
  103. } catch (IOException var5) {
  104. var5.printStackTrace();
  105. Log.e(this.TAG, "消息发送失败.");
  106. return null;
  107. }
  108. return this.IP;
  109. }
  110. private void getIP(String text) {
  111. try {
  112. byte[] ipbyte = text.getBytes("UTF-8");
  113. for(int i = 4; i < 22 && ipbyte[i] != 0; ++i) {
  114. if (ipbyte[i] == 46) {
  115. this.IP = this.IP + ".";
  116. } else {
  117. this.IP = this.IP + (ipbyte[i] - 48);
  118. }
  119. }
  120. } catch (UnsupportedEncodingException var4) {
  121. var4.printStackTrace();
  122. }
  123. }
  124. }
  125. }

2.2.CameraConnectUtil.java 需要理解里面的广播机制

  1. package com.example.test_car.CameraUtile;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.IntentFilter;
  6. import android.util.Log;
  7. import com.example.test_car.Activity.MainActivity;
  8. import com.example.test_car.MessageBean.DataRefreshBean;
  9. import org.greenrobot.eventbus.EventBus;
  10. public class CameraConnectUtil {
  11. public CameraConnectUtil(Context context){
  12. this.context = context;
  13. }
  14. private Context context;
  15. public void cameraInit() {
  16. //广播接收器注册
  17. IntentFilter intentFilter = new IntentFilter();
  18. intentFilter.addAction(A_S);
  19. context.registerReceiver(myBroadcastReceiver, intentFilter);
  20. }
  21. public void cameraStopService(){
  22. Intent intent = new Intent(context, CameraSearchService.class);
  23. context.stopService(intent);
  24. }
  25. public static final String A_S = "com.a_s";
  26. public BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {
  27. public void onReceive(Context arg0, Intent arg1) {
  28. MainActivity.IPCamera = arg1.getStringExtra("IP");
  29. MainActivity.purecameraip = arg1.getStringExtra("pureip");
  30. Log.e("camera ip::", " " + MainActivity.IPCamera);
  31. EventBus.getDefault().post(new DataRefreshBean(2));
  32. context.unregisterReceiver(this);
  33. }
  34. };
  35. // 搜索摄像cameraIP
  36. public void search() {
  37. Intent intent = new Intent(context, CameraSearchService.class);
  38. context.startService(intent);
  39. }
  40. public void destroy(){
  41. try {
  42. context.unregisterReceiver(myBroadcastReceiver);
  43. }catch (RuntimeException ignored){
  44. }
  45. }
  46. }

2.3 DataRefreshBean.java 这个类代表了消息广播中的实体类

  1. package com.example.test_car.MessageBean;
  2. public class DataRefreshBean {
  3. private int refreshState;
  4. public DataRefreshBean(int refreshState){
  5. this.refreshState = refreshState;
  6. }
  7. public int getRefreshState() {
  8. return refreshState;
  9. }
  10. public void setRefreshState(int refreshState) {
  11. this.refreshState = refreshState;
  12. }
  13. }

2.4.VLCPlayer.java 这个是视频播放工具类,不用深入理解

  1. package com.example.test_car.Utils;
  2. import android.content.Context;
  3. import android.media.MediaScannerConnection;
  4. import android.net.Uri;
  5. import android.util.Log;
  6. import android.view.TextureView;
  7. import android.view.View;
  8. import com.example.test_car.Activity.MainActivity;
  9. import org.videolan.libvlc.LibVLC;
  10. import org.videolan.libvlc.Media;
  11. import org.videolan.libvlc.MediaPlayer;
  12. import java.io.File;
  13. import java.net.FileNameMap;
  14. import java.net.URLConnection;
  15. import java.util.ArrayList;
  16. /**
  17. * VLC播放视频工具类
  18. */
  19. public class VLCPlayer implements MediaPlayer.EventListener{
  20. private LibVLC libVLC;
  21. private MediaPlayer mediaPlayer;
  22. public VLCPlayer(Context context) {
  23. ArrayList<String> options = new ArrayList<>();
  24. options.add("--no-drop-late-frames"); //防止掉帧
  25. options.add("--skip-frames"); //防止掉帧
  26. options.add("--rtsp-tcp");//强制使用TCP方式
  27. options.add("--avcodec-hw=any"); //尝试使用硬件加速
  28. options.add("--live-caching=0");//缓冲时长
  29. options.add("--no-audio");//关闭音频
  30. options.add("--sout-display");//持续串流输出
  31. options.add("--network-caching=300");//网络缓冲时长
  32. libVLC = new LibVLC(context, options);
  33. mediaPlayer = new MediaPlayer(libVLC);
  34. mediaPlayer.setEventListener(this);
  35. }
  36. /**
  37. * 设置播放视图
  38. * @param textureView
  39. */
  40. public void setVideoSurface(TextureView textureView) {
  41. mediaPlayer.getVLCVout().setVideoSurface(textureView.getSurfaceTexture());
  42. mediaPlayer.getVLCVout().setWindowSize(textureView.getWidth(), textureView.getHeight());
  43. textureView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
  44. @Override
  45. public void onLayoutChange(View v, int left, int top, int right, int bottom,
  46. int oldLeft, int oldTop, int oldRight, int oldBottom) {
  47. // 获取新的宽度和高度
  48. int newWidth = right - left;
  49. int newHeight = bottom - top;
  50. // 设置VLC播放器的宽高参数
  51. mediaPlayer.getVLCVout().setWindowSize(newWidth, newHeight);
  52. }
  53. });
  54. mediaPlayer.getVLCVout().attachViews();
  55. }
  56. /**
  57. * 设置播放地址
  58. * @param url
  59. */
  60. public void setDataSource(String url) {
  61. try {
  62. Media media = new Media(libVLC, Uri.parse(url));
  63. media.setHWDecoderEnabled(false,false);
  64. mediaPlayer.setMedia(media);
  65. }catch (Exception e){
  66. Log.e("VLCPlayer",e.getMessage(),e);
  67. }
  68. }
  69. /**
  70. * 播放
  71. */
  72. public void play() {
  73. if (mediaPlayer == null) {
  74. return;
  75. }
  76. mediaPlayer.play();
  77. }
  78. /**
  79. * 暂停
  80. */
  81. public void pause() {
  82. if (mediaPlayer == null) {
  83. return;
  84. }
  85. mediaPlayer.pause();
  86. }
  87. /**
  88. * 停止播放
  89. */
  90. public void stop() {
  91. if (mediaPlayer == null) {
  92. return;
  93. }
  94. new Thread(new Runnable() {
  95. @Override
  96. public void run() {
  97. mediaPlayer.stop();
  98. }
  99. }).start();
  100. }
  101. public boolean takeSnapShot(int number, String _path, int width, int height){
  102. boolean b = mediaPlayer.takeSnapShot(number,_path,width,height);
  103. MediaScannerConnection.scanFile(MainActivity.INSTANCE, new String[]{_path}, null, (path, uri) -> Log.e("资源刷新成功路径为", path));
  104. return b;
  105. }
  106. /**
  107. * 兼容android 10
  108. * 更新图库
  109. * @param mContext
  110. * @param file
  111. */
  112. public static void updatePhotoAlbum(Context mContext,String file) {
  113. // 扫描刷新
  114. String[] pathArray = new String[]{file};
  115. String[] typeArray = new String[]{"image/jpeg"};
  116. MediaScannerConnection.scanFile(mContext, pathArray, typeArray, new MediaScannerConnection.OnScanCompletedListener() {
  117. @Override
  118. public void onScanCompleted(String s, Uri uri) {
  119. Log.d("ImageUtils", "onScanCompleted s->" + s);
  120. }
  121. });
  122. }
  123. public static String getMimeType(File file) {
  124. FileNameMap fileNameMap = URLConnection.getFileNameMap();
  125. String type = fileNameMap.getContentTypeFor(file.getName());
  126. return type;
  127. }
  128. /**
  129. * 释放资源
  130. */
  131. public void release() {
  132. if(mediaPlayer!=null) {
  133. mediaPlayer.release();
  134. }
  135. if(libVLC!=null) {
  136. libVLC.release();
  137. }
  138. }
  139. @Override
  140. public void onEvent(MediaPlayer.Event event) {
  141. switch (event.type) {
  142. case MediaPlayer.Event.Buffering:
  143. // 处理缓冲事件
  144. if (callback != null) {
  145. callback.onBuffering(event.getBuffering());
  146. }
  147. break;
  148. case MediaPlayer.Event.EndReached:
  149. // 处理播放结束事件
  150. if (callback != null) {
  151. callback.onEndReached();
  152. }
  153. break;
  154. case MediaPlayer.Event.EncounteredError:
  155. // 处理播放错误事件
  156. if (callback != null) {
  157. callback.onError();
  158. }
  159. break;
  160. case MediaPlayer.Event.TimeChanged:
  161. // 处理播放进度变化事件
  162. if (callback != null) {
  163. callback.onTimeChanged(event.getTimeChanged());
  164. }
  165. break;
  166. case MediaPlayer.Event.PositionChanged:
  167. // 处理播放位置变化事件
  168. if (callback != null) {
  169. callback.onPositionChanged(event.getPositionChanged());
  170. }
  171. break;
  172. case MediaPlayer.Event.Vout:
  173. break;
  174. }
  175. }
  176. private VLCPlayerCallback callback;
  177. public void setCallback(VLCPlayerCallback callback) {
  178. this.callback = callback;
  179. }
  180. public interface VLCPlayerCallback {
  181. void onBuffering(float bufferPercent);
  182. void onEndReached();
  183. void onError();
  184. void onTimeChanged(long currentTime);
  185. void onPositionChanged(float position);
  186. }
  187. }

2.5 Login 登录页面代码

  1. package com.example.test_car.Activity;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import androidx.core.view.ViewCompat;
  4. import androidx.core.view.WindowInsetsControllerCompat;
  5. import android.content.Intent;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.View;
  9. import android.view.Window;
  10. import android.view.WindowManager;
  11. import android.widget.Button;
  12. import com.example.test_car.CameraUtile.CameraConnectUtil;
  13. import com.example.test_car.CameraUtile.CameraSearchService;
  14. import com.example.test_car.MessageBean.DataRefreshBean;
  15. import com.example.test_car.R;
  16. import org.greenrobot.eventbus.EventBus;
  17. import org.greenrobot.eventbus.Subscribe;
  18. import org.greenrobot.eventbus.ThreadMode;
  19. public class Login extends AppCompatActivity {
  20. private Button bt_connect = null;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. supportRequestWindowFeature(Window.FEATURE_NO_TITLE);//用于在 Activity 中去除标题栏
  25. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  26. WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
  27. Window window = getWindow();
  28. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
  29. window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
  30. WindowInsetsControllerCompat wic = ViewCompat.getWindowInsetsController(getWindow().getDecorView());
  31. if (wic != null) {
  32. // true表示Light Mode,状态栏字体呈黑色,反之呈白色
  33. wic.setAppearanceLightStatusBars(true);
  34. }
  35. setContentView(R.layout.activity_login);
  36. EventBus.getDefault().register(this); // EventBus消息注册,只有注册了消息机制后,才能收到广播出来的消息
  37. bt_connect=findViewById(R.id.connect);
  38. bt_connect.setOnClickListener(new View.OnClickListener() {
  39. @Override
  40. public void onClick(View v) {
  41. search();
  42. }
  43. });
  44. CameraConnectUtil cameraConnectUtil = new CameraConnectUtil(this);
  45. cameraConnectUtil.cameraInit();//摄像头初始化
  46. }
  47. // 搜索摄像cameraIP
  48. private void search() {
  49. Intent intent = new Intent(Login.this, CameraSearchService.class);
  50. startService(intent);
  51. }
  52. /**
  53. * 接收Eventbus消息
  54. *
  55. * @param refresh
  56. */
  57. @Subscribe(threadMode = ThreadMode.MAIN)
  58. public void onEventMainThread(DataRefreshBean refresh) {
  59. if (refresh.getRefreshState() == 2) {//如果CameraConnectUtil中广播出来的消息为2
  60. startFirstActivity();//页面跳转
  61. }
  62. }
  63. private void startFirstActivity() {
  64. startActivity(new Intent(Login.this,MainActivity.class));
  65. finish();
  66. }
  67. @Override
  68. protected void onDestroy() {
  69. super.onDestroy();
  70. EventBus.getDefault().unregister(this); // EventBus消息注销
  71. Log.e("LoginActivity", "onDestroy");
  72. }
  73. }

2.6 MainActivity

  1. package com.example.test_car.Activity;
  2. import androidx.annotation.NonNull;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.annotation.SuppressLint;
  5. import android.app.AlertDialog;
  6. import android.content.Context;
  7. import android.content.Intent;
  8. import android.graphics.Bitmap;
  9. import android.graphics.SurfaceTexture;
  10. import android.net.DhcpInfo;
  11. import android.net.wifi.WifiManager;
  12. import android.os.Bundle;
  13. import android.os.Handler;
  14. import android.os.Message;
  15. import android.text.format.Formatter;
  16. import android.util.Log;
  17. import android.view.MotionEvent;
  18. import android.view.TextureView;
  19. import android.view.View;
  20. import android.view.WindowManager;
  21. import android.widget.Button;
  22. import com.bkrcl.control_car_video.camerautil.CameraCommandUtil;
  23. import com.example.test_car.CameraUtile.CameraConnectUtil;
  24. import com.example.test_car.CameraUtile.XcApplication;
  25. import com.example.test_car.Data.Connect;
  26. import com.example.test_car.MessageBean.DataRefreshBean;
  27. import com.example.test_car.R;
  28. import com.example.test_car.Utils.ToastUtil;
  29. import com.example.test_car.Utils.VLCPlayer;
  30. import org.greenrobot.eventbus.EventBus;
  31. import org.greenrobot.eventbus.Subscribe;
  32. import org.greenrobot.eventbus.ThreadMode;
  33. import java.net.InetAddress;
  34. import java.net.UnknownHostException;
  35. import java.util.concurrent.ExecutorService;
  36. import java.util.concurrent.Executors;
  37. public class MainActivity extends AppCompatActivity implements VLCPlayer.VLCPlayerCallback {
  38. private static final String TAG = "测试";
  39. // 摄像头IP
  40. public static String IPCamera = null;
  41. public static String purecameraip = null;
  42. // 图片
  43. public static Bitmap bitmap;
  44. // 摄像头连接状态
  45. private boolean cameraConnectState = false;
  46. ToastUtil toastUtil = new ToastUtil(this);
  47. Connect connect = new Connect();
  48. // 摄像头工具
  49. public static CameraCommandUtil cameraCommandUtil;
  50. private CameraConnectUtil cameraConnectUtil;
  51. public static MainActivity INSTANCE;
  52. // 小车ip
  53. static String IPCar,IPmask;
  54. private VLCPlayer vlcPlayer;
  55. //坐标
  56. private float x1 = 0;
  57. private float y1 = 0;
  58. //控件
  59. private TextureView textureView;
  60. Button Traffic_Light_btn;//红绿灯识别按钮
  61. Button Traffic_btn;//交通标志
  62. Button FaceMask_btn;//口罩
  63. Button Shap_btn;//图形
  64. Button QR_Code_btn;//多二维码
  65. Button Color_QR_btn;//彩色二维码
  66. Button Chepai_btn;//车牌
  67. Button Shap_ChePai_btn;//指定车型车牌
  68. Button Color_Chepai_btn;//指定颜色车牌
  69. Button Clear_btn ;// 清空
  70. Button wenzi_btn;//文字
  71. Button Dxcj;//定向裁剪
  72. Button TFT;
  73. @Override
  74. protected void onCreate(Bundle savedInstanceState) {
  75. super.onCreate(savedInstanceState);
  76. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  77. WindowManager.LayoutParams.FLAG_FULLSCREEN);//这段代码是用于设置 Android 应用程序窗口为全屏模式
  78. setContentView(R.layout.activity_main);
  79. initView();//控件初始化
  80. init();
  81. btn();
  82. wifi_Init();//wifi初始化
  83. INSTANCE=this;
  84. EventBus.getDefault().register(this); // EventBus消息注册
  85. cameraCommandUtil = new CameraCommandUtil();
  86. cameraConnectUtil = new CameraConnectUtil(this);
  87. cameraConnectUtil.cameraInit();//摄像头初始化
  88. cameraConnectUtil.search();//搜索摄像头
  89. XcApplication.executorServicetor.execute(()->{
  90. connect.connect(recvhandler,IPCar);
  91. });//建立与小车的连接
  92. }
  93. public static void setBitmap(Bitmap bitmap1) {
  94. bitmap = bitmap1;
  95. }
  96. public boolean isCameraConnectState() {//判断是否连接成功
  97. return cameraConnectState;
  98. }
  99. public void setCameraConnectState(boolean cameraConnectState) {
  100. this.cameraConnectState = cameraConnectState;
  101. }
  102. // 得到当前摄像头的图片信息,转换为Bitmap
  103. public Bitmap getBitmap() {
  104. return bitmap = textureView.getBitmap();
  105. }
  106. //WiFi初始化
  107. /**
  108. * 首先,通过 getSystemService(Context.WIFI_SERVICE) 方法获取到 WifiManager 对象,
  109. * 该对象用于管理 Wi-Fi 相关的操作。然后使用 wifiManager.getDhcpInfo() 方法获取到 DhcpInfo 对象,
  110. * DhcpInfo 包含了当前连接的 Wi-Fi 网络的 DHCP 信息,包括网关地址、IP 地址、子网掩码等。
  111. * 接着,通过 Formatter.formatIpAddress(dhcpInfo.gateway) 将 DhcpInfo 中的网关地址转换成字符串格式的 IP 地址。
  112. * 这里的 dhcpInfo.gateway 表示 DhcpInfo 中保存的网关地址,通过 Formatter.formatIpAddress()
  113. * 方法将其转换成常用的点分十进制的 IP 地址表示形式。
  114. */
  115. private void wifi_Init() {
  116. // 得到服务器的IP地址
  117. WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
  118. // 服务器管理器
  119. DhcpInfo dhcpInfo = wifiManager.getDhcpInfo();
  120. IPCar = Formatter.formatIpAddress(dhcpInfo.gateway);
  121. IPmask = Formatter.formatIpAddress(dhcpInfo.netmask);
  122. }
  123. /**
  124. * 接收显示小车发送的数据
  125. */
  126. @SuppressLint("HandlerLeak")
  127. private final Handler recvhandler = new Handler() {
  128. @SuppressLint("SetTextI18n")
  129. public void handleMessage(Message msg) {
  130. if (msg.what == 1) {
  131. byte[] mByte = (byte[]) msg.obj;
  132. if (mByte[0] == 0x55) {
  133. if (mByte[1] == (byte) 0xaa) {//主车
  134. // 显示数据
  135. }
  136. }
  137. }
  138. }
  139. };
  140. private final Bitmap newbitmap = null;
  141. /**
  142. * 接收Eventbus消息
  143. *
  144. * @param refresh
  145. */
  146. @SuppressLint("SetTextI18n")
  147. @Subscribe(threadMode = ThreadMode.MAIN)
  148. public void onEventMainThread(DataRefreshBean refresh) {
  149. if (refresh.getRefreshState() == 1) {//这个if其实可以不用谢,因为我没有做刷新按钮
  150. Log.e(TAG, "onEventMainThread: " + IPCamera);
  151. if (IPCamera.equals("null:81")) {
  152. Log.e(TAG, "onEventMainThread: " + IPCamera);
  153. cameraConnectUtil.cameraStopService();
  154. cameraConnectUtil.cameraInit();
  155. cameraConnectUtil.search();
  156. } else {
  157. cameraConnectUtil.cameraStopService();
  158. cameraConnectUtil.cameraInit();
  159. cameraConnectUtil.search();
  160. initVLCPlayer(false); // 初始化视频流
  161. }
  162. } else if (refresh.getRefreshState() == 2) {//广播为2,代表摄像头和网络没问题
  163. setCameraConnectState(true);
  164. if (!IPCamera.equals("null:81")) {
  165. try {
  166. if (!isIpAddressInSubnet(IPCar, purecameraip,IPmask)) {
  167. toastUtil.ShowToast("请检查摄像头配置,当前摄像头地址与小车不在同一网段内,请重新配置");
  168. } else initVLCPlayer(false); // 初始化视频流
  169. } catch (UnknownHostException e) {
  170. throw new RuntimeException(e);
  171. }
  172. }
  173. } else if (refresh.getRefreshState() == 4) {//表示没搜到摄像头
  174. if (bitmap != null) {
  175. bitmap.recycle();
  176. }
  177. setBitmap(newbitmap);
  178. }
  179. }
  180. public static boolean isIpAddressInSubnet(String ipAddress, String subnetAddress, String subnetMask) throws UnknownHostException {
  181. InetAddress inetAddress = InetAddress.getByName(ipAddress);
  182. InetAddress subnet = InetAddress.getByName(subnetAddress);
  183. InetAddress mask = InetAddress.getByName(subnetMask);
  184. byte[] inetAddressBytes = inetAddress.getAddress();
  185. byte[] subnetBytes = subnet.getAddress();
  186. byte[] maskBytes = mask.getAddress();
  187. for (int i = 0; i < inetAddressBytes.length; i++) {
  188. int addressByte = inetAddressBytes[i] & 0xFF;
  189. int subnetByte = subnetBytes[i] & 0xFF;
  190. int maskByte = maskBytes[i] & 0xFF;
  191. if ((addressByte & maskByte) != (subnetByte & maskByte)) {
  192. return false;
  193. }
  194. }
  195. return true;
  196. }
  197. /**
  198. * 初始化视频流的代码
  199. * @param isFirst
  200. */
  201. private void initVLCPlayer(Boolean isFirst) {
  202. XcApplication.executorServicetor.execute(() -> {
  203. if (isFirst) {
  204. vlcPlayer = new VLCPlayer(this);
  205. vlcPlayer.setVideoSurface(textureView);
  206. }
  207. // String ip = IPCamera.substring(0, IPCamera.indexOf(":"));
  208. String url = "rtsp://admin:888888@" + purecameraip + ":10554/tcp/av0_0";
  209. vlcPlayer.setDataSource(url);
  210. vlcPlayer.setCallback(INSTANCE);
  211. vlcPlayer.play();
  212. });
  213. }
  214. /**
  215. * 初始化视频流控件
  216. */
  217. private void initView(){
  218. textureView = findViewById(R.id.video_view);
  219. textureView.setOnTouchListener(new ontouchlistener1());
  220. // 视频流显示区域
  221. textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
  222. @Override
  223. public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
  224. initVLCPlayer(true);
  225. }
  226. @Override
  227. public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) {
  228. }
  229. @Override
  230. public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) {
  231. return false;
  232. }
  233. @Override
  234. public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) {
  235. }
  236. });
  237. }
  238. /**
  239. * 初始化按钮控件
  240. */
  241. private void init(){
  242. Clear_btn = findViewById(R.id.Clear_img);//清空按钮
  243. Traffic_Light_btn=findViewById(R.id.Traffic_Light);//红绿灯识别按钮
  244. Traffic_btn = findViewById(R.id.Traffic);//交通标志
  245. FaceMask_btn = findViewById(R.id.FaceMask);//口罩
  246. Shap_btn = findViewById(R.id.Shap);//图形
  247. QR_Code_btn = findViewById(R.id.QR_Code);//多二维码
  248. Color_QR_btn = findViewById(R.id.Color_Qr);//彩色二维码
  249. Chepai_btn = findViewById(R.id.Chepai);//车牌
  250. Shap_ChePai_btn = findViewById(R.id.shapchepai);//指定车型车牌
  251. Color_Chepai_btn = findViewById(R.id.color_chepai);//指定颜色车牌
  252. wenzi_btn = findViewById(R.id.wenzi);//文字
  253. Dxcj = findViewById(R.id.Dxcj);//定向裁剪
  254. TFT =findViewById(R.id.TFT);
  255. }
  256. /**
  257. * 底部按钮点击事件
  258. */
  259. private void btn(){
  260. Clear_btn.setOnClickListener(new View.OnClickListener() {
  261. @Override
  262. public void onClick(View view) {
  263. }
  264. });//清空
  265. Traffic_Light_btn.setOnClickListener(new View.OnClickListener() {
  266. @Override
  267. public void onClick(View view) {
  268. }
  269. });//红绿灯
  270. Traffic_btn.setOnClickListener(new View.OnClickListener() {
  271. @Override
  272. public void onClick(View view) {
  273. }
  274. });//交通标志
  275. FaceMask_btn.setOnClickListener(new View.OnClickListener() {
  276. @Override
  277. public void onClick(View view) {
  278. }
  279. });//口罩
  280. Shap_btn.setOnClickListener(new View.OnClickListener() {
  281. @Override
  282. public void onClick(View view) {
  283. toastUtil.ShowToast("请自行进行模型训练,如果不会,请联系学长!");
  284. }
  285. });//图形
  286. QR_Code_btn.setOnClickListener(new View.OnClickListener() {
  287. @Override
  288. public void onClick(View view) {
  289. }
  290. });//多二维码
  291. Color_QR_btn.setOnClickListener(new View.OnClickListener() {
  292. @Override
  293. public void onClick(View view) {
  294. }
  295. });//颜色二维码
  296. Chepai_btn.setOnClickListener(new View.OnClickListener() {
  297. @Override
  298. public void onClick(View view) {
  299. }
  300. });//车牌
  301. Shap_ChePai_btn.setOnClickListener(new View.OnClickListener() {
  302. @Override
  303. public void onClick(View view) {
  304. }
  305. });//指定车型识别车牌
  306. Color_Chepai_btn.setOnClickListener(new View.OnClickListener() {
  307. @Override
  308. public void onClick(View view) {
  309. }
  310. });//指定颜色识别车牌
  311. wenzi_btn.setOnClickListener(new View.OnClickListener() {
  312. @Override
  313. public void onClick(View v) {
  314. }
  315. });//文字
  316. Dxcj.setOnClickListener(new View.OnClickListener() {
  317. @Override
  318. public void onClick(View v) {
  319. }
  320. });//定向裁剪
  321. TFT.setOnClickListener(new View.OnClickListener() {
  322. @Override
  323. public void onClick(View v) {
  324. TFT_Control();
  325. }
  326. });//控制tft
  327. }
  328. private void TFT_Control() {
  329. AlertDialog.Builder tft_builder = new AlertDialog.Builder(this);
  330. tft_builder.setTitle("多功能信息显示标志物");
  331. String[] ga = {"TFT(A)", "TFT(B)", "TFT(C)"};
  332. tft_builder.setSingleChoiceItems(ga, -1, (dialog, i) -> {
  333. switch (i) {
  334. case 0: // A
  335. Smart_DataDisplay_Image("多功能信息显示标志物(A)",0x0B);
  336. break;
  337. case 1: // B
  338. Smart_DataDisplay_Image("多功能信息显示标志物(B)",0x08);
  339. break;
  340. case 2: // C
  341. Smart_DataDisplay_Image("多功能信息显示标志物(C)",0x11);
  342. break;
  343. default:
  344. break;
  345. }
  346. });
  347. tft_builder.create().show();
  348. }
  349. /**
  350. * 显示弹窗
  351. * @param
  352. */
  353. private void Smart_DataDisplay_Image(String name,int id) {
  354. AlertDialog.Builder TFT_Image_builder = new AlertDialog.Builder(this);
  355. TFT_Image_builder.setTitle(name);
  356. String[] TFT_Image_item = { "上翻一页", "下翻一页", "自动翻页"};
  357. TFT_Image_builder.setSingleChoiceItems(TFT_Image_item, -1, (dialog, which) -> {
  358. // TODO 自动生成的方法存根
  359. switch (which) {
  360. case 0:
  361. connect.TFT_LCD(id, 0x10, 0x01, 0x00, 0x00);
  362. break;
  363. case 1:
  364. connect.TFT_LCD(id, 0x10, 0x02, 0x00, 0x00);
  365. break;
  366. case 2:
  367. connect.TFT_LCD(id, 0x10, 0x03, 0x00, 0x00);
  368. break;
  369. }
  370. });
  371. TFT_Image_builder.create().show();
  372. }
  373. @Override
  374. public void onBuffering(float bufferPercent) {
  375. }
  376. @Override
  377. public void onEndReached() {
  378. }
  379. @Override
  380. public void onError() {
  381. }
  382. @Override
  383. public void onTimeChanged(long currentTime) {
  384. }
  385. @Override
  386. public void onPositionChanged(float position) {
  387. }
  388. /**
  389. * 控制摄像头滑动
  390. */
  391. private class ontouchlistener1 implements View.OnTouchListener {
  392. @Override
  393. public boolean onTouch(View v, MotionEvent event) {
  394. // TODO 自动生成的方法存根
  395. if (cameraConnectState) {
  396. switch (event.getAction() & MotionEvent.ACTION_MASK) {
  397. // 点击位置坐标
  398. case MotionEvent.ACTION_DOWN:
  399. x1 = event.getX();
  400. y1 = event.getY();
  401. break;
  402. // 弹起坐标
  403. case MotionEvent.ACTION_UP:
  404. float x2 = event.getX();
  405. float y2 = event.getY();
  406. float xx = x1 > x2 ? x1 - x2 : x2 - x1;
  407. float yy = y1 > y2 ? y1 - y2 : y2 - y1;
  408. // 判断滑屏趋势
  409. int MINLEN = 30;
  410. if (xx > yy) {
  411. if ((x1 > x2) && (xx > MINLEN)) { // left
  412. XcApplication.executorServicetor.execute(new Runnable() {
  413. @Override
  414. public void run() {
  415. cameraCommandUtil.postHttp(IPCamera, 4, 1); //左
  416. }
  417. });
  418. } else if ((x1 < x2) && (xx > MINLEN)) { // right
  419. XcApplication.executorServicetor.execute(new Runnable() {
  420. @Override
  421. public void run() {
  422. cameraCommandUtil.postHttp(IPCamera, 6, 1); //右
  423. }
  424. });
  425. }
  426. } else {
  427. if ((y1 > y2) && (yy > MINLEN)) { // up
  428. XcApplication.executorServicetor.execute(new Runnable() {
  429. @Override
  430. public void run() {
  431. cameraCommandUtil.postHttp(IPCamera, 0, 1); //上
  432. }
  433. });
  434. } else if ((y1 < y2) && (yy > MINLEN)) { // down
  435. XcApplication.executorServicetor.execute(new Runnable() {
  436. @Override
  437. public void run() {
  438. cameraCommandUtil.postHttp(IPCamera, 2, 1); //下
  439. }
  440. });
  441. }
  442. }
  443. x1 = 0;
  444. x2 = 0;
  445. y1 = 0;
  446. y2 = 0;
  447. break;
  448. }
  449. }
  450. return true;
  451. }
  452. }
  453. /**
  454. * 生命周期结束时结束Socket链接
  455. */
  456. @Override
  457. protected void onDestroy() {
  458. super.onDestroy();
  459. connect.destory();
  460. }
  461. }

具体的识别代码不会放出来,如果需要了解怎么识别,请私信我。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/847593
推荐阅读
相关标签
  

闽ICP备14008679号