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年8月3日金曜日
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では利用できるようです。実機では試していません。
別に特別な事は必要ありませんでした。
以外に簡単でした。
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カードに保存するだけのソース。
マニフェストファイルに追加
<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);
ボタンを押して撮影して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カメラの画面に切り替わる
登録:
投稿 (Atom)






