android 通过wifi 热点实现手机摄像头数据共享(转)
原文地址:http://blog.csdn.net/sinat_35845281/article/details/52674946
最近想搞一个新奇的玩意儿~~~
最近一直在在学习通过两个Android手机通过wifi共享摄像头的数据。弄了好久有了点头目。具体有下面几个步骤:
1.对手机相机的开发,自定义surfaceView来定义自己的相机类。主要是显示手机摄像头的画面。
2.对自定义相机的预览画面的数据的获取。然后对数据进行解析。
3.在两台Android手机通过wifi建立传输数据的连接。
4.将数据的时时的传输在两个手机之间。
一.自定义相机类很简单定义一个surfaceView,在Activity中,通过实现surfaceHodler.callBack接口重写的OnSurfaceCreate()中添加打开相机的camera.open即可获得一个Camera对象。设置Camera的预览对象。 mCamera.setPreviewDisplay(holder);holder是我们surfaceView的hodler。可以通过surfaceView.getHodler()获取。这样就可在surfaceView中显示我们手机的预览的画面。
代码如下:
package com.weipu.camera; import java.io.IOException; import android.annotation.TargetApi;
import android.app.Activity;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener; /**
* 接口SurfaceHolder.Callback被用来接收摄像头预览界面变化的信息。它实现了三个方法: surfaceChanged
* 当预览界面的格式和大小发生改变时,该方法被调用。 surfaceCreated 初次实例化,预览界面被创建时,该方法被调用。
* surfaceDestroyed 当预览界面被关闭时,该方法被调用。
*
* @author pengqinping
*/ @TargetApi(9)
public class MyCameraActivity extends Activity implements
SurfaceHolder.Callback, OnClickListener
{ private SurfaceHolder mSurfaceHolder = null; private SurfaceView mSurfaceView = null; private Camera mCamera = null; @Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main); // 初始化组件,SurfaceView
mSurfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);
/**
* 通过代码,我们从surfaceview中获得了holder,并增加callback功能到“this”。
* 这意味着我们的操作(activity)将可以管理这个surfaceview。
*/
mSurfaceHolder = mSurfaceView.getHolder();// 获取surfaceView的Holder对象
mSurfaceHolder.addCallback(this);// 为surfaceView的holder对象添加回调函数,
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
} @Override
protected void onStart()
{
super.onStart();
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width1,
int height1)
{
if (mCamera == null)
{
System.out.println("没有相机设备");
return;
}
if (mCamera != null)
{
//初始化相机。设置参数
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width1, height1); // 设置预览照片的大小
parameters.setPreviewFpsRange(20, 30); // 每秒显示20~30帧
parameters.setPictureFormat(ImageFormat.NV21); // 设置图片格式
parameters.setPictureSize(width1, height1); // 设置照片的大小
}
try
{
mCamera.setPreviewDisplay(holder);
}
catch (IOException e)
{
System.out.println("设置预览出错......");
}
// 通过SurfaceView显示取景画面
mCamera.startPreview(); // 开始预览
mCamera.autoFocus(null); // 自动对焦 } @Override
public void surfaceCreated(SurfaceHolder holder)
{
try
{
mCamera = Camera.open();
}
catch (Exception e)
{
System.out.println("000000000");
return;
} } @Override
public void surfaceDestroyed(SurfaceHolder holder)
{
mCamera.stopPreview();
mCamera.release();
} @Override
public void onClick(View v)
{ } }
这里在对应的Activity申明的时候需要在AndroidManifest.xml中添加
android:configChanges="keyboardHidden|orientation"
android:screenOrientation="landscape"
例:(这样是设置他的横屏和横竖屏的改变Activity做出的改变)
<activity
android:name=".CameraDemophotoneActivity"
android:configChanges="keyboardHidden|orientation"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
在权限方面最好是加上网络权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
二.手机预览数据的获取,手机相机的数据怎么获取了?通过回调手机预览函数: mCamera.setPreviewCallback(streamIt); // streamIt回调的接口的对象。 这样我们就可以获取相机预览的时时的数据。 获取的是原生态YUV格式的数据。这一步的关键是对数据的解析如何解码。网上有牛人写的我也是copy过来用的。重要的是根据自己的需要来决定使用的方式,我使用的是第二种,比较不容易出错。前一种的效果比较差,这里代码我就不弄出来了。(只用好的.....>>>>哈哈呵呵呵)
代码如下:
private Camera.PreviewCallback streamIt = new Camera.PreviewCallback()
{ @Override
public void onPreviewFrame(byte[] data, Camera camera)
{ // method1:使用解码 //method2: 使用系统自带的类来发送图片
Size size = camera.getParameters().getPreviewSize();//获取大小
try
{
//调用image.compressToJpeg()将YUV格式图像数据data转为jpg格式
YuvImage image = new YuvImage(data, ImageFormat.NV21,
size.width, size.height, null);
//使用handler发送图片出去
ByteArrayOutputStream outputSteam = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0, 0, size.width, size.height),
80,
outputSteam);
}
catch (Exception ex)
{
Log.e("Sys", "Error:" + ex.getMessage());
}
}
};
三,两个手机之间建立连接。通过WIFI局域网,不一定是wifi.只要在一个网段就可以,这步我由于设备的原因走了很多弯路。开始我是用的是模拟器来操作的,因为模拟器没有指定Ip还必须通过端口的映射来完成,好不容易把端口映射弄好了,他两台模拟器都用端口映射好像不太合适,因为在测试的时候模拟器自己使用的端口是同一个,问题比较多。我失败了很多次,后来直接使用真机测试,通过借助WIFI,还的感谢我同事提供自己的设备测试。这步需要注意的是Android手机开启一个端口的时候其中有一个堵塞的方法我们最好放在线程中来开启,接受数据后我们不能再接线程中更新界面的数据,这是android中比较头疼的位置。我们还需要通过线程帮助类来完成。
四.数据共享的思路。
手机数据发动端(连接指定的ip端);开启一个线程来发送数据,因为在android中直接发送会导致主线程出现很多问题。
手机接受数据端(也就是开启端口等待接受数据的设备)。可以一个线程来接受数据,接受到数据之后通过handler来跟新手机上的显示的画面。
android 通过wifi 热点实现手机摄像头数据共享(转)的更多相关文章
- [转载]Windows 7笔记本创建wifi热点供手机上网教程
用智能手机的朋友会发现这样一个问题,智能手机比普通手机上网更耗流量.这是因为智能手机应用(软件)丰富,而且大部分应用都会自动联网.为此,许多人每月包了上百M的流量套餐,但用的时候还是小心翼翼,生怕流量 ...
- Windows Win7建立wifi热点,手机共享WIFI上网
Win7建立wifi热点,手机共享wifi上网 by:授客 QQ:1033553122 1.以管理员身份运行命令提示符:快捷键win+R→输入cmd→回车 2.启用并设定虚拟WiFi网卡:运行命令:n ...
- Windows 7笔记本创建wifi热点供手机上网教程
Windows 7笔记本创建wifi热点供手机上网教程 | 浏览:60606 | 更新:2012-07-19 11:48 | 标签:笔记本 wifi 1 2 3 4 5 6 7 分步阅读 用智能手机的 ...
- win7系统用笔记本共享wifi热点 让手机免费上网
之前一直在用这个方法把自己的笔记本变成一个wifi热点,让手机也可以直接连wifi上网,节省网费和路由器购买费. 其实就是开启了windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP ...
- (转)将win7电脑无线网变身WiFi热点,让手机、笔记本共享上网
将win7电脑变身WiFi热点,让手机.笔记本共享上网 功能:开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网,节省网费和路由器 ...
- [Ubuntu 14.04] 创建可以用于Android的WIFI热点
Ubuntu的网络管理为创建Wifi热点提供了方便,可是因为它用了ad-hoc网络,所以其创建的Wifi又不能让Android系统使用.这篇文字就是为了解决这个问题 1.Install AP-Host ...
- 将win7电脑无线网变身WiFi热点,让手机、笔记本共享上网
开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网,节省网费和路由器购买费.宏碁.惠普笔记本和诺基亚N97mini亲测通过. 以操 ...
- XP系统下建立WIFI热点让手机、电脑能上网
http://wenku.baidu.com/view/372c5b1fa300a6c30c229f42.html 这里记录xp系统下建立共享无线网络连接,若是支持手机设备上的话,网络适配器必须是wi ...
- 使用Ubuntu12.04创建无线WiFi热点供手机上网
[日期:2012-10-10] 1,单击右上角网络连接管理器(记得打开电脑的无线网络开关),选择“编辑连接…” 2,选择无线,然后单击添加. 3,{无线}输入连接名称,如longer,然后 ...
随机推荐
- JAVA动态代理详解
1.什么是代理 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 2.什么是动态代理 在程 ...
- 【转】使用gulp 进行ES6开发
原谅地址:https://segmentfault.com/a/1190000004394726 一说起ES6,总会顺带看到webpack.babel.browserify还有一些认都不认识的blab ...
- USER-AGENT是什么
USER-AGENT是什么? USER-AGENT:记录请求所来自的浏览器. User-Agent分析网站 http://www.useragentstring.com/ 通过解析User-Agent ...
- Developing Backbone.js Applications
https://addyosmani.com/backbone-fundamentals/
- zabbix Lack of free swap space
Zabbix初始设计是大型公司用于监控服务器集群的,但日常中也用于监控VPS或云主机.后者情况下Zabbix的很多配置和属性就没有经过优化,取决于监控的对象和用途,经常需要对一些Zabbix配置进行调 ...
- USB的八个问题和答案(转)
http://www.amobbs.com/thread-901041-1-1.html 问题一:USB的传输线结构是如何的呢? 答案一:一条USB的传输线分别由地线.电源线.D+.D-四条线构成,D ...
- angular 实现modal windows效果(即模态窗口,半透明的遮罩层),以及bootstrap(css,components,js)的初步学习
废话不说,直接上代码.可直接看效果,对着分析..今天算是bootstrap 入门了,开心.. 突然居然很多事情就是那样,不要太多的畏惧,迈出第一步其实就成功了一半了. <html ng-app= ...
- Struts1.x教程:配置文件总结
要想使用Struts,至少要依靠两个配置文件:web.xml和struts-config.xml.其中web.xml用来安装Struts框架.而struts-config.xml用来配置在Struts ...
- 分析UIWindow
转载自:http://www.cnblogs.com/YouXianMing/p/3811741.html The UIWindow class defines an object known as ...
- 用Java开源项目JOONE实现人工智能编程
http://www.robotsky.com/ZhiN/MoS/2011-08-25/13142461416649.html 用Java开源项目JOONE实现人工智能编程 https://sourc ...