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. }

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

最新文章

  1. .net MVC中异常日志
  2. 剑指Offer面试题:26.字符串的排列
  3. C#继承里的【就近原则】
  4. .NET Remoting获取配置通道:
  5. xp 安装 win7 64
  6. mysql 日期
  7. Agile.Net 组件式开发平台 - 权限管理组件
  8. 【HDOJ】2844 Coins
  9. 10、SQL Server 内置函数、临时对象、流程控制
  10. nvl与 is not null的区别等
  11. 负载均衡探测器lbd
  12. [BZOJ]1045 糖果传递(HAOI2008)
  13. Gradle 学习一
  14. 操作dom影响性能的原因
  15. Java设计模式之二 ----- 工厂模式
  16. vue系列之webpack
  17. centos 下卸载mysql
  18. MySQL双主.md
  19. Android LazyList 从网络获取图片并缓存
  20. PowerShell管理SCOM_批量设置维护模式(上 )

热门文章

  1. MVC入门——编辑页
  2. 【BZOJ3218】a + b Problem 可持久化线段树优化建图
  3. EasyDarwin开源流媒体云平台之语音对讲功能设计与实现
  4. spring 过滤器简介
  5. SQuirreL – Phoenix的GUI
  6. webstrom编辑react语法报错解决
  7. 九度OJ 1117:整数奇偶排序 (排序)
  8. js 链接传入中文参数乱码解决
  9. object-c中的assign,retain,copy,atomic,nonatomic,readonly,readwrite以及strong,weak
  10. php mcrypt加密实例