ラベル カメラ の投稿を表示しています。 すべての投稿を表示
ラベル カメラ の投稿を表示しています。 すべての投稿を表示

2012年8月3日金曜日

カメラ映像をPCに転送するアプリ

Androidでカメラ画像を転送するアプリでソースコードが公開されているもの
sipdroid
http://code.google.com/p/sipdroid/

ipcamera-for-android
http://code.google.com/p/ipcamera-for-android/

spydroid-ipcamera
http://code.google.com/p/spydroid-ipcamera/

SmartLab HTML5 Camera and Android


HTML5 Camera and Android とipcamera-for-android がシンプルで分かりやすい。


2012年3月10日土曜日

カメラ映像の録音・録画:Android

package com.camera_test0;

import java.io.File;

import java.io.IOException;
import java.util.List;

import android.os.Environment;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup.LayoutParams;

public class CameraTest0Activity extends Activity {
 /** Called when the activity is first created. */
 private Camera myCamera;
 private SurfaceView mySurfaceView;
 private boolean isRecording;
 private MediaRecorder mediaRecorder;
private SurfaceHolder v_holder;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  mySurfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
  SurfaceHolder holder = mySurfaceView.getHolder();
  holder.addCallback(mSurfaceListener);
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  myCamera = getCameraInstance();//

 }

 private SurfaceHolder.Callback mSurfaceListener = new SurfaceHolder.Callback() {

  public void surfaceCreated(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   
   try {
    myCamera.setPreviewDisplay(holder);
   } catch (Exception e) {
    e.printStackTrace();
   }
  }

  public void surfaceDestroyed(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   //myCamera.release();
   //myCamera = null;
   
   myCamera.setPreviewCallback(null);
   myCamera.stopPreview();
   myCamera.release();
   myCamera = null;
  }

  public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
   // TODO Auto-generated method stub
   v_holder = holder; // SurfaceHolderを保存
   
   myCamera.stopPreview();
    Camera.Parameters parameters = myCamera.getParameters();
    
   List<Size> asizeSupport = parameters.getSupportedPreviewSizes();
   //一番小さいプレビューサイズを利用
   Size size = asizeSupport.get(asizeSupport.size() - 1);
   parameters.setPreviewSize(size.width,size.height);
   Log.d("size1", "w=" + String.valueOf(width) + "h=" + String.valueOf(height));// 
   Log.d("size2", "w=" + String.valueOf(size.width) + "h=" + String.valueOf(size.height));// 
   
   LayoutParams paramLayout;
   paramLayout = mySurfaceView.getLayoutParams();
   paramLayout.width = size.width;
   paramLayout.height = size.height;
   mySurfaceView.setLayoutParams(paramLayout);
      // camera.setDisplayOrientation(90);// カメラを回転
      
      //List<Camera.Size> size = parameters.getSupportedPreviewSizes();
    
      //Log.d("カメラのサイズ", "w=" + String.valueOf(size.get(0).width) + "h=" + String.valueOf(size.get(0).height));// 
      //parameters.setPreviewSize(size.get(0).width, size.get(0).height);
     // myCamera.setParameters(parameters);
      myCamera.startPreview();//
  }
 };


 public void click(View v) {
  // 録画中でなければ録画を開始
  if (!isRecording) {
   initializeVideoSettings(); // MediaRecorderの設定
   // myRecorder.start(); // 録画開始
   isRecording = true; // 録画中のフラグを立てる

   // 録画中であれば録画を停止
  } else {
   mediaRecorder.stop(); // 録画停止
   mediaRecorder.reset(); // 無いとmediarecorder went away with unhandled
         // events が発生
   mediaRecorder.release();//
   mediaRecorder = null;
   //myCamera.lock();
   //myCamera.release(); // release the camera for other applications
   //myCamera = null;
   isRecording = false; // 録画中のフラグを外す
   
   
  }
 }


 private void initializeVideoSettings() {
  // TODO 自動生成されたメソッド・スタブ
  try {
   //myCamera = getCameraInstance();
   mediaRecorder = new MediaRecorder();
   //mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
   //mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
   
   myCamera.unlock();
   mediaRecorder.setCamera( myCamera );
   
   mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 録画の入力ソースを指定
   mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
   
   mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); // ファイルフォーマットを指定
   
   mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); // ビデオエンコーダを指定
   mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

   //CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
   //mediaRecorder.setProfile(profile);
   
   mediaRecorder.setVideoFrameRate(15); // 動画のフレームレートを指定
   mediaRecorder.setVideoSize(320, 240); // 動画のサイズを指定
   
   File folder = Environment.getExternalStorageDirectory();
   File file;

   file = File.createTempFile("sample20110603", ".mp4", folder);//

   //mFile = Environment.getExternalStorageDirectory().getAbsolutePath();

   mediaRecorder.setOutputFile(file.getAbsolutePath());
   mediaRecorder.setPreviewDisplay(v_holder.getSurface());//

   mediaRecorder.prepare();
   mediaRecorder.start();
  } catch (IOException e) {
   // TODO 自動生成された catch ブロック
   e.printStackTrace();
  }
 }
 private Camera getCameraInstance() {
  // TODO 自動生成されたメソッド・スタブ
   Camera c = null;
      try {
          c = Camera.open( 1 ); // attempt to get a Camera instance
      }
      catch (Exception e){
          // Camera is not available (in use or does not exist)
      }
      return c; // returns null if camera is unavailable
 }

}



参考サイト:
Androidで簡単なカメラアプリを作る
ソフトウェア技術ドキュメントを勝手に翻訳 c.3 カメラ

2012年1月6日金曜日

フロントカメラと背面カメラの同時表示

二つのカメラを同時に利用できるか、試してみました。
AVDでは利用できるようです。実機では試していません。


別に特別な事は必要ありませんでした。
以外に簡単でした。

package com.android.camera2;

import java.util.List;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class Android2CameraActivity extends Activity {
 private Camera camera;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  SurfaceView mySurfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
  SurfaceHolder holder = mySurfaceView.getHolder();
  holder.addCallback(mSurfaceListener);
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  SurfaceView mySurfaceView2 = (SurfaceView) findViewById(R.id.surfaceView2);
  SurfaceHolder holder2 = mySurfaceView2.getHolder();
  holder2.addCallback(mSurfaceListener2);
  holder2.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  
  // カメラの総数
  int numberOfCameras = Camera.getNumberOfCameras();
  Log.d("個数", String.valueOf(numberOfCameras));

 }

 private SurfaceHolder.Callback mSurfaceListener = new SurfaceHolder.Callback() {
  public void surfaceCreated(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   camera = Camera.open(0);
   try {
    camera.setPreviewDisplay(holder);
   } catch (Exception e) {
    e.printStackTrace();
    Log.d("エラー", "001" );
   }
  }

  public void surfaceDestroyed(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   camera.release();
   camera = null;
  }

  public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
   // TODO Auto-generated method stub
   Log.d("サーフェイスサイズ", "w=" + String.valueOf(width) + "h=" + height);// 320x180

   camera.stopPreview();

   // camera.setDisplayOrientation(90);// カメラを回転
   Camera.Parameters parameters = camera.getParameters();
   List<Camera.Size> size = parameters.getSupportedPreviewSizes();

   Log.d("カメラのサイズ", "w=" + String.valueOf(size.get(0).width) + "h="
     + String.valueOf(size.get(0).height));// 
   parameters.setPreviewSize(size.get(0).width, size.get(0).height);
   camera.setParameters(parameters);
   camera.startPreview();
  }
 };

 /*
  * 
  */
 private SurfaceHolder.Callback mSurfaceListener2 = new SurfaceHolder.Callback() {
  public void surfaceCreated(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   camera = Camera.open(1);
   try {
    camera.setPreviewDisplay(holder);
   } catch (Exception e) {
    e.printStackTrace();
    Log.d("エラー", "001" );
   }
  }

  public void surfaceDestroyed(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   camera.release();
   camera = null;
  }

  public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
   // TODO Auto-generated method stub
   Log.d("サーフェイスサイズ", "w=" + String.valueOf(width) + "h=" + height);

   camera.stopPreview();

   // camera.setDisplayOrientation(90);// カメラを回転
   Camera.Parameters parameters = camera.getParameters();
   List<Camera.Size> size = parameters.getSupportedPreviewSizes();

   Log.d("カメラのサイズ", "w=" + String.valueOf(size.get(0).width) + "h="
     + String.valueOf(size.get(0).height));// 
   parameters.setPreviewSize(size.get(0).width, size.get(0).height);
   camera.setParameters(parameters);
   camera.startPreview();
  }
 };


}

2011年12月18日日曜日

カメラで撮影した画像をメールで送る

JavaMailを利用してgoogleのGmailにメールを送る場合


package com.android;

import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.StrictMode;

public class AndroidTestActivity extends Activity {
 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Camera camera = Camera.open(0);//カメラを開く
        camera.takePicture(null, null, mPictureListener);
        
  setContentView(R.layout.main);
    }

 private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() {
  public void onPictureTaken(byte[] data, Camera camera) {
   // メールで画像を送る
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
         
         final String mUser = "kameji2000@gmail.com";
         final String mPassword = "xxxx";

         Properties props = new Properties();

         props.put("mail.smtp.host", "smtp.gmail.com");// SMTPサーバ名
         props.put("mail.smtp.port", "587"); // SMTPサーバポート
         props.put("mail.smtp.auth", "true");// smtp auth
         props.put("mail.smtp.starttls.enable", "true");// STTLS

         Session sess = Session.getInstance(props);

         MimeMessage mimeMsg = new MimeMessage(sess);
         
         try {

             mimeMsg.setFrom(new InternetAddress(mUser));//Fromアドレス
             mimeMsg.setRecipient(Message.RecipientType.TO, new InternetAddress(mUser));//送信先アドレス
             mimeMsg.setContent("body", "text/plain; utf-8");
       mimeMsg.setHeader("Content-Transfer-Encoding", "7bit");
       mimeMsg.setSubject("テスト送信");//件名
       //mimeMsg.setText("アンドロイドからの送信", "utf-8");//本文
       
       MimeBodyPart textPart = new MimeBodyPart();
       textPart.setText("アンドロイドからの送信", "utf-8");//本文
       
        //4, 画像ファイルを添付&設定  
             MimeBodyPart image = new MimeBodyPart();
             DataSource ds = new ByteArrayDataSource(data, "application/x-any");
             image.setDataHandler(new DataHandler(ds));
             image.setFileName("camera.jpg");
             
             MimeMultipart body = new MimeMultipart();
             body.addBodyPart(textPart);                
             body.addBodyPart(image);
             
             mimeMsg.setContent(body); 
       
       Transport transport = sess.getTransport("smtp");
       transport.connect(mUser, mPassword);
       transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());// メール送信
       transport.close();

         } catch (Exception e) {
             e.printStackTrace();
         }

  }
 };

}

2011年12月17日土曜日

サーフェイスビューにカメラの映像をプレビュー:Android Camera



USBカメラを繋げて表示しているので、カメラを回転させたり、
カメラサイズを取得して、サーフェイスに設定したりしています。


package com.android_test;

import java.io.FileOutputStream;
import java.util.List;
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

public class AndroidTestActivity extends Activity {
 private String filePath;
 private Camera camera;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  SurfaceView mySurfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
  SurfaceHolder holder = mySurfaceView.getHolder();
  holder.addCallback(mSurfaceListener);
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  // カメラの総数
  int numberOfCameras = Camera.getNumberOfCameras();
  Log.d("個数", String.valueOf(numberOfCameras));

  // 保存フォルダの取得
  filePath = Environment.getExternalStorageDirectory().getPath();// /mnt/sdcard
  Log.d("SDカードのパス", filePath);
 }

 private SurfaceHolder.Callback mSurfaceListener = new SurfaceHolder.Callback() {
  public void surfaceCreated(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   camera = Camera.open(0);
   try {
    camera.setPreviewDisplay(holder);
   } catch (Exception e) {
    e.printStackTrace();
   }
  }

  public void surfaceDestroyed(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   camera.release();
   camera = null;
  }

  public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
   // TODO Auto-generated method stub
   Log.d("サーフェイスサイズ", "w=" + String.valueOf(width) + "h=" + height);// 480x661

   camera.setDisplayOrientation(90);// カメラを回転
   Camera.Parameters parameters = camera.getParameters();
   List<Camera.Size> size = parameters.getSupportedPreviewSizes();

   Log.d("カメラのサイズ", "w=" + String.valueOf(size.get(0).width) + "h="
     + String.valueOf(size.get(0).height));// 480x640
   parameters.setPreviewSize(size.get(0).width, size.get(0).height);
   camera.setParameters(parameters);
   camera.startPreview();
  }
 };

 // ボタンが押された時の処理
 public void SetButtonOnClick(View v) {
  // camera = Camera.open(1);//カメラを開く
  // カメラ画像を取得
  camera.takePicture(null, null, mPictureListener);
 }

 // JPEGイメージ生成後に呼ばれるコールバック
 private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() {
  public void onPictureTaken(byte[] data, Camera camera) {
   // SDカードにJPEGデータを保存する
   if (data != null) {
    FileOutputStream myFOS = null;
    try {
     myFOS = new FileOutputStream(filePath
       + "/DCIM/Camera/camera_test.jpg");
     myFOS.write(data);
     myFOS.close();
    } catch (Exception e) {
     e.printStackTrace();
    }
    camera.release();
   }
  }
 };
}


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <SurfaceView
        android:id="@+id/surfaceView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" android:layout_weight="1"/>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" android:onClick="SetButtonOnClick"/>

</LinearLayout>


カメラサイズを取得して同じ値を設定している部分は、
意味のない処理をしているかもしれません。

Android:カメラで撮影:hardware.Camera

画面にカメラの映像は映さないで、
ボタンを押して撮影してSDカードに保存するだけのソース。


package com.android_test;

import java.io.FileOutputStream;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;

public class AndroidTestActivity extends Activity {
 private String filePath;

 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // カメラの総数
  int numberOfCameras = Camera.getNumberOfCameras();
  Log.d("個数", String.valueOf(numberOfCameras));

  //保存フォルダの取得
  filePath = Environment.getExternalStorageDirectory().getPath();// /mnt/sdcard
  Log.d("SDカードのパス", filePath );
    }
    //ボタンが押された時の処理
    public void SetButtonOnClick(View v) {
     Camera camera = Camera.open(1);//カメラを開く
     //カメラ画像を取得
     camera.takePicture(null, null, mPictureListener);
 }

 // JPEGイメージ生成後に呼ばれるコールバック
 private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() {
  public void onPictureTaken(byte[] data, Camera camera) {
   // SDカードにJPEGデータを保存する
   if (data != null) {
    FileOutputStream myFOS = null;
    try {
     myFOS = new FileOutputStream( filePath + "/DCIM/Camera/camera_test.jpg");
     myFOS.write(data);
     myFOS.close();
    } catch (Exception e) {
     e.printStackTrace();
    }
    camera.release();
   }
  }
 };
}

マニフェストファイルに追加
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />

撮影した画像 640x480


USBカメラを接続して撮影した画像
Camera.open(0);

2011年11月26日土曜日

Unfortunately, camera has stopped対策



日本語でのメッセージは、
申し訳ありませんが、カメラは停止しました。

このメッセージが出たら、カメラを起動させても、おなじメッセージが出るので、
カメラのデータをクリアにします。
MENU->アプリの管理->カメラ->データを消去

MENU ->Manage apps -> Camera -> Clear data

カメラのサイズと表示するサーフェイスの大きさの違いで出るみたいなので、
カメラサイズを取得してサーフェイスに設定するとかすればいいみたい。
下の記事にカメラサイズの取得方法とか書いてみた、
サーフェイスビューにカメラの映像をプレビュー

2011年11月25日金曜日

AVDとUSBカメラを繋げて撮影


AVDの設定

撮影した画像はSDカードに保存されるので、 SDカードの設定もしておきます。
追記:
ターゲットに注意してください。
Camera support の設定は無くても大丈夫なようでした。

カメラで撮影した画像の保存場所
右上のフロッピーのアイコンをクリックすればローカルフォルダに保存して、
確認する事が出来る。

AVDのカメラのアイコンから起動するか、
AVDのApps の中のAPI Demos のGraphicsの中のCameraPreviewを
起動させると、最初はUSBカメラでは無い画面が立ち上がって、
MENU ボタンを押してSwitch Cameraを押すとUSBカメラの画面に切り替わる