관리 메뉴

올해는 머신러닝이다.

[펌][안드로이드예제] 카메라로 찍은 사진(이미지파일)을 웹서버에 전송하는 프로그램예제 본문

Android/Tip&Tech

[펌][안드로이드예제] 카메라로 찍은 사진(이미지파일)을 웹서버에 전송하는 프로그램예제

리엑티브한 행복한 수지아빠 2010. 12. 29. 15:11
출처 : http://cafe.naver.com/sunschool.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=4408

우선 안드로이드 어플에서 서버로 이미지 파일을 전송하게 하려면 서버측에서 이미지 파일을 받아서 저장해주는 

프로그램이 필요하다. 

 

multipart/form-data 를 이용하면 파일을 업로드하는 프로그램을 작성할 수 있다.

 com.oreilly.servlet 패키지의 MultipartRequest 클래스를 이용하여 쉽게 파일 업로드를  구현할 수 있다.
http://www.servlets.com/cos/cos-05Nov2002.zip 사이트에서 cos-05Nov2002.zip 파일을 다운로드 받아서
압축을 풀어 cos.jar 파일을 <Tomcat>/common/lib 에 복사합니다.   
***************************************************************************

 

<%@ page import="java.io.*,com.oreilly.servlet.*,com.oreilly.servlet.multipart.*"%>

<% request.setCharacterEncoding("euc-kr"); %> 

<html>
<head><title>upload test</title></head>
<body>
<h3>파일 upload</h3>

<% 
        String dir=application.getRealPath("/upload");
        int max= 5*1024*1024;

        //최대크기 max바이트, dir 디렉토리에 파일을 업로드하는 MultipartRequest
        //객체를 생성한다.

        MultipartRequest m = new MultipartRequest(request,dir,max,"UTF-8",

                                               new  DefaultFileRenamePolicy());
%>

<c:set var="file1" value='<%= m.getFilesystemName("file1")%>' />   // 파일이름을 file1 이라는 파라메터로 넘겨받음
<c:set var="ofile1" value='<%= m.getOriginalFileName("file1") %>' />

<p>

<li>제목: ${subject}<br>
<li>업로드파일1: <a href=/upload/${file1}>${ofile1}</a><br>

</body>
</html>

 

 

 

카메라를 이용해 사진을 찍고, 찍어진 사진은 일단 뷰로 화면에 표시되고, 화면에 표시되는 동안

이미지파일을 서버에 전송한뒤, 전송이 완료되면 다시 카메라를 이용해 사진을 찍을 수 있도록 한다.

 

먼저 HelloCamera를 실행하기 위한 Layout

 

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
>
 
  <SurfaceView
     android:id="@+id/surface_view"
     android:layout_gravity="center"
     android:layout_height="fill_parent"
     android:layout_width="fill_parent"
     android:visibility="visible"/>
 

  <ImageView
     android:layout_height="fill_parent"
     android:layout_width="fill_parent"
     android:visibility="invisible"
     android:id="@+id/image_view" />
</FrameLayout>

 

카메라와 인터넷, 셔트를 사용하기 위한 AndroidManifest.xml 권한설정

 

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.INTERNET" />

 

 

카메라 촬영및 서버로 이미지 파일 업로드를 처리하는 Activity . HelloCamera.java 첨부파일 참조

 

   

package kim.android.test;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

 

public class HelloCamera extends Activity {

    private static final String TAG = "HelloCamera";

    // 카메라 제어
    private Camera mCamera;
    // 촬영 사진보기
    private ImageView mImage;
    // 처리중 

    private boolean mInProgress;
    //카메라에 찍힌 이미지 데이터
    byte[] data;
    DataOutputStream dos;

   
    // 카메라 미리보기 SurfaceView의 리스너
    private SurfaceHolder.Callback mSurfaceListener =
        new SurfaceHolder.Callback() {

            public void surfaceCreated(SurfaceHolder holder) {
                // SurfaceView가 생성되면 카메라를 연다.
                mCamera = Camera.open();
                Log.i(TAG, "Camera opened");
                try {
                     mCamera.setPreviewDisplay(holder);
                } catch (Exception e) {
                         e.printStackTrace();
                 }
            }

            public void surfaceDestroyed(SurfaceHolder holder) {
                // SurfaceView가 삭제되는 시간에 카메라를 개방
                mCamera.release();
                mCamera = null;
                Log.i(TAG, "Camera released");
            }

            public void surfaceChanged(SurfaceHolder holder,
                                       int format,
                                       int width,
                                       int height) {
                // 미리보기 크기를 설정
                Camera.Parameters parameters =
                                     mCamera.getParameters();
                parameters.setPreviewSize(width, height);
                mCamera.setParameters(parameters);
                mCamera.startPreview();
                Log.i(TAG, "Camera preview started");
            }
        };

   

    // 카메라 셔트가 눌러질때
    private Camera.ShutterCallback mShutterListener =
        new Camera.ShutterCallback() {

            // 이미지를 처리하기 전에 호출된다.
            public void onShutter() {
                Log.i(TAG, "onShutter");
                if (mCamera != null && mInProgress == false) {
                    // 이미지 검색을 시작한다. 리스너 설정
                    mCamera.takePicture(
                        mShutterListener,  // 셔터 후
                        null, // Raw 이미지 생성 후
                        mPicutureListener); // JPE 이미지 생성 후
                    mInProgress = true;

                }
            }

        };

   
 
    // JPEG 이미지를 생성 후 호출
    private Camera.PictureCallback mPicutureListener =
        new Camera.PictureCallback() {

            public void onPictureTaken(byte[] data, Camera camera) {
                Log.i(TAG, "Picture Taken");
                if (data != null) {
                    Log.i(TAG, "JPEG Picture Taken");
    
                    //  적용할 옵션이 있는 경우 BitmapFactory클래스의 Options()
                    //  메서드로 옵션객체를 만들어 값을 설정하며
                    //  이렇게 만들어진 옵션을 Bitmap 객체를 만들때 네번째
                    //  아규먼트로 사용한다.
                    //
                    //  처리하는 이미지의 크기를 축소
                    //  BitmapFactory.Options options =
                    //      new BitmapFactory.Options();
                    //  options.inSampleSize = IN_SAMPLE_SIZE;
                   HelloCamera.this.data=data;
                   Bitmap bitmap =
                        BitmapFactory.decodeByteArray(data,
                                                      0,
                                                      data.length,
                                                      null);
                    //이미지 뷰 이미지 설정
                    mImage.setImageBitmap(bitmap);
                    doFileUpload();  //서버에 이미지를 전송하는 메서드 호출
                    Toast.makeText(HelloCamera.this, "서버에 파일을 성공적으로 전송하였습니다",
                      Toast.LENGTH_LONG).show();
                    // 정지된 프리뷰를 재개
                    camera.startPreview();
                    mInProgress = false;

                    // 처리중 플래그를 떨어뜨림
                   
                }
            }

        };

      
       public void doFileUpload() {
       try {
        URL url = new URL("http://192.168.10.2:8080/image_upload.jsp");
        Log.i(TAG, "http://localhost/image_upload.jsp" );
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";

        // open connection
        HttpURLConnection con = (HttpURLConnection)url.openConnection();   
        con.setDoInput(true); //input 허용
        con.setDoOutput(true);  // output 허용
        con.setUseCaches(false);   // cache copy를 허용하지 않는다.
        con.setRequestMethod("POST");
        con.setRequestProperty("Connection", "Keep-Alive");
        con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
       
        // write data
        DataOutputStream dos =
                             new DataOutputStream(con.getOutputStream());
        Log.i(TAG, "Open OutputStream" );
        dos.writeBytes(twoHyphens + boundary + lineEnd);

 

        // 파일 전송시 파라메터명은 file1 파일명은 camera.jpg로 설정하여 전송
        dos.writeBytes("Content-Disposition: form-data; name=\"file1\";filename=\"camera.jpg\"" +

                             lineEnd);

               
        dos.writeBytes(lineEnd);
        dos.write(data,0,data.length);
        Log.i(TAG, data.length+"bytes written" );
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
        dos.flush(); // finish upload...  
      
       } catch (Exception e) {
        Log.i(TAG, "exception " + e.getMessage());
        // TODO: handle exception
       }
       Log.i(TAG, data.length+"bytes written successed ... finish!!" );
       try { dos.close(); } catch(Exception e){}
    

    } 
       
    ImageView view;
    SurfaceView surface;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera2_layout);

        mImage = (ImageView) findViewById(R.id.image_view);

        surface =
            (SurfaceView) findViewById(R.id.surface_view);
        SurfaceHolder holder = surface.getHolder();
        view=(ImageView)findViewById(R.id.image_view);
       
        // SurfaceView 리스너를 등록
        holder.addCallback(mSurfaceListener);
        // 외부 버퍼를 사용하도록 설정
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 
    }
   
    // 키가 눌러졌을때 카메라 셔트가 눌러졌다고 이벤트 처리설정
    @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:
                     //videoPreview.onCapture(settings);
                  mShutterListener.onShutter();
                     /* ... */
                     return true;
             }
         }
         return false;
 }


}

2 Comments
댓글쓰기 폼