안드로이드

 

 

class MainActivity

package kr.co.braverokmc.mycaptureintent;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;

import java.io.File;

public class MainActivity extends AppCompatActivity {

    ImageView imageView;

/*
    1. 인텐트를 이용해서 단말의 사진을 띄워주는 방법

    버튼을 클릭하면 -> 단말의 카메라앱을 띄워주고


    -> 사진찍은 결과물을 이미지뷰에 보여주기


    2. 서피스 뷰를 이용해서 보여주는 방법

    */

    File outputPath;


    FrameLayout container;
    CameraSurfaceView cameraView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView=(ImageView)findViewById(R.id.imageView);


        container =(FrameLayout)findViewById(R.id.container);


        cameraView =new CameraSurfaceView(this);
        container.addView(cameraView);


        // 디렉토리 를 파일로 받기
        File storageDir=Environment.getExternalStorageDirectory();
        outputPath =new File(storageDir, "output.jpg");



    }


    public void onClick(View v){
/*        //카메라 띄우기
        Intent intent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        //부과 설정 사진을 찍으면 그 결과를 어디에 저장할 것인가 설정
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outputPath));
        // 세로 방향으로 변경
        intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);

        // 응답코드 설정
        startActivityForResult(intent, 1001);*/


        //카메라에서 takePicture 호출되면 onPictureTaken 호출된다.
        cameraView.capture(new Camera.PictureCallback(){

            //콜백 메소드 실행
            // 실질적 이미지가 메소드 파라미터 값으로 넘겨온다.
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {

                //옵션 객체 생성
                BitmapFactory.Options options=new BitmapFactory.Options();
                // 크기를 1/8 로 줄이기
                options.inSampleSize=8;

                Bitmap  bitmap =BitmapFactory.decodeByteArray(data, 0, data.length, options);
                imageView.setImageBitmap(bitmap);

                camera.startPreview();
            }
        });


    }

    //결과를 받는다.
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //사진을 찍으면 반환 코드로 1001 받으면
        if(requestCode==1001){
            //옵션 객체 생성
            BitmapFactory.Options options=new BitmapFactory.Options();
            // 크기를 1/8 로 줄이기
            options.inSampleSize=8;

            Bitmap  bitmap =BitmapFactory.decodeFile(outputPath.getAbsolutePath(), options);
            imageView.setImageBitmap(bitmap);
        }


    }


    // 2. 두번째 방법
    class CameraSurfaceView extends SurfaceView  implements SurfaceHolder.Callback{

        // 서피스는 하드웨어 제어기
        //서피스 껍데기
        //홀더에서 실질적인 관리
        SurfaceHolder holder;
        //카메라는 하드웨어 카메라 import
        Camera camera=null;

        public CameraSurfaceView(Context context) {
            super(context);
            init(context);
        }

        public CameraSurfaceView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
        }


        private void init(Context context){
            holder=getHolder();
            holder.addCallback(this);
        }



        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                camera =Camera.open();
                //카메라 미리보기 설정
                camera.setPreviewDisplay(holder);

            }catch (Exception e){
                e.printStackTrace();
            }

        }

        //서피스뷰가 레이아웃 에 보이기 위해 할당 받을 때
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            // 이때 미리보기 가 실행된다.
            camera.startPreview();
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            //카메라 중지
            camera.stopPreview();
            camera.release();
            camera=null;
        }


        // 카메라가 찍어지면 콜백메서드에 자동 호출
       public boolean capture(Camera.PictureCallback callback){
            if(camera!=null){
                camera.takePicture(null, null, callback);

                //정상적이면 true 리턴
                return  true;
            }else {
                return false;
            }
        }

    }




}









 

R.layout.activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="kr.co.braverokmc.mycaptureintent.MainActivity">

    <Button
        android:text="사진찍기"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/button"
        android:onClick="onClick"
        />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="160dp"
        android:id="@+id/imageView"
        android:background="@android:color/holo_blue_light"
        android:layout_below="@+id/button"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/imageView"
        android:id="@+id/container"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">

    </FrameLayout>


</RelativeLayout>

 

 

AndroidMainfest.xml

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.FLASHLIGHT"/>

    
    
    <uses-feature android:name="android.hardware.camera"
                android:required="true" />

 

 

 

현재 앱에서는 필요없다.

        
    <uses-feature android:name="android.hardware.camera"
                android:required="true" />

 

 

 

 

 

 

 

 

 

 

 

 

 

android

 

about author

PHRASE

Level 60  머나먼나라

이길 수 있는 조건이 있으면 진격하고 이기기가 어려운 것을 미리 알면 물러난다. 다해이나 요행을 바라고 행동해서는 안 되는 것이다. -오자

댓글 ( 4)

댓글 남기기

작성