Skip to content

Latest commit

ย 

History

History
127 lines (91 loc) ยท 4.95 KB

File metadata and controls

127 lines (91 loc) ยท 4.95 KB

Custom-Camera-Android

์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋ฉด ์นด๋ฉ”๋ผ๋ฅผ ์ข…์ข… ์‚ฌ์šฉํ•  ์ผ์ด ์žˆ๋‹ค. ์นด๋ฉ”๋ผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ๋‘ ๊ฐ€์ง€์˜ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค. ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ Intent ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด ๋‚ด์žฅ ์นด๋ฉ”๋ผ ์•ฑ์œผ๋กœ ์บก์ณ๋œ ์ด๋ฏธ์ง€ ํ˜น์€ ์˜์ƒ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๋‹ค. ์‹ฌํ”Œํ•˜๊ฒŒ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์›ํ•˜๋Š” ์ด๋ฏธ์ง€ ํ˜น์€ ์˜์ƒ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ ์ด๋ฅผ ์ปค์Šคํ…€ํ•˜๊ฒŒ ์‚ฌ์šฉ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‘๋ฒˆ ์งธ ๋ฐฉ๋ฒ•์ธ Camera ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์นด๋ฉ”๋ผ๋ฅผ ์กฐ๊ธˆ ๋” ๋‚ด๊ฐ€ ์›ํ•˜๋Š”๋Œ€๋กœ ์ปค์Šคํ…€ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ ๊ฒƒ ์ด๋‹ค.

1. Camera

Camera class๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ์ฒด ์„ ์–ธ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Camera camera = Camera.open();

2. SurfaceView

Camera๋ฅผ SurfaceView๋ฅผ ํ†ตํ•ด ์•ฑ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์นด๋ฉ”๋ผ๊ฐ€ ๋‚ด ์•ฑ์˜ ํ™”๋ฉด์— ํ‘œ์‹œ๋œ๋‹ค.

SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceVew);
camera.setPreviewDisplay(surfaceView.getHolder());
camera.startPreview();

3. Camera.Parameters

์•ˆ๋“œ๋กœ์ด๋“œ ๊ธฐ๊ธฐ๋Š” ์นด๋ฉ”๋ผ์˜ ์‚ฌ์–‘, ํ•ด์ƒ๋„๋งˆ๋‹ค ์ง€์›ํ•˜๋Š” ์ง€์›ํ•˜๋Š” ์ด๋ฏธ์ง€ ํ˜น์€ ์˜์ƒ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋ชจ๋‘ ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ์•ฑ์ด ์„ค์น˜๋œ ๊ธฐ๊ธฐ์˜ ์นด๋ฉ”๋ผ ์‚ฌ์ด์ฆˆ ๊ฐ’์„ ๊ฐ€์ ธ์™€ ์…‹ํŒ…์ด ๋˜๊ฒŒ๋” ํ•ด์•ผ ํ•œ๋‹ค.

1. ์ง€์›ํ•˜๋Š” ์‚ฌ์ด์ฆˆ ๊ตฌํ•˜๊ธฐ

ํ•ด๋‹น ์ฝ”๋“œ๋Š” PreviewSize(์นด๋ฉ”๋ผ๋ฅผ ํ†ตํ•ด ๋ณด์ด๋Š” ํ™”๋ฉด์˜ ํ•ด์ƒ๋„), PictureSize(์ €์žฅ๋˜๋Š” ์ด๋ฏธ์ง€), VideoSize(์ €์žฅ๋˜๋Š” ์˜์ƒ)๋ฅผ ํ†ตํ•ด ์‚ฌ์ด์ฆˆ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

Camera.Parameters parameters = camera.getParameters();

for(Camera.Size size : parameters.getSupportedPreviewSizes()) {
    Log.d(TAG, "PreviewSize = width : " + String.valueOf(size.width) + ", height : " + String.valueOf(size.height));
}

for(Camera.Size size : parameters.getSupportedPictureSizes()) {
    Log.d(TAG, "PictureSize = width : " + String.valueOf(size.width) + ", height : " + String.valueOf(size.height));
}


for(Camera.Size size : parameters.getSupportedVideoSizes()) {
    Log.d(TAG, "VideoSize = width : " + String.valueOf(size.width) + ", height : " + String.valueOf(size.height));
}

Dialog, Fragment ๋“ฑ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ข‹๋‹ค.

2. ์›ํ•˜๋Š” ์‚ฌ์ด์ฆˆ ์ ์šฉํ•˜๊ธฐ

Camera.Parameters parameters = camera.getParameters();

parameters.setPictureSize(pictureWidth, pictureHeight);
parameters.setPreviewSize(previewWidth, previewHeight);

camera.setParameters(parameters);

์˜์ƒ ์‚ฌ์ด์ฆˆ์˜ ๊ฒฝ์šฐ๋Š” MediaRecorder ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํด๋ž˜์Šค ๋‚ด์˜ setVideoSize(int width, int height) ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

4. options, listener

1. zoom

value ์ธ์ž์˜ ๊ฐ’์€ View.OnTouchListener๋ฅผ ํ†ตํ•ด ๊ตฌํ•ด๋‚ด๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค.

camera.setZoomChangeListener(new Camera.OnZoomChangeListener() {
    @Override
    public void onZoomChange(int zoomValue, boolean stopped, Camera camera) {
        //์ฒ˜๋ฆฌ
    }
});
camera.startSmoothZoom(value);

2. auto focus

camera.autoFocus(null); //์ดˆ์  ์กฐ์ ˆ ํ›„์˜ Callback์ด ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ (ex. ํ™”๋ฉด ํ„ฐ์น˜ ์‹œ )

//์ดˆ์  ์กฐ์ ˆ ํ›„์˜ Callback์ด ํ•„์š” ์žˆ๋Š” ๊ฒฝ์šฐ (ex. ์…”ํ„ฐ ํด๋ฆญ ์‹œ)
camera.autoFocus(new Camera.AutoFocusCallback() {
    @Override
    public void onAutoFocus(boolean success, Camera camera) {
        camera.takePicture();
    }
});

5. takePicture

์นด๋ฉ”๋ผ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์—ฌ๋Ÿฌ ๋ฆฌ์Šค๋„ˆ ํ˜น์€ ์˜ต์…˜ ๊ฐ’์„ ์…‹ํŒ…ํ–ˆ์œผ๋ฉด ์‚ฌ์ง„์„ ์ฐ์–ด๋ด์•ผ ํ•œ๋‹ค. Camera.ShtterCallback ์ธ์ž ์œ„์น˜์— null ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋ฉด ์นด๋ฉ”๋ผ๊ฐ€ ์ฐํžˆ๋Š” ์†Œ๋ฆฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์•„๋ž˜๋Š” ๊ฐ„๋‹จํžˆ ์‚ฌ์ง„์„ ์›ํ•˜๋Š” ์œ„์น˜์— ์ €์žฅํ•ด๋ณด๋Š” ์ฝ”๋“œ์ด๋‹ค. ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ์ด๋ฏ€๋กœ ๊ผญ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

camera.takePicture(shutterCallback, null, new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        try {
            Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
            FileOutputStream outputStream = new FileOutputStream(new File(Environment.getExternalStorageDirectory() + "/Download/"+
        new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+".jpg"));

            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);

            outputStream.close();
            camera.startPreview(); //์…”ํ„ฐ์™€ ๋™์‹œ์— ์ฐํžŒ ์ด๋ฏธ์ง€๋กœ ํ™”๋ฉด์ด ๋ฉˆ์ถ”์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๋‹ค์‹œ ์žฌํ‘œ์‹œ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
});

6. ํ”„๋กœ์ ํŠธ

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” MyCamera class๋ฅผ ํ†ตํ•ด ์นด๋ฉ”๋ผ ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋งŒ๋“ค์–ด๋‘์—ˆ๋‹ค. ์ฐธ๊ณ ํ•˜์—ฌ ๋‚˜๋งŒ์˜ ์นด๋ฉ”๋ผ ์•ฑ์„ ๋งŒ๋“ค์–ด๋ณด์ž.