마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

사진을 다른 경로에 여러장 저장하고 싶습니다.

0 추천
새내기 개발자 입니다!! 앱을 하나 개발하고 싶어서 책을 보면서 하나씩 따라하고 있는 아주 초보 개발자 입니다.

"안드로이드 프로그래밍 정복" 이란 책을 하나씩 보면서 따라하는 중인데요. 도중에 카메라 파트에서 소스를 구현 하였을때

사진이 1장만 저장 되는 것 알게 되었습니다.

저는 다른 경로에 여러 사진을 저장하고 싶은데, 아무리 해봐도 되지가 않네요 ㅜㅜ

해서 이렇게 여러분들꼐 질문 드립니다 ㅜ 다른 경로에 사진을 여러장 저장 할 수 있게 하는 법좀 알려주십시오  ㅜㅜ

 

------------------------------------------------------------------------------------------------------- .java 파일입니다.

package org.androidtown.kamera;

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

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.Size;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
MyCameraSurface mSurface;
Button mShutter;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  mSurface = (MyCameraSurface)findViewById(R.id.preview);
  
  findViewById(R.id.focus).setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v) {
    mShutter.setEnabled(false);
    mSurface.mCamera.autoFocus(mAutoFocus);
   }
  });
  
  mShutter = (Button)findViewById(R.id.shutter);
  mShutter.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v) {
    mSurface.mCamera.takePicture(null, null, mPicture);
   }
  });
 }
 
 AutoFocusCallback mAutoFocus = new AutoFocusCallback() {
  public void onAutoFocus(boolean success, Camera camera) {
   mShutter.setEnabled(success);
  }
 };
 
 PictureCallback mPicture = new PictureCallback() {
  public void onPictureTaken(byte[] data, Camera camera) {
   String sd = Environment.getExternalStorageDirectory().getAbsolutePath();
   String path = sd + "/cameratest.jpg";
   
   File file = new File(path);
   try {
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(data);
    fos.flush();
    fos.close();
   } catch (Exception e) {
    Toast.makeText(MainActivity.this, "파일 저장 중 에러 발생: " + e.getMessage(), 0).show();
   return;
   }
 

 Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE );
 Uri uri = Uri.parse("file://" +path);
 intent.setData(uri);
 sendBroadcast(intent);
 
 Toast.makeText(MainActivity.this, "사진 저장 완료 : " + path , 0).show();
 mSurface.mCamera.startPreview();

}
};
}

class MyCameraSurface extends SurfaceView implements SurfaceHolder.Callback {
 SurfaceHolder mHolder;
 Camera mCamera;
 
 public MyCameraSurface(Context context, AttributeSet attrs) {
  super(context, attrs);
  mHolder = getHolder();
  mHolder.addCallback(this);
  mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }
 
 public void surfaceCreated(SurfaceHolder holder) {
  mCamera = Camera.open();
  try {
   mCamera.setPreviewDisplay(mHolder);
  } catch (IOException e) {
   mCamera.release();
   mCamera = null;
  }
 }
 
 public void surfaceDestroyed(SurfaceHolder holder) {
  if (mCamera != null) {
   mCamera.stopPreview();
   mCamera.release();
   mCamera = null;
  }
 }
 
 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  Camera.Parameters params = mCamera.getParameters();
  List<Size> arSize = params.getSupportedPreviewSizes();
  if (arSize == null){
   params.setPreviewSize(width, height);
  }else {
   int diff = 10000;
   Size opti = null;
   for ( Size s : arSize) {
    if (Math.abs(s.height - height) < diff) {
     diff = Math.abs(s.height - height);
     opti = s;
     
    }
   }
   params.setPreviewSize(opti.width, opti.height);
  }
  mCamera.setParameters(params);
  mCamera.startPreview();
 }
}
   

------------------------------------------------------------------------------------------------------------------
블라블라샬라 (380 포인트) 님이 2013년 7월 16일 질문
이 예제 소스 되나요? 저는 왜 안되죠? 실행하면 바로 죽어버리던데
혹시 이유를 아시나요? 레이아웃 소스랑 매니패스트? 소스 좀 볼 수
있을까요? 아님 src 레이아웃 매니패스트 외 건들 부분이 잇나요?

1개의 답변

+1 추천
 
채택된 답변

/cameratest.jpg 이런식으로 파일명을 정해주었기 때문에 

계속 찍어봤자 마지막에 찍은 한장만 남게 되겠지요

파일명을 계속해서 바꿔주는 구조로 가셔야 합니다.

그냥 간단하게 테스트용으로 

String path = sd + "/" + System.currentTimeMillis() + ".jpg"

이렇게 바꿔보시기 바랍니다.

 
Gradler (109,780 포인트) 님이 2013년 7월 16일 답변
블라블라샬라님이 2013년 7월 16일 채택됨
감사합니다!! ㅎㅎ 고치니 바로 되네요~!!!
...