通过socket通信,在电脑端控制手机拍照,并将照片发回电脑端,今早买了 google ioio(好贵安卓 <wbr>socket通信 <wbr> <wbr>远程调用摄像头拍照)和小车底座,等ioio和底座到了,就可以组合起来了,将手机安放在小车上,通过ioio控制小车运动,远程调用相机拍照并返回照片,想想应该挺好玩的。

今天花了一下午时间先试着写了一下远程调用摄像头拍照的程序
手机端:
package com.zyf.video;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.app.Activity;
import android.content.Context;
public class MainActivity extends Activity {
SurfaceView video_sv;
Button start_bt;
Camera camera;
SurfaceHolder surfaceHolder;
boolean isPreview;
ServerSocket ser_socket;
Socket cli_socket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
video_sv = (SurfaceView) findViewById(R.id.video_sv);
start_bt = (Button) findViewById(R.id.start_bt);
surfaceHolder=video_sv.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceHolder.addCallback(new Callback(){
public void surfaceCreated(SurfaceHolder holder) {
camera=Camera.open();
// WindowManager wm=(WindowManager)getSystemService(Context.WINDOW_SERVICE);
// Display display=wm.getDefaultDisplay();
// Parameters para=camera.getParameters();
// para.setPreviewFormat(PixelFormat.JPEG);
// para.setPreviewFrameRate(3);
// para.setPictureSize(display.getWidth(),display.getHeight());
// para.setJpegQuality(80);
// camera.setParameters(para);
try {
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
isPreview=true;
} catch (IOException e) {
e.printStackTrace();
}
}
public void surfaceChanged(SurfaceHolder holder, int format,int width, int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
if(camera!=null)
{
if(isPreview)
{
camera.stopPreview();
camera.release();
}
}
}
});
}
public void startSocket(View v)
{
ServerThread st=new ServerThread();
st.start();
}
class ServerThread extends Thread
{
public void run()
{
try {
ser_socket=new ServerSocket(6000);
} catch (IOException e) {
e.printStackTrace();
}
while (true)
try {  
cli_socket = ser_socket.accept(); 
Log.e("接受连接","accept"); 
BufferedReader in = new BufferedReader(new InputStreamReader(cli_socket.getInputStream())); 
String str ="";
String temp;
while((temp=in.readLine())!=null)
{
str=str+temp;
Log.e("收到数据",temp);
if(temp.equals("发送数据"))
{
takePic();
}
}
catch (Exception e) 
{  
e.printStackTrace(); 
finally
try 
{
cli_socket.close();
catch (IOException e) 
{
e.printStackTrace();
}
public void takePic() {
ShutterCallback mShutterCallback = new ShutterCallback()   
   {  
       public void onShutter() {    
           Log.i("开始拍照", "myShutterCallback:onShutter...");  
       }  
   };  
   PictureCallback mRawCallback = new PictureCallback()   
   {  
 
       public void onPictureTaken(byte[] data, Camera camera) {  
           Log.i("正在拍照", "myRawCallback:onPictureTaken...");  
       }  
   };  
   PictureCallback mJpegPictureCallback = new PictureCallback()   
   {  
       public void onPictureTaken(byte[] data, Camera camera) {  
           Log.i("拍照", "myJpegCallback:onPictureTaken...");  
           Bitmap b = null;  
           if(null != data){  
               b = BitmapFactory.decodeByteArray(data, 0, data.length);//data是字节数据,将其解析成位图  
               camera.stopPreview();  
               isPreview= false;
               try {
                Socket send_socket=new Socket(cli_socket.getInetAddress(),6001);
                Log.d("创建发送socket","创建发送socket");
                OutputStream os=send_socket.getOutputStream();
                DataOutputStream writer=new DataOutputStream(os);
                ByteArrayOutputStream baos=new ByteArrayOutputStream();
                b.compress(Bitmap.CompressFormat.JPEG,50,baos);
                writer.write(baos.toByteArray(),0,baos.toByteArray().length);
               
                writer.flush();
                os.flush();
                os.close();
                writer.close();
                Log.d("发送完毕","发送完毕");
                send_socket.close();
               
    } catch (IOException e) {
    e.printStackTrace();
    }
               
           }  
           camera.startPreview();  
           isPreview = true;  
       }  
   };
   camera.takePicture(mShutterCallback,mRawCallback, mJpegPictureCallback);
}
}
 电脑端:
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Test {
public static void main(String[] args){
Thread serverThread = new Thread(new Server()); 
serverThread.start();
try {
Socket so=new Socket("192.168.43.233",6000);
PrintStream output = new PrintStream(so.getOutputStream(), true, "utf-8");
output.print("发送数据");
output.flush();
so.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server implements Runnable{
public void run() {
try { 
//创建ServerSocket 
ServerSocket serverSocket = new ServerSocket(6001); 
while (true) { 
//接受客户端请求 
Socket client = serverSocket.accept(); 
System.out.println("accept"); 
try { 
//接收客户端消息 
//BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
//String str = in.readLine(); 
//System.out.println("read:" + str); 
//向服务器发送消息 
//PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(client.getOutputStream())),true); 
//out.println("server message"); 
//关闭流 
//out.close(); 
//in.close();
InputStream is=client.getInputStream();
int bytesRead = 0;
byte[] buffer=new byte[1024];
File f=new File("C:\\Users\\Administrator\\Desktop\\m.jpg");
OutputStream fos=new FileOutputStream(f);
while((bytesRead=is.read(buffer,0,1024))!=-1)
{
fos.write(buffer,0,bytesRead);
System.out.println(new String(buffer));
}
fos.close();
} catch (Exception e) { 
System.out.println(e.getMessage()); 
e.printStackTrace(); 
} finally { 
//关闭 
client.close(); 
System.out.println("close"); 
} catch (Exception e) { 
System.out.println(e.getMessage()); 
}
}