Android:DualShotについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
takagai

Android:DualShotについて

#1

投稿記事 by takagai » 12年前

初めて利用させていただきます。takagaiと申します。
私は現在、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()を除いてアウトカメラだけで撮影した場合は画像が保存されました。

調べてみても理解できなかったので、質問をさせて頂きました。
よろしくお願いいたします。

“C言語何でも質問掲示板” へ戻る