http://blog.csdn.net/csh159/article/details/7926654/

GetIP:

  1. package com.zte.camera_socket;
  2. import android.app.Activity;
  3. import android.app.AlertDialog;
  4. import android.app.AlertDialog.Builder;
  5. import android.content.DialogInterface;
  6. import android.content.DialogInterface.OnClickListener;
  7. import android.content.Intent;
  8. import android.os.Bundle;
  9. import android.view.Window;
  10. import android.view.WindowManager;
  11. import android.widget.EditText;
  12. import android.widget.TableLayout;
  13. public class GetIP extends Activity {
  14. String ipname = null;
  15. @Override
  16. public void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. // 设置全屏
  19. requestWindowFeature(Window.FEATURE_NO_TITLE);
  20. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  21. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  22. setContentView(R.layout.main);
  23. final Builder builder = new AlertDialog.Builder(this); // 定义一个AlertDialog.Builder对象
  24. builder.setTitle("登录服务器对话框"); // 设置对话框的标题
  25. // 装载/res/layout/login.xml界面布局
  26. TableLayout loginForm = (TableLayout) getLayoutInflater().inflate(
  27. R.layout.login, null);
  28. final EditText iptext = (EditText) loginForm
  29. .findViewById(R.id.ipedittext);
  30. builder.setView(loginForm); // 设置对话框显示的View对象
  31. // 为对话框设置一个“登录”按钮
  32. builder.setPositiveButton("登录"
  33. // 为按钮设置监听器
  34. , new OnClickListener() {
  35. @Override
  36. public void onClick(DialogInterface dialog, int which) {
  37. // 此处可执行登录处理
  38. ipname = iptext.getText().toString().trim();
  39. Bundle data = new Bundle();
  40. data.putString("ipname", ipname);
  41. Intent intent = new Intent(GetIP.this,
  42. Camera_socket.class);
  43. intent.putExtras(data);
  44. startActivity(intent);
  45. }
  46. });
  47. // 为对话框设置一个“取消”按钮
  48. builder.setNegativeButton("取消", new OnClickListener() {
  49. @Override
  50. public void onClick(DialogInterface dialog, int which) {
  51. // 取消登录,不做任何事情。
  52. System.exit(1);
  53. }
  54. });
  55. // 创建、并显示对话框
  56. builder.create().show();
  57. }
  58. }
  1. package com.zte.camera_socket;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.OutputStream;
  6. import java.net.Socket;
  7. import android.app.Activity;
  8. import android.content.Intent;
  9. import android.graphics.ImageFormat;
  10. import android.graphics.Rect;
  11. import android.graphics.YuvImage;
  12. import android.hardware.Camera;
  13. import android.hardware.Camera.Size;
  14. import android.os.Bundle;
  15. import android.util.Log;
  16. import android.view.SurfaceHolder;
  17. import android.view.SurfaceHolder.Callback;
  18. import android.view.SurfaceView;
  19. import android.view.Window;
  20. import android.view.WindowManager;
  21. public class Camera_socket extends Activity {
  22. SurfaceView sView;
  23. SurfaceHolder surfaceHolder;
  24. int screenWidth, screenHeight;
  25. Camera camera; // 定义系统所用的照相机
  26. boolean isPreview = false; // 是否在浏览中
  27. private String ipname;
  28. @SuppressWarnings("deprecation")
  29. @Override
  30. public void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. // 设置全屏
  33. requestWindowFeature(Window.FEATURE_NO_TITLE);
  34. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  35. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  36. setContentView(R.layout.main);
  37. // 获取IP地址
  38. Intent intent = getIntent();
  39. Bundle data = intent.getExtras();
  40. ipname = data.getString("ipname");
  41. screenWidth = 640;
  42. screenHeight = 480;
  43. sView = (SurfaceView) findViewById(R.id.sView); // 获取界面中SurfaceView组件
  44. surfaceHolder = sView.getHolder(); // 获得SurfaceView的SurfaceHolder
  45. // 为surfaceHolder添加一个回调监听器
  46. surfaceHolder.addCallback(new Callback() {
  47. @Override
  48. public void surfaceChanged(SurfaceHolder holder, int format,
  49. int width, int height) {
  50. }
  51. @Override
  52. public void surfaceCreated(SurfaceHolder holder) {
  53. initCamera(); // 打开摄像头
  54. }
  55. @Override
  56. public void surfaceDestroyed(SurfaceHolder holder) {
  57. // 如果camera不为null ,释放摄像头
  58. if (camera != null) {
  59. if (isPreview)
  60. camera.stopPreview();
  61. camera.release();
  62. camera = null;
  63. }
  64. System.exit(0);
  65. }
  66. });
  67. // 设置该SurfaceView自己不维护缓冲
  68. surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  69. }
  70. private void initCamera() {
  71. if (!isPreview) {
  72. camera = Camera.open();
  73. }
  74. if (camera != null && !isPreview) {
  75. try {
  76. Camera.Parameters parameters = camera.getParameters();
  77. parameters.setPreviewSize(screenWidth, screenHeight); // 设置预览照片的大小
  78. parameters.setPreviewFpsRange(20, 30); // 每秒显示20~30帧
  79. parameters.setPictureFormat(ImageFormat.NV21); // 设置图片格式
  80. parameters.setPictureSize(screenWidth, screenHeight); // 设置照片的大小
  81. // camera.setParameters(parameters); // android2.3.3以后不需要此行代码
  82. camera.setPreviewDisplay(surfaceHolder); // 通过SurfaceView显示取景画面
  83. camera.setPreviewCallback(new StreamIt(ipname)); // 设置回调的类
  84. camera.startPreview(); // 开始预览
  85. camera.autoFocus(null); // 自动对焦
  86. } catch (Exception e) {
  87. e.printStackTrace();
  88. }
  89. isPreview = true;
  90. }
  91. }
  92. }
  93. class StreamIt implements Camera.PreviewCallback {
  94. private String ipname;
  95. public StreamIt(String ipname) {
  96. this.ipname = ipname;
  97. }
  98. @Override
  99. public void onPreviewFrame(byte[] data, Camera camera) {
  100. Size size = camera.getParameters().getPreviewSize();
  101. try {
  102. // 调用image.compressToJpeg()将YUV格式图像数据data转为jpg格式
  103. YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width,
  104. size.height, null);
  105. if (image != null) {
  106. ByteArrayOutputStream outstream = new ByteArrayOutputStream();
  107. image.compressToJpeg(new Rect(0, 0, size.width, size.height),
  108. 80, outstream);
  109. outstream.flush();
  110. // 启用线程将图像数据发送出去
  111. Thread th = new MyThread(outstream, ipname);
  112. th.start();
  113. }
  114. } catch (Exception ex) {
  115. Log.e("Sys", "Error:" + ex.getMessage());
  116. }
  117. }
  118. }
  119. class MyThread extends Thread {
  120. private byte byteBuffer[] = new byte[1024];
  121. private OutputStream outsocket;
  122. private ByteArrayOutputStream myoutputstream;
  123. private String ipname;
  124. public MyThread(ByteArrayOutputStream myoutputstream, String ipname) {
  125. this.myoutputstream = myoutputstream;
  126. this.ipname = ipname;
  127. try {
  128. myoutputstream.close();
  129. } catch (IOException e) {
  130. e.printStackTrace();
  131. }
  132. }
  133. public void run() {
  134. try {
  135. // 将图像数据通过Socket发送出去
  136. Socket tempSocket = new Socket(ipname, 6000);
  137. outsocket = tempSocket.getOutputStream();
  138. ByteArrayInputStream inputstream = new ByteArrayInputStream(
  139. myoutputstream.toByteArray());
  140. int amount;
  141. while ((amount = inputstream.read(byteBuffer)) != -1) {
  142. outsocket.write(byteBuffer, 0, amount);
  143. }
  144. myoutputstream.flush();
  145. myoutputstream.close();
  146. tempSocket.close();
  147. } catch (IOException e) {
  148. e.printStackTrace();
  149. }
  150. }
  151. }

xml:

login.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/loginForm"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:orientation="vertical" >
  7. <TableRow>
  8. <TextView
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="IP:"
  12. android:textSize="10pt" />
  13. <!-- 输入用户名的文本框 -->
  14. <EditText
  15. android:id="@+id/ipedittext"
  16. android:layout_width="fill_parent"
  17. android:layout_height="wrap_content"
  18. android:digits="0123456789."
  19. android:hint="请填写服务器IP"
  20. android:selectAllOnFocus="true" />
  21. </TableRow>
  22. </TableLayout>

main.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <SurfaceView
  7. android:id="@+id/sView"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:scaleType="fitCenter" />
  11. </LinearLayout>

PC端:

  1. import java.awt.Dimension;
  2. import java.awt.Graphics;
  3. import java.awt.Image;
  4. import java.awt.Toolkit;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.io.File;
  8. import java.io.FileNotFoundException;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11. import java.io.RandomAccessFile;
  12. import java.net.ServerSocket;
  13. import java.net.Socket;
  14. import javax.imageio.ImageIO;
  15. import javax.swing.JButton;
  16. import javax.swing.JFileChooser;
  17. import javax.swing.JFrame;
  18. import javax.swing.JPanel;
  19. public class pc {
  20. public static ServerSocket ss = null;
  21. public static void main(String args[]) throws IOException {
  22. ss = new ServerSocket(6000);
  23. final ImageFrame frame = new ImageFrame(ss);
  24. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  25. frame.setVisible(true);
  26. while (true) {
  27. frame.panel.getimage();
  28. frame.repaint();
  29. }
  30. }
  31. }
  32. /**
  33. * A frame with an image panel
  34. */
  35. @SuppressWarnings("serial")
  36. class ImageFrame extends JFrame {
  37. public ImagePanel panel;
  38. public JButton jb;
  39. public ImageFrame(ServerSocket ss) {
  40. // get screen dimensions
  41. Toolkit kit = Toolkit.getDefaultToolkit();
  42. Dimension screenSize = kit.getScreenSize();
  43. int screenHeight = screenSize.height;
  44. int screenWidth = screenSize.width;
  45. // center frame in screen
  46. setTitle("ImageTest");
  47. setLocation((screenWidth - DEFAULT_WIDTH) / 2,
  48. (screenHeight - DEFAULT_HEIGHT) / 2);
  49. setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
  50. // add panel to frame
  51. this.getContentPane().setLayout(null);
  52. panel = new ImagePanel(ss);
  53. panel.setSize(640, 480);
  54. panel.setLocation(0, 0);
  55. add(panel);
  56. jb = new JButton("拍照");
  57. jb.setBounds(0, 480, 640, 50);
  58. add(jb);
  59. saveimage saveaction = new saveimage(ss);
  60. jb.addActionListener(saveaction);
  61. }
  62. public static final int DEFAULT_WIDTH = 640;
  63. public static final int DEFAULT_HEIGHT = 560;
  64. }
  65. /**
  66. * A panel that displays a tiled image
  67. */
  68. @SuppressWarnings("serial")
  69. class ImagePanel extends JPanel {
  70. private ServerSocket ss;
  71. private Image image;
  72. private InputStream ins;
  73. public ImagePanel(ServerSocket ss) {
  74. this.ss = ss;
  75. }
  76. public void getimage() throws IOException {
  77. Socket s = this.ss.accept();
  78. System.out.println("连接成功!");
  79. this.ins = s.getInputStream();
  80. this.image = ImageIO.read(ins);
  81. this.ins.close();
  82. }
  83. public void paintComponent(Graphics g) {
  84. super.paintComponent(g);
  85. if (image == null)
  86. return;
  87. g.drawImage(image, 0, 0, null);
  88. }
  89. }
  90. class saveimage implements ActionListener {
  91. RandomAccessFile inFile = null;
  92. byte byteBuffer[] = new byte[1024];
  93. InputStream ins;
  94. private ServerSocket ss;
  95. public saveimage(ServerSocket ss) {
  96. this.ss = ss;
  97. }
  98. public void actionPerformed(ActionEvent event) {
  99. try {
  100. Socket s = ss.accept();
  101. ins = s.getInputStream();
  102. // 文件选择器以当前的目录打开
  103. JFileChooser jfc = new JFileChooser(".");
  104. jfc.showSaveDialog(new javax.swing.JFrame());
  105. // 获取当前的选择文件引用
  106. File savedFile = jfc.getSelectedFile();
  107. // 已经选择了文件
  108. if (savedFile != null) {
  109. // 读取文件的数据,可以每次以快的方式读取数据
  110. try {
  111. inFile = new RandomAccessFile(savedFile, "rw");
  112. } catch (FileNotFoundException e) {
  113. e.printStackTrace();
  114. }
  115. }
  116. int amount;
  117. while ((amount = ins.read(byteBuffer)) != -1) {
  118. inFile.write(byteBuffer, 0, amount);
  119. }
  120. inFile.close();
  121. ins.close();
  122. s.close();
  123. javax.swing.JOptionPane.showMessageDialog(new javax.swing.JFrame(),
  124. "已接保存成功", "提示!", javax.swing.JOptionPane.PLAIN_MESSAGE);
  125. } catch (IOException e) {
  126. e.printStackTrace();
  127. }
  128. }
  129. }

下面是在虚拟机上测试的效果:

android通过获取摄像头照片,实时与点传输的更多相关文章

  1. Android OCR文字识别 实时扫描手机号(极速扫描单行文本方案)

    身份证识别:https://github.com/wenchaosong/OCR_identify 遇到一个需求,要用手机扫描纸质面单,获取面单上的手机号,最后决定用tesseract这个开源OCR库 ...

  2. ORB-SLAM2 运行 —— ROS + Android 手机摄像头

    转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12404730.html 本文要点: ROS 配置安装 解决 sud ...

  3. Android手机摄像头编程入门

    本讲内容:Android手机摄像头编程入门智能手机中的摄像头和普通手机中的摄像头最大的区别在于,智能机上的摄像头可以由程序员写程序控制, 做一些有趣的应用譬如,画中画,做一些有用的应用譬如二维码识别, ...

  4. android基础---->摄像头与相册的调用

    很多应用程序都可能会使用到调用摄像头拍照和从相册选取图片的功能,今天我们开始android中摄像头与相册调用的学习. 目录导航 调用摄像头拍照 从相册中选择照片 友情链接 调用摄像头拍照 大致流程:调 ...

  5. Android 调用摄像头功能【拍照与视频】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ma_hoking/article/details/28292973 应用场景: 在Android开发 ...

  6. DSO 运行 —— dso_ros + Android 手机摄像头

    转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12425855.html 本文要点: dso 配置安装 dso 离线 ...

  7. 引人遐想,用 Python 获取你想要的 “某个人” 摄像头照片

    仅用来学习,希望给你们有提供到学习上的作用. 1.安装库 需要安装python3.5以上版本,在官网下载即可.然后安装库opencv-python,安装方式为打开终端输入命令行. 2.更改收件人和发件 ...

  8. TVideoGrabber如何将网络摄像头影像实时发布到网络

    在TVideoGrabber中如何将网络摄像头影像实时发布到网络?如何设置正在运行TVideoGrabber的一台电脑,同时通过另一台电脑在网络中实时的观看在线视频呢? 在这里称发送视频流的电脑为“m ...

  9. Android和WCF通信 - 大数据压缩后传输

    Android和WCF通信 - 大数据压缩后传输 本帖来源:http://www.cnblogs.com/lykbk/archive/2013/08/15/3259045.html 最近一直在优化项目 ...

随机推荐

  1. 【Web探索之旅】第三部分第一课:server

    wx_fmt=jpeg" alt="0? wx_fmt=jpeg" style="height:auto"> 内容简单介绍 .第三部分第一课:s ...

  2. photoswipe 实现图片的单击放大

    1.项目结构 2.HTML 代码 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=&qu ...

  3. 无法启动FTP站点,服务目前停止

    在本地搭建了一个FTP服务器(windows搭建FTP服务器实战),再启动的时候提示错误: 错误提示信息: 根据提示可以查出问题原因:FTP服务没有开启 启动服务,再次重启站点服务.一切OK. 亲测好 ...

  4. appium(5)-Appium capabilities

    Appium Capabilities Appium server capabilities Capability Description Values automationName Which au ...

  5. WebDriver API——延时操作及元素等待

    在自动化测试过程当中,受网络.测试设备等诸多因素的影响,我们经常需要在自动化测试脚本中添加一些延时来更好的定位元素来进行一系列的操作. 一般有这么几种方式: 1.implicitlyWait.识别对象 ...

  6. haproxy官方配置文档地址

    http://cbonte.github.io/haproxy-dconv/1.6/configuration.html#4-option%20http-keep-alive

  7. mongodb压缩——snappy、zlib块压缩,btree索引前缀压缩

    MongoDB 3.0 WiredTiger Compression and Performance One of the most exciting developments over the li ...

  8. yii表单的各种验证

    /验证规则详细配置 public function rules() { // NOTE: you should only define rules for those attributes that ...

  9. 异步执行js脚本——防止阻塞

    JS允许我们修改页面中的所有方面:内容,样式和用户进行交互时的行为. 但是js同样可以阻塞DOM树的形成并且延迟页面的渲染. 让你的js变成异步执行,并且减少不必要的js文件从而提高性能. JavaS ...

  10. C#继承与多态

    继承:在程序中,如果一个类A:类B,这种机制就是继承. 子类可以继承父类的所有内容(成员)吗? 解析: 1.私有成员(属性和方法) 2.构造函数 3.final修饰过的方法,子类不能进行重写 //SE ...