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

웹서버에서 안드로이드로 요청시 사진을 찍어서 다시 웹서버로 전송하는 앱을 구현하려고 있습니다.

0 추천

사진을 찍는 것까지는 되는데 당최 서버로 날라가지 않습니다...

// logcat 은 빨간 줄만 적어봤습니다.

===============================

05-24 11:25:41.442: E/Trace(17016): error opening trace file: No such file or directory (2)
05-24 11:25:41.632: E/dalvikvm(17016): Could not find class 'org.apache.http.entity.mime.content.FileBody', referenced from method kr.yjc.camera.CameraTestActivity.doFileUpload
05-24 11:25:46.932: E/AndroidRuntime(17016): FATAL EXCEPTION: main
05-24 11:25:46.932: E/AndroidRuntime(17016): java.lang.NoClassDefFoundError: org.apache.http.entity.mime.content.FileBody
05-24 11:25:46.932: E/AndroidRuntime(17016): at kr.yjc.camera.CameraTestActivity.doFileUpload(CameraTestActivity.java:183)
05-24 11:25:46.932: E/AndroidRuntime(17016): at kr.yjc.camera.CameraTestActivity$3.onPictureTaken(CameraTestActivity.java:142)
05-24 11:25:46.932: E/AndroidRuntime(17016): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:768)
05-24 11:25:46.932: E/AndroidRuntime(17016): at android.os.Handler.dispatchMessage(Handler.java:99)
05-24 11:25:46.932: E/AndroidRuntime(17016): at android.os.Looper.loop(Looper.java:137)
05-24 11:25:46.932: E/AndroidRuntime(17016): at android.app.ActivityThread.main(ActivityThread.java:5041)
05-24 11:25:46.932: E/AndroidRuntime(17016): at java.lang.reflect.Method.invokeNative(Native Method)
05-24 11:25:46.932: E/AndroidRuntime(17016): at java.lang.reflect.Method.invoke(Method.java:511)
05-24 11:25:46.932: E/AndroidRuntime(17016): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-24 11:25:46.932: E/AndroidRuntime(17016): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-24 11:25:46.932: E/AndroidRuntime(17016): at dalvik.system.NativeStart.main(Native Method)

===============================

안드로이드 소스

sdcard에 저장은되는데 갤러리에는 안뜨네요.

lib 입니다.

android-support-v4.jar

apache-mime4j-0.6.1-bin.zip

commons-logging-1.1.1.jar

httpcore-4.0.1.jar

httpmime-4.0.3.jar

===============================

public class CameraTestActivity extends Activity {
 
 private static final String TAG = "CameraTestActivity";
 //카메라 제어
 private Camera camera;
 //촬영된 사진보기
 private ImageView imageView;
 //처리 중
 private boolean inProgress;
 //카메라에 찍힌 이미지 데이터
 byte[] data;
 DataOutputStream dos;
 ImageView view;
 SurfaceView surfaceView;
 
 
 //카메라 SurfaceView의 리스터
 private SurfaceHolder.Callback surfaceListener =
  new SurfaceHolder.Callback() {
    
  // SurfaceView가 생성되었을 때 화면에 보여주기위한 초기화 작업을 수행
  // 카메라를 오픈하고, 프리뷰의 위치를 설정한다.
   @Override
   public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    camera = Camera.open();
    try {
      camera.setPreviewDisplay(holder);
    } catch (Exception e) {
     // TODO: handle exception
     e.printStackTrace();
    }
   }
   
  //SurfaceView가 화면에 표시되지 않을 때 (액티비티가 비활성화 될때) 호출한다.
   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    camera.release();
    camera = null;
   }
   

  // surfaceCreate()가 호출된 다음 호출된다.
  // 프리뷰의 크기를 설정하고 프리뷰 영상을 표시한다.
   @Override
   public void surfaceChanged(SurfaceHolder holder,
        int format,
        int width,
        int height) {
    // TODO Auto-generated method stub
  // 카메라의 파라메터 값을 가져와서 미리보기 크기를 설정하고
  // 프리뷰를 보여준다. 
    Camera.Parameters parameters =
      camera.getParameters();
    parameters.setPreviewSize(width, height);
    camera.setParameters(parameters);
    camera.startPreview();
   }
  };
  
  //카메라 셔터가 눌러질 때
  
  private Camera.ShutterCallback shutterListener =
   new Camera.ShutterCallback() {
    
    @Override
    public void onShutter() {
     // TODO Auto-generated method stub
     
     if(camera != null && inProgress == false){
      
      camera.takePicture(
        shutterListener, // 셔터 후
        null,     // Raw 이미지 생성 후
        pictureListener);// JPEG 이미지 생성 후
       inProgress = true;
     }
    }
   };
  
  Bitmap bitmap;
  
  // JPEG 이미지를 생성 후 호출  
  private Camera.PictureCallback pictureListener =
   new Camera.PictureCallback() {
    
    
   
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
     // TODO Auto-generated method stub
     if(data != null){
      // 적용할 옵션이 있는 경우 BitmapFactory클래스의 Option()
      // 메서드로 옵션객체를 만들어 값을 설정하여
      // 이렇게 만들어진 옵션을 Bitmap 객체를 만들 때 네번째
      // 아규먼트로 사용한다.
      
      CameraTestActivity.this.data=data;
      bitmap = BitmapFactory.decodeByteArray(data,
            0,
            data.length,
            null);
      // 이미지 뷰 이미지 설정
      imageView.setImageBitmap(bitmap);
      doSaveFile();           
      doFileUpload();
      Toast.makeText(CameraTestActivity.this,
          "서버에 파일을 성공적으로 전송하였습니다.",
          Toast.LENGTH_LONG).show();
      
      camera.startPreview();  //  정지된 프리뷰를 재개
      inProgress = false;  // 처리중 플래그를 끔
      
      
     }
    }
   };
   
//   File saveFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "mnt/sdcard/image01.jpg");
   File saveFile = new File("/mnt/sdcard/DCIM/images04.jpg");
   
   public void doSaveFile(){
    
     OutputStream out = null;
     try{
      
      saveFile.createNewFile();
       
      out = new FileOutputStream(saveFile);
      
      bitmap.compress(CompressFormat.JPEG, 70, out);
      
     }catch (Exception e){
      e.printStackTrace();
     }finally{
      try{ out.close(); } catch (IOException e) {e.printStackTrace();}
     }     
   }

   public void doFileUpload(){
    try {
     HttpClient httpClient = new DefaultHttpClient();
     
     String url = "http://192.168.10.100:8080/FileUpload/FileUpload.jsp";
     
     HttpPost post = new HttpPost(url);
     FileBody bin = new FileBody(saveFile);
     MultipartEntity multipart =
       new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
      multipart.addPart("images", bin);
      
     post.setEntity(multipart);
     HttpResponse response = httpClient.execute(post);
     HttpEntity resEntity = response.getEntity();
    } catch (Exception e) {
     // TODO: handle exception
     e.printStackTrace();
    }
   }
 
//   Activity가 실행될 때 호출
//   Activity의 UI를 적용하기 위해 호출하는 setContentView(int)메소드,
//   UI내의 위젯과 서로 정보를 주고받기 위한 findViewById(int) 메소드 등과
//   함께 Avtivity 초기화시 실행되는 메소드 중 하나
 @Override
 protected void onCreate(Bundle savedInstanceState) {

  // 액티비티의 타이틀이 안보이도록 설정한다.
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.activity_main);
  imageView = (ImageView) findViewById(R.id.ImageView01);
  surfaceView =
   (SurfaceView) findViewById(R.id.SurfaceView01);
  
  // surface를 제어하는 SurfaceHolder
  SurfaceHolder holder = surfaceView.getHolder();
  
  // SurfaceView 리스터를 등록
  holder.addCallback(surfaceListener);
  
  // 버퍼 사용하지 않음
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  

  super.onCreate(savedInstanceState);
 }
 
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  // TODO Auto-generated method stub
  
  if(event.getAction() == KeyEvent.ACTION_DOWN ){
   switch(keyCode){
    case KeyEvent.KEYCODE_CAMERA:
      shutterListener.onShutter();
      return true;
   }
  }
  
  return super.onKeyDown(keyCode, event);
 }

 
 @Override 
 public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction() == MotionEvent.ACTION_DOWN) {
   shutterListener.onShutter();
  }
  return true;
 }
 
}

 

어디에 문제가 있는걸까요

사용자가 웹서버에서 보낸 요청을 수락 시 촬영을 하게 하려면 어떤식으로

구조를 짜야하는지 조언 부탁드립니다.

 8000자 제한 걸리네요 ㅠㅠ

기리기리가 (140 포인트) 님이 2013년 5월 24일 질문
기리기리가님이 2013년 5월 24일 수정
jsp쪽의 소스코드는 아래와 같습니다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>cos 업로드 처리</title>
</head>
<body>
<%
    // 절대 경로
    String savePath = "C:/upload";
    int maxSize = 5 * 1024 * 1024; // 최대 업로드 파일 크기 5MB(메가)로 제한
    try {
        MultipartRequest multi = new MultipartRequest(request,
                savePath, maxSize, "UTF-8", new DefaultFileRenamePolicy());
   
   
    } catch (Exception e) {
        out.print("예외 발생 : " + e);
    }//catch
%>
</body>
</html>
lib는 cos.jar하나만 추가했습니다...

조언 부탁드립니다.
lib에
apache-mime4j-0.6.1-bin.zip 알집을 안풀고 넣었네요..
로그캣은
error opening trace file: No such file or directory (2)
한줄만 발생합니다.
앱은 안죽고 계속 촬영되는데 이미지가 안날라갑니다..ㅠㅠ
제발 도와주세요~~

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...