之前无意中买了个esp32的板子 还带了个小摄像头 ,跑了它的例子后可以在电脑上看到视频,下面是记录的使用方法。
esp32摄像头的使用
后来想在手机上直接查看视频,但一直没有成功,直到我看了b站上的稚晖君的一个视频
【自制】吃完的螃蟹不要扔,裹上黑科技,可以做一台火星车~【硬核】

里面刚好用到了esp32的摄像头模块,于是找到他的githup地址,
地址

里面有这个的整个开源项目,copy下来。
第一次跑也没能成功,问题在他使用的摄像头与我的不一样,
根据之前的esp32摄像头的使用例子代码,我的摄像头是
#define CAMERA_MODEL_AI_THINKER
在camera_pins.h中找到与该定义对应的宏
再打开稚晖君的esp32代码,修改其中pins.h中的宏定义与我所使用摄像头定义的一样:

#ifndef PIN_H
#define PIN_H#define I2C0_SDA 32
#define I2C0_SCL 33#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22#endif

后来还是不行,问题出在就出在android的读写权限上,
所以修改了读写权限 :
android 读写权限问题 :java.io.IOException: Permission denied 解决方法
并修改了其中的一些代码。

去掉esp32代码中不需要的部分,修改后如下:

#include <WiFi.h>
// #include <U8g2lib.h>
#include <I2Cdev.h>
#include <Wire.h>
// #include <MPU6050.h>
#include "Pins.h"
#include "Camera.h"
#include "Motor.h"const char* ssid = "";  //填你自己的局域网名
const char* password = ""; //局域网密码WiFiServer server(81);// OV2640 camera
Camera ov2640;void setup()
{Serial.begin(115200);Wire.begin(I2C0_SDA, I2C0_SCL);Wire.setClock(400000);// while (!mpu6050.testConnection());// mpu6050.initialize();ov2640.initialize();int n = WiFi.scanNetworks();Serial.println("scan done");if (n == 0){Serial.println("no networks found");}else{Serial.print(n);Serial.println(" networks found");for (int i = 0; i < n; ++i){// Print SSID and RSSI for each network foundSerial.print(i + 1);Serial.print(": ");Serial.print(WiFi.SSID(i));Serial.print(" (");Serial.print(WiFi.RSSI(i));Serial.print(")");Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");delay(10);}}WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected");ov2640.startCameraServer();Serial.print("Camera Ready! Use 'http://");Serial.print(WiFi.localIP());Serial.println("' to connect");server.begin();
}float i = -1;
long heart_beat = 0;
void loop()
{Serial.println(analogRead(38));WiFiClient client = server.available();   // listen for incoming clientsif (client){// if you get a client,Serial.println("New Client.");           // print a message out the serial portString currentLine = "";                // make a String to hold incoming data from the clientwhile (client.connected()){            // loop while the client's connectedif (client.available()){             // if there's bytes to read from the client,}}}delay(50);
}
String getValue(String data, char separator, int index)
{int found = 0;int strIndex[] = { 0, -1 };int maxIndex = data.length() - 1;for (int i = 0; i <= maxIndex && found <= index; i++){if (data.charAt(i) == separator || i == maxIndex){found++;strIndex[0] = strIndex[1] + 1;strIndex[1] = (i == maxIndex) ? i + 1 : i;}}return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

android studio代码修改如下:
主要是添加了申请权限部分与去掉了他多余的代码。

package xyz.pengzhihui.esp32ipcam;import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;public class MainActivity extends Activity implements View.OnClickListener
{private static final String TAG = "MainActivity::";private HandlerThread handlerThread;private Handler handler;private ImageView imageView;private final int DOWNDLOAD = 1;private final int REGISTER = 2;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.downloadFile).setOnClickListener(this);imageView = findViewById(R.id.img);handlerThread = new HandlerThread("http");handlerThread.start();handler = new HttpHandler(handlerThread.getLooper());}@Overridepublic void onClick(View v){switch (v.getId()){case R.id.downloadFile:handler.sendEmptyMessage(DOWNDLOAD);break;default:break;}}//动态申请权限public static boolean isGrantExternalRW(Activity activity) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {activity.requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);return false;}return true;}private class HttpHandler extends Handler{public HttpHandler(Looper looper){super(looper);}@Overridepublic void handleMessage(Message msg){switch (msg.what){case DOWNDLOAD:downloadFile();break;default:break;}}}private void downloadFile(){String downloadUrl = "http://192.168.50.26:80/stream";String savePath = "/sdcard/pic.jpg";File file = new File(savePath);if (file.exists()){file.delete();}if(!isGrantExternalRW(this)){return;}BufferedInputStream bufferedInputStream = null;FileOutputStream outputStream = null;try{URL url = new URL(downloadUrl);try{HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();httpURLConnection.setRequestMethod("GET");httpURLConnection.setConnectTimeout(1000 * 5);httpURLConnection.setReadTimeout(1000 * 5);httpURLConnection.setDoInput(true);httpURLConnection.connect();if (httpURLConnection.getResponseCode() == 200){InputStream in = httpURLConnection.getInputStream();InputStreamReader isr = new InputStreamReader(in);BufferedReader bufferedReader = new BufferedReader(isr);String line;StringBuffer stringBuffer = new StringBuffer();int i = 0;int len;byte[] buffer;while ((line = bufferedReader.readLine()) != null){if (line.contains("Content-Type:")){line = bufferedReader.readLine();len = Integer.parseInt(line.split(":")[1].trim());bufferedInputStream = new BufferedInputStream(in);buffer = new byte[len];int t = 0;while (t < len){t += bufferedInputStream.read(buffer, t, len - t);}bytesToImageFile(buffer, "0A.jpg");final Bitmap bitmap = BitmapFactory.decodeFile("sdcard/0A.jpg");runOnUiThread(new Runnable(){@Overridepublic void run(){imageView.setImageBitmap(bitmap);}});}}}} catch (IOException e){e.printStackTrace();}} catch (MalformedURLException e){e.printStackTrace();} finally{try{if (bufferedInputStream != null){bufferedInputStream.close();}if (outputStream != null){outputStream.close();}} catch (IOException e){e.printStackTrace();}}}private void bytesToImageFile(byte[] bytes, String fileName){try{File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + fileName);FileOutputStream fos = new FileOutputStream(file);fos.write(bytes, 0, bytes.length);fos.flush();fos.close();} catch (Exception e){e.printStackTrace();}}}

最后结果

android手机连接esp32视频相关推荐

  1. Android 手机采集摄像头视频 socket 视频传输实时传播

    这里搜集了两种实现Android 手机采集摄像头视频 socket 视频传输实时传播的方法,两种都可以使用. 第一种如下: 1.通过客户端socket请求,服务端接受到请求后,获取socket的输出流 ...

  2. android手机连接无线路由器上网设置,手机连接无线网络怎么设置?手机Wifi无线网设置教程...

    随着智能手机无线上网的流行,如今很多家庭都会组建Wifi无线网络,目前组建Wifi网络,大致有两种情况,一种是使用无线路由器,另外一种是将笔记本变身无线无路由器,从而实现智能手机也可以免费Wifi上网 ...

  3. android手机连接PC后怎样切换为U 盘模式

    android手机连接PC后怎样切换为U 盘模式 之前已经发过关于 APK文件怎样安装程序到手机上  已经介绍过了怎样通过手机与 PC 的连接将软件安装至手机.这一次再来讲解一下怎样将你的手机变为&q ...

  4. Android 手机连接电脑

    将Android手机连接到电脑需要安装驱动程序,主要有两种方法,一种是手动安装驱动,另一种是使用软件工具自动安装驱动. 在"设备管理器"面板我们可以看到其中"Androi ...

  5. 【经验】为什么Android手机连接USB后查看手机内部图片有些有缩略图,有些显示图标?

    [经验]为什么Android手机连接USB后查看手机内部图片有些有缩略图,有些显示图标? 一.图片内嵌缩略图原理 这是什么原理呢?因为现在JPEG的文件采用了压缩的方式,其过程比较复杂.为了能让大家快 ...

  6. android手机连接PC无法正常安装驱动

    工作当中我们经常会遇到Android手机连接PC的时候无法正确安装驱动,或者安装失败.当然找到正确的驱动文件时首选的解决方案,如果正确的驱动文件依旧无法安装成功我们可以打开我的电脑-->属性-- ...

  7. android手机连接电脑时直接截屏到电脑

    如题,android手机连接mac,直接快速截屏到mac. 解决方法: 利用android的adb命令即可: #截取手机屏幕保存到SDCard adb shell /system/bin/screen ...

  8. android手机连接windows,将Android手机投影到Windows 10 PC [夏昆冈]

    Windows 10 预览版Build 14328加入了原生的Miracast投影功能,简单说,任意加入无线网络的Win10设备都可以成为一台无线显示器设备.这样一来,几乎所有Android手机和Wi ...

  9. android手机连接windows,四种方式将数据从Windows手机免费传输到Android设备

    解决方案3.使用OneDrive将内容从Windows Phone传输到Android 微软的智能手机操作系统可能不如Android或iOS那么受欢迎.但是,微软的一些应用确实令人印象深刻!微软的On ...

最新文章

  1. Java判断文本文件编码格式以及读取
  2. 飞书×品玩邀请多位行业大咖,共谈跨境企业“战疫”秘籍!
  3. ClassLoader工作机制
  4. 全球及中国液压磁路保护器行业发展规划与产销需求预测报告2022版
  5. Linux中printk和strace命令调试的一些技巧
  6. python下selenium测试报告整合
  7. SqlSever分页查询,仅扫描一次表
  8. 2020护网参考学习 关于护网行动的总结
  9. C++:vs2017编写代码时的光标变成了黑块,选中字时替换掉了黑块选中的字【解决办法】
  10. Golang开发环境配置
  11. 4.1 选择IDC机房 4.2 硬件服务器选型 4.3 上架服务器 4.4/4.5 装系统
  12. 《C语言程序设计》(谭浩强第五版) 第5章 循环结构程序设计 习题解析与答案
  13. 腾讯文档快捷键在哪里
  14. Linux从删库到跑路的命令,从删库到跑路——重写 rm -rf
  15. Apache Tomcat 文件包含漏洞(CNVD-2020-10487,对应 CVE-2020-1938)
  16. SEO搜索引擎优化步骤建议
  17. 看淡生死,弥争当下!
  18. android---转轮菜单
  19. DAZ STUDIO 4.12 NVIDIA Iray 渲染设置
  20. HDU 5514 Frogs

热门文章

  1. 灰狼优化算法--简单易懂附python代码
  2. Android开发使用Glide获取图片背景色淡绿色解决办法
  3. css 有关边框的属性_边框样式(CSS属性)
  4. 【TCP-IP详解卷1-协议】第一章 概述
  5. ih5连接mysql数据库_iH5高级教程:H5数据应用,多种数据的判断
  6. 如何利用领英快速开发客户?
  7. 孙俪主演的热播剧《安家》房似锦,让我们看到比贫穷更可怕的是原生家庭
  8. 软考十大管理流程图知识点整理
  9. 求解TSP问题(python)(穷举、最近邻居法、opt-2法、动态规划、插入法)
  10. pdf转换工具有哪些?试一试这几个方法!