2012. 9. 14. 11:56

Androidのカメラを使用したかったのでサンプルプログラムを書いてみた.

ついでに,取得した画像をPCにソケットで転送しPCのディスプレイ上で表示した.




以下,プログラム.
カメラ画像の取得については,↓のサイトを参考にした.
Androidメモ

画像の解像度は,デフォルトサイズでは,2048×1536(1M~1.2M)となり,転送に時間がかかったので,480×320に変更した.

[Android側-CameraTest.java]

  1. package com.blogspot.ayakix_lablog.camera;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.view.Window;  
  5. import android.view.WindowManager;  
  6.   
  7. public class CameraTest extends Activity {  
  8.  /** Called when the activity is first created. */  
  9.  @Override  
  10.  public void onCreate(Bundle savedInstanceState) {  
  11.   super.onCreate(savedInstanceState);  
  12.   requestWindowFeature(Window.FEATURE_NO_TITLE);  
  13.   setContentView(new CameraView(this));  
  14.   getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  15.  }  
  16. }  


[Android側-CameraView.java]
  1. package com.blogspot.ayakix_lablog.camera;  
  2. import android.content.Context;  
  3. import android.graphics.PixelFormat;  
  4. import android.hardware.Camera;  
  5. import android.view.MotionEvent;  
  6. import android.view.SurfaceHolder;  
  7. import android.view.SurfaceView;  
  8. import java.io.BufferedOutputStream;  
  9. import java.net.Socket;  
  10.   
  11. public class CameraView extends SurfaceView implements SurfaceHolder.Callback {  
  12.  private SurfaceHolder holder; //ホルダー  
  13.  private Camera camera; //カメラ  
  14.  private static final int WIDTH  = 480;  
  15.  private static final int HEIGHT = 320;  
  16.  private static final int PORT = 4680;  
  17.  private static final String IP_ADDR = "1.1.1.1"// IPアドレス  
  18.   
  19.  public CameraView(Context context) {  
  20.   super(context);  
  21.   // サーフェイスホルダーの生成  
  22.   holder=getHolder();  
  23.   holder.addCallback(this);  
  24.   //プッシュバッッファの指定  
  25.   holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  26.  }  
  27.   
  28.  public void surfaceCreated(SurfaceHolder holder) {  
  29.   // カメラの初期化  
  30.   try {  
  31.    camera=Camera.open();  
  32.    camera.setPreviewDisplay(holder);  
  33.   } catch (Exception e) {  
  34.   }  
  35.  }  
  36.   
  37.  public void surfaceChanged(SurfaceHolder holder,int format,int w,int h) {  
  38.   // カメラのプレビュー開始  
  39.   Camera.Parameters parameters=camera.getParameters();  
  40.   parameters.setPictureSize(WIDTH, HEIGHT);  
  41.   parameters.setPreviewFormat(PixelFormat.JPEG);  
  42.   camera.setParameters(parameters);  
  43.   camera.startPreview();  
  44.  }  
  45.   
  46.  public void surfaceDestroyed(SurfaceHolder holder) {  
  47.   // カメラのプレビュー停止  
  48.   camera.setPreviewCallback(null);  
  49.   camera.stopPreview();  
  50.   camera.release();  
  51.   camera=null;  
  52.  }  
  53.   
  54.  @Override  
  55.  public boolean onTouchEvent(MotionEvent event) {  
  56.   if (event.getAction()==MotionEvent.ACTION_DOWN) {  
  57.    takePicture();  
  58.    camera.startPreview();  
  59.   }  
  60.   return true;  
  61.  }  
  62.   
  63.  public void takePicture() {  
  64.   // カメラのスクリーンショットの取得  
  65.   camera.takePicture(nullnull,new Camera.PictureCallback() {  
  66.    public void onPictureTaken(byte[] data,Camera camera) {  
  67.     sendData(getContext(), data);  
  68.    }  
  69.   });  
  70.  }  
  71.   
  72.  private void sendData(Context context, byte[] data){  
  73.   // ソケットの作成  
  74.   Socket socket;  
  75.   BufferedOutputStream out;  
  76.   try{  
  77.    socket = new Socket(IP_ADDR, PORT);  
  78.    out = new BufferedOutputStream(socket.getOutputStream());  
  79.    out.write(data);  
  80.    if(out != null) out.close();  
  81.    if(socket != null) socket.close();  
  82.   } catch (Exception ex){  
  83.    ex.printStackTrace();  
  84.   }  
  85.  }  
  86. }  


[Android側-AndroidManifest.xml]
  1. <manifest versioncode="1" versionname="1.0" package="com.blogspot.ayakix_lablog.camera" android="http://schemas.android.com/apk/res/android">  
  2. <application icon="@drawable/icon" label="@string/app_name">  
  3.  <activity label="@string/app_name" name=".CameraTest" android:screenorientation="landscape">  
  4.   <intent-filter>  
  5.                  <action name="android.intent.action.MAIN">  
  6.                   <category name="android.intent.category.LAUNCHER"></category>  
  7.           </action>  
  8.       </intent-filter>  
  9.       <uses-permission name="android.permission.CAMERA"></uses-permission>  
  10.       <uses-permission name="android.permission.INTERNET"></uses-permission>  
  11.  </activity>  
  12. </application>  
  13. </manifest>  


[PC側-Main.java]
  1. import java.io.*;  
  2. import java.net.*;  
  3.   
  4. public class Main {  
  5.  private static final int PORT = 4680;  
  6.   
  7.  public static void main(String argv[]) {  
  8.   System.out.println("サーバ起動");  
  9.   int num = 0;  
  10.   ServerSocket serverSocket = null;  
  11.   while(true){  
  12.    try {  
  13.     // サーバーソケットの生成  
  14.     if(serverSocket == null) serverSocket = new ServerSocket(PORT);  
  15.     // クライアントからの接続を待ちます  
  16.     Socket socket = serverSocket.accept();  
  17.     BufferedOutputStream out = new BufferedOutputStream(  
  18.        new FileOutputStream(new File(num + ".jpg")));  
  19.     // 入力ストリームを取得  
  20.     BufferedInputStream in = new BufferedInputStream(socket.getInputStream());  
  21.     byte[] buf = new byte[1024];  
  22.     int len;  
  23.     while((len=in.read(buf))!=-1){  
  24.      out.write(buf, 0, len);  
  25.     }  
  26.     // GUIで画像を表示  
  27.     new GUIExe(num);  
  28.     // 入出力ストリームを閉じる  
  29.     out.flush();  
  30.     out.close();  
  31.     in.close();  
  32.     System.out.println("done");  
  33.     // ソケットを閉じる  
  34.     socket.close();  
  35.     num++;  
  36.    } catch(Exception e) {  
  37.     e.printStackTrace();  
  38.    }  
  39.   }  
  40.  }  
  41. }  
  42.   
  43. class GUIExe extends Thread {  
  44.  private int num;  
  45.    
  46.  public GUIExe(int num) {  
  47.   this.num = num;  
  48.   this.start();  
  49.   // スレッド開始  
  50.  }  
  51.  public void run() {  
  52.   new GUI(num);  
  53.  }  
  54. }  


[PC側-GUI.java]
  1. import java.awt.Graphics;  
  2. import java.awt.Graphics2D;  
  3. import java.awt.event.WindowAdapter;  
  4. import java.awt.event.WindowEvent;  
  5. import java.awt.image.BufferedImage;  
  6. import java.io.File;  
  7. import javax.imageio.ImageIO;  
  8. import javax.swing.JFrame;  
  9.   
  10. public class GUI extends JFrame {  
  11.  private int num;  
  12.  private final int WIDTH  = 480;  
  13.  private final int HEIGHT = 320;  
  14.    
  15.  public GUI(int num){  
  16.   this.num = num;  
  17.   this.addWindowListener(new WindowAdapter(){  
  18.    public void windowClosing(WindowEvent e){  
  19.     System.exit(0);  
  20.    }  
  21.   });  
  22.   
  23.   this.setBounds(00, WIDTH, HEIGHT);  
  24.   this.setLocation(num/3*WIDTH, num%3*HEIGHT);  
  25.   this.setUndecorated(true);  
  26.   this.setVisible(true);  
  27.  }  
  28.   
  29.  public void paint(Graphics g){  
  30.   Graphics2D g2 = (Graphics2D)g;  
  31.   BufferedImage readImage = null;  
  32.   try {  
  33.    readImage = ImageIO.read(new File(num + ".jpg"));  
  34.   } catch (Exception e) {  
  35.    e.printStackTrace();  
  36.    readImage = null;  
  37.   }  
  38.   if (readImage != null){  
  39.    g2.drawImage(readImage, 00, WIDTH, HEIGHT, this);  
  40.   }  
  41.  }  
  42. }  

Posted by k1rha