Android:DualShotについて
Posted: 2013年7月11日(木) 15:29
初めて利用させていただきます。takagaiと申します。
私は現在、EclipseでAndroidのカメラアプリを製作しています。
またプログラミングの勉強は3か月程度で、まだ理解の浅い初心者です。
現在、アウトカメラで撮影・保存した後にインカメラに切り替えて撮影・保存をするアプリを作りたいと考えています。
しかしインカメラの画像は保存されるのですが、アウトカメラの画像が保存されなくて困っています。
プログラミングの流れは
タッチイベントの取得→TakePicture→オートフォーカス→撮影・保存→インカメラに切り替え→TakePicture→即撮影・保存
となるように考えています。
開発環境はWindows7 64bit、Eclipseはバージョン4.2、実機はGalaxy S4 でAndroid 4.2.2です。
ソースコードは以下です。
また、現在エラーは出ていません。
SwitchCamera1()を除いてアウトカメラだけで撮影した場合は画像が保存されました。
調べてみても理解できなかったので、質問をさせて頂きました。
よろしくお願いいたします。
私は現在、EclipseでAndroidのカメラアプリを製作しています。
またプログラミングの勉強は3か月程度で、まだ理解の浅い初心者です。
現在、アウトカメラで撮影・保存した後にインカメラに切り替えて撮影・保存をするアプリを作りたいと考えています。
しかしインカメラの画像は保存されるのですが、アウトカメラの画像が保存されなくて困っています。
プログラミングの流れは
タッチイベントの取得→TakePicture→オートフォーカス→撮影・保存→インカメラに切り替え→TakePicture→即撮影・保存
となるように考えています。
開発環境はWindows7 64bit、Eclipseはバージョン4.2、実機はGalaxy S4 でAndroid 4.2.2です。
ソースコードは以下です。
@Override
public boolean onTouchEvent(MotionEvent event)
{
//タッチイベント取得
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
Log.d(TAG, "CameraView::onTouchEvent()");
TakePicture(); //撮影
}
return true;
}
public void TakePicture()
{
Log.d(TAG, "CameraView::takePicture()");
if(_nReady != 0)
{
_nReady = 0;
if(true)
{
//オートフォーカス撮影
_Camera.autoFocus(_pfnAutoFocusCallback);
}}
else
{
//即撮影
_Camera.takePicture(_pfnShutterCallback, _pfnRawPictureCallback,mPictureListener);
}
}
private Camera.AutoFocusCallback _pfnAutoFocusCallback = new AutoFocusCallback();
private final class AutoFocusCallback implements Camera.AutoFocusCallback
{
public void onAutoFocus(boolean success, Camera camera)
{
Log.d(TAG, "CameraView::onAutoFocus()");
camera.autoFocus(null);
camera.takePicture(_pfnShutterCallback, _pfnRawPictureCallback,new JpgPictureCallback());
if(N == 1);{
SwitchCamera1();
}
TakePicture();
};
}
public void SwitchCamera1()
{
if (_Camera != null) {
_Camera.stopPreview();
try {
_Camera.setPreviewDisplay(null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
_Camera.release();
_Camera = null;
}
// カメラを切り替え
_Camera = Camera
.open(CameraInfo.CAMERA_FACING_FRONT);
try {
_Camera.setPreviewDisplay(_SurfaceHolder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// プレビュー再開
_Camera.startPreview();
_nReady = 0;
}
private ShutterCallback _pfnShutterCallback = new ShutterCallback();
private final class ShutterCallback implements android.hardware.Camera.ShutterCallback
{
public void onShutter()
{
Log.d(TAG, "CameraView::onShutter()");
}
};
private RawPictureCallback _pfnRawPictureCallback = new RawPictureCallback();
private final class RawPictureCallback implements PictureCallback
{
public void onPictureTaken(byte [] rawData, android.hardware.Camera camera)
{
Log.d(TAG, "CameraView::onRawPictureTaken()");
};
}
private final class JpgPictureCallback implements PictureCallback
{
public void onPictureTaken(byte [] data, android.hardware.Camera camera)
{
Log.d(TAG, "CameraView::onJpgPictureTaken()");
String strFolder;
String strFile;
strFolder = Environment.getExternalStorageDirectory()+"/DCIM/Camera/";
//保存ファイル名
strFile = strFolder + "test" + _nShotNo + ".jpg";
try
{
FileOutputStream cFile = new FileOutputStream(strFile);
cFile.write(data);
cFile.close();
long nDate;
ContentValues values = new ContentValues();
nDate = System.currentTimeMillis();
values.put(Images.Media.MIME_TYPE,"image/jpeg"); //必須
values.put(Images.Media.DATA,strFile); //必須:ファイルパス(uriからストリーム作るなら不要)
values.put(Images.Media.SIZE,new File(strFile).length()); //必須:ファイルサイズ(同上)
values.put(Images.Media.DATE_ADDED,nDate);
values.put(Images.Media.DATE_TAKEN,nDate);
values.put(Images.Media.DATE_MODIFIED,nDate);
ContentResolver contentResolver = getContext().getContentResolver();
contentResolver.insert(Media.EXTERNAL_CONTENT_URI, values);
}
catch(Exception e)
{
Log.e(TAG, "CameraView::onJpgPictureTaken() : Fail to save image file.");
}
_nShotNo++;
camera.startPreview(); //プレビュー再開
_nReady = 1;
};
};
private Camera.PictureCallback mPictureListener =new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
if (data != null) {
FileOutputStream foStream = null;
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/cmr/");
if(!file.exists()){
file.mkdir();
}
String imgName = Environment.getExternalStorageDirectory().getPath() + "/cmr/" + System.currentTimeMillis() +".jpg";
try {
foStream = new FileOutputStream(imgName);
foStream.write(data);
foStream.close();
ContentValues values = new ContentValues();
ContentResolver contentResolver = context.getContentResolver();
values.put(Images.Media.MIME_TYPE, "image/jpeg");
values.put("_data", imgName);
try {
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}catch(Exception e){
Toast.makeText(context, "再起動後に画像が認識されます。", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
bool = true;
camera.startPreview();
_nReady = 1;
}else{
Toast.makeText(context, "データが取得できませんでした。", Toast.LENGTH_SHORT).show();
bool = true;
camera.startPreview();
}
}
};
}
また、現在エラーは出ていません。
SwitchCamera1()を除いてアウトカメラだけで撮影した場合は画像が保存されました。
調べてみても理解できなかったので、質問をさせて頂きました。
よろしくお願いいたします。