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. MVC入门——删除页

    添加Action DeleteUserInfo using System; using System.Collections.Generic; using System.Linq; using Sys ...

  2. pygame 安装教程

    步骤: 1.去官网下载PyGame 注意:要下载对应版本的包 官网地址:http://www.pygame.org/download.shtml 其中,如果python为以下版本: python 3. ...

  3. 【BZOJ4953】lydsy七月月赛 F DP

    [BZOJ4953]lydsy七月月赛 F 题面 题解:设f[i][j]表示第i个强度取为j时的最小误差.那么每次转移时,我们只计算j'和j之间的像素点带来的误差,于是有: $f[i][j]=min( ...

  4. 九度OJ 1110:小白鼠排队 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1734 解决:1054 题目描述: N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的 ...

  5. opencv中的子库

    1 FLANN 近似最近邻库,NN就是nearest neighbor的缩写. 2 IlmImf Ilm是Industrial light & magic公司的缩写. Imf是image fo ...

  6. AbstractFactory Pattern

    AbstractFactory模式用来解决这类问题:要创建一组相关或者相互依赖的对象. AbstractFactory Pattern结构图 实现: #ifndef _PRODUCT_H_ #defi ...

  7. SOAP Only Authentication Using C#

                Jason Lattimer's Blog                 Monday, February 9, 2015 SOAP Only Authentication ...

  8. 谷歌浏览器使用SelectorGadget和Xpath Helper获取xpath和css path

    在上篇文章里,介绍了如何在火狐浏览器中获取网页元素的xpath和css path. 这篇文章将介绍,在谷歌浏览器中使用SelectorGadget和Xpath Helper实现同样功能. 这两个谷歌浏 ...

  9. 远程请求json数据,list中显示

    public class MainActivity extends Activity { protected static final int WHAT_REQUEST_SUCCESS = 1; pr ...

  10. [HTML & CSS] HTML和CSS基础知识

    最近将博客简单地修饰了下,需要用到HTML和CSS代码,花了一天时间学习了一下这两方面的知识.虽然内容很简单,但是足够用来修改自己的博客了. 1. HTML 1.1. HTML介绍 HTML与CSS的 ...