์นดํ…Œ๊ณ ๋ฆฌ ๋ณด๊ด€๋ฌผ: Android

Android

Android ์นด๋ฉ”๋ผ android.hardware.Camera ์ง€์› ์ค‘๋‹จ๋จ ๋‹น์‹ ์ด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜

๊ฒฝ์šฐ android.hardware.Camera์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋‹น์‹ ์ด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค Camera๋‹ค์Œ, ์–ด๋–ค์ด์— ๋Œ€ํ•œ ๋Œ€์•ˆ์„ ๊ฒƒ์ž…๋‹ˆ๊นŒ?



๋‹ต๋ณ€

API ๋ฌธ์„œ

์— ๋Œ€ํ•œ Android ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ ์— ๋”ฐ๋ฅด๋ฉด android.hardware.Camera๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—๋Š” ์ƒˆ๋กœ์šด android.hardware.camera2 API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค .

์— ๋Œ€ํ•œ ์ •๋ณด ํŽ˜์ด์ง€ android.hardware.camera2(์œ„์— ๋งํฌ ๋จ)์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

android.hardware.camera2 ํŒจํ‚ค์ง€๋Š” Android ๊ธฐ๊ธฐ์— ์—ฐ๊ฒฐ๋œ ๊ฐœ๋ณ„ ์นด๋ฉ”๋ผ ๊ธฐ๊ธฐ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” Camera ํด๋ž˜์Šค๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ

ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜๋ฉด์ด ๋‘ ๊ฐ€์ง€ Camera API์˜ ๊ตฌํ˜„์ด ๋งค์šฐ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์นด๋ฉ”๋ผ ๋ฐฉํ–ฅ ์„ค์ • android.hardware.camera

@Override
public int getOrientation(final int cameraId) {
    Camera.CameraInfo info = new Camera.CameraInfo();
    Camera.getCameraInfo(cameraId, info);
    return info.orientation;
}

๋Œ€ android.hardware.camera2

@Override
public int getOrientation(final int cameraId) {
    try {
        CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
        String[] cameraIds = manager.getCameraIdList();
        CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraIds[cameraId]);
        return characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
    } catch (CameraAccessException e) {
        // TODO handle error properly or pass it on
        return 0;
    }
}

์ด๋กœ ์ธํ•ด ํ•˜๋‚˜์—์„œ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ๋‘ ๊ตฌํ˜„์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ด ๋‹จ์ผ ์ฝ”๋“œ ์˜ˆ์ œ์—์„œ๋Š” ์ด์ „ ์นด๋ฉ”๋ผ API๊ฐ€ int์นด๋ฉ”๋ผ ID์˜ ๊ธฐ๋ณธ ์š”์†Œ ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋ฐ˜๋ฉด ์ƒˆ ์นด๋ฉ”๋ผ API๋Š” String๊ฐ์ฒด ์™€ ํ•จ๊ป˜ ์ž‘๋™ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ด๋ฏธ ํ•ด๊ฒฐํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค . ์ด ์˜ˆ์—์„œ๋Š” int๋ฅผ ์ƒˆ API์˜ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์‹ ์†ํ•˜๊ฒŒ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์นด๋ฉ”๋ผ ๋ฐ˜ํ’ˆ์ด ํ•ญ์ƒ ๋™์ผํ•œ ์ˆœ์„œ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์ด๋ฏธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ฒด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์•„๋งˆ๋„ ๋” ์•ˆ์ „ํ•œ ์ด์ „ int cameraID์˜ String ๊ฐ์ฒด ๋ฐ String ํ‘œํ˜„์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฃผ์œ„์— ํ•˜๋‚˜ ๋–จ์–ด์ ธ

์ด์ œ์ด ํฐ ์ฐจ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ฝ”๋“œ์—์„œ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋‘ ๊ฐ€์ง€ ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋“œ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…๋Ÿ‰์„ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ์นด๋ฉ”๋ผ API๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„์„ ์ œํ•œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋น ๋ฅด๊ฒŒ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๋ž˜ํ•‘ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์—ฌ๊ธฐ์— ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

public interface CameraSupport {
    CameraSupport open(int cameraId);
    int getOrientation(int cameraId);
}

์ด์ œ ์ด์ „ ์นด๋ฉ”๋ผ ํ•˜๋“œ์›จ์–ด API์— ๋Œ€ํ•œ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@SuppressWarnings("deprecation")
public class CameraOld implements CameraSupport {

    private Camera camera;

    @Override
    public CameraSupport open(final int cameraId) {
        this.camera = Camera.open(cameraId);
        return this;
    }

    @Override
    public int getOrientation(final int cameraId) {
       Camera.CameraInfo info = new Camera.CameraInfo();
       Camera.getCameraInfo(cameraId, info);
       return info.orientation;
    }
}

๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ํ•˜๋“œ์›จ์–ด API์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜ :

public class CameraNew implements CameraSupport {

    private CameraDevice camera;
    private CameraManager manager;

    public CameraNew(final Context context) {
        this.manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
    }

    @Override
    public CameraSupport open(final int cameraId) {
        try {
            String[] cameraIds = manager.getCameraIdList();
            manager.openCamera(cameraIds[cameraId], new CameraDevice.StateCallback() {
                @Override
                public void onOpened(CameraDevice camera) {
                    CameraNew.this.camera = camera;
                }

                @Override
                public void onDisconnected(CameraDevice camera) {
                    CameraNew.this.camera = camera;
                    // TODO handle
                }

                @Override
                public void onError(CameraDevice camera, int error) {
                    CameraNew.this.camera = camera;
                    // TODO handle
                }
            }, null);
        } catch (Exception e) {
            // TODO handle
        }
        return this;
    }

    @Override
    public int getOrientation(final int cameraId) {
        try {
            String[] cameraIds = manager.getCameraIdList();
            CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraIds[cameraId]);
            return characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
        } catch (CameraAccessException e) {
            // TODO handle
            return 0;
        }
    }
}

์ ์ ˆํ•œ API๋กœ๋“œ

์ด์ œ ๊ท€ํ•˜ CameraOld๋˜๋Š” CameraNewํด๋ž˜์Šค ๋ฅผ๋กœ๋“œ ํ•˜๋ ค๋ฉด CameraNewAPI ๋ ˆ๋ฒจ 21์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ API ๋ ˆ๋ฒจ์„ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค .

์ด๋ฏธ ์ข…์†์„ฑ ์ฃผ์ž…์„ ์„ค์ • ํ•œ ๊ฒฝ์šฐ CameraSupport๊ตฌํ˜„์„ ์ œ๊ณต ํ•  ๋•Œ ๋ชจ๋“ˆ์—์„œ์ด๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์˜ˆ:

@Module public class CameraModule {

    @Provides
    CameraSupport provideCameraSupport(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            return new CameraNew(context);
        } else {
            return new CameraOld();
        }
    } 
}

DI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ Factory ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ์ ˆํ•œ ๊ฒƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ API ๋ ˆ๋ฒจ์ด ํ™•์ธ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋‹ต๋ณ€

๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉด ํ•˜์—ฌ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์นด๋ฉ”๋ผ API๋ฅผ ํ†ตํ•ด ์ด์ „ ๊ธฐ๊ธฐ๋ฅผ ์ง€์›ํ•˜๊ณ  ํ˜„์žฌ ๊ธฐ๊ธฐ ๋ชจ๋‘์— ์ƒˆ๋กœ์šด Camera2 API๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ๋ฏธ๋ž˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋™์ผํ•œ ๋ฌธ์ œ์— ๋ถ€๋”ช ํ˜”๊ณ  ๋‘ API๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ OOP ์ฃผ์ฒด๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค .

2 ๊ฐœ์˜ API๋Š” ํ˜„์ €ํ•˜๊ฒŒ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ API์— ์ œ๊ณต๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์˜ˆ์ƒํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด์—์„œ ์ด๋“ค์„ ๊ตํ™˜ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ API์—๋Š” ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ฐœ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Google์— ๋Œ€ํ•œ ์‚ฌ๋ž‘์ด ์žˆ์ง€๋งŒ ragnabbit! ์‹ค๋ง ์Šค๋Ÿฝ๋„ค์š”.

๊ทธ๋ž˜์„œ ์•ฑ์— ํ•„์š”ํ•œ ์นด๋ฉ”๋ผ ๊ธฐ๋Šฅ์—๋งŒ ์ดˆ์ ์„ ๋งž์ถ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‘ API์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๋ž˜ํผ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค . ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์นด๋ฉ”๋ผ ํ™œ๋™์ด ์–ด๋–ค ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰๋˜๋Š”์ง€ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ API๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Singleton์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ Android OS ๊ธฐ๊ธฐ์˜ ๊ฒฝ์šฐ ๋‚ด ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ด์ „ API์˜ ๋ž˜ํผ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ตœ์‹  ๊ธฐ๊ธฐ์˜ ๊ฒฝ์šฐ ์ƒˆ API์˜ ๋ž˜ํผ ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ ํ†ค์—๋Š” API ๋ ˆ๋ฒจ์„ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ž˜ํผ ํด๋ž˜์Šค ์—์„œ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉ ํ•˜๋ฏ€๋กœ ์•ฑ์ด Jellybean ๋˜๋Š” Marshmallow์—์„œ ์‹คํ–‰๋˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋™์ผํ•œ ๋ฉ”์„œ๋“œ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ Camera API์—์„œ ํ•„์š”ํ•œ ๊ฒƒ์„ ์•ฑ์— ์ œ๊ณตํ•˜๋Š” ํ•œ; ์นด๋ฉ”๋ผ๋Š” Android์˜ ์ตœ์‹  ๋ฒ„์ „๊ณผ ์ด์ „ ๋ฒ„์ „ ๋ชจ๋‘์—์„œ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์•ฑ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Singleton์€ ๋˜ํ•œ API์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ๋ช‡ ๊ฐ€์ง€ ๊ด€๋ จ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์žฅ์น˜์— ์‹ค์ œ๋กœ ์นด๋ฉ”๋ผ๊ฐ€ ์žˆ๋Š”์ง€ ๊ฐ์ง€ํ•˜๊ณ  ๋ฏธ๋””์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„์ด๋””์–ด๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.


๋‹ต๋ณ€

์ด์ œ android.hardware.camera2๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. android.hardware.Camera๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ API> 23 FlashLight์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

   public class MainActivity extends AppCompatActivity {

     Button button;

     Boolean light=true;

     CameraDevice cameraDevice;

     private CameraManager cameraManager;

     private CameraCharacteristics cameraCharacteristics;

     String cameraId;

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button=(Button)findViewById(R.id.button);
        cameraManager = (CameraManager) 
        getSystemService(Context.CAMERA_SERVICE);
        try {
          cameraId = cameraManager.getCameraIdList()[0];
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(light){
                    try {

                        cameraManager.setTorchMode(cameraId,true);
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }

                    light=false;}
                    else {

                    try {

                      cameraManager.setTorchMode(cameraId,false);
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }


                    light=true;
                    }


            }
        });
    }
}

๋‹ต๋ณ€

์‚ฌ์šฉํ•  ์นด๋ฉ”๋ผ API์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋ถ€์กฑํ•˜๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ํœด๋Œ€ํฐ (์˜ˆ : Samsung Galaxy S6)์€ API ๋ ˆ๋ฒจ 21 ์ด์ƒ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ Camera2 API๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CameraCharacteristics mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId);
Integer level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
if (level == null || level == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
    return false;
}

Camera2Api์˜ CameraManager ํด๋ž˜์Šค์—๋Š” ์นด๋ฉ”๋ผ ํŠน์„ฑ์„ ์ฝ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด ํ˜„๋ช…ํ•œ ์žฅ์น˜๊ฐ€ Camera2 Api๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‹ฌ๊ฐํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž‘๋™ํ•˜๊ฒŒํ•˜๋ ค๋ฉด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž๋™ ํ”Œ๋ž˜์‹œ ์˜ต์…˜์ด ์ผ๋ถ€ ์žฅ์น˜์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ „ํ™”๊ธฐ์˜ ๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜์ค€์ด ์นด๋ฉ”๋ผ์— RuntimeException์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ „ํ™”๊ธฐ๊ฐ€ ์ž˜๋ชป๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นด๋ฉ”๋ผ ID ๋“ฑ

๋”ฐ๋ผ์„œ ์ตœ์„ ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์–ด๋–ค ์ด์œ ๋กœ Camera2๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Camera1์„ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ์‹คํŒจํ•˜๋ฉด Android๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ธฐ๋ณธ ์นด๋ฉ”๋ผ๋ฅผ ์—ด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋Œ€์ฒด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋‹ต๋ณ€

 if ( getActivity().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {

          CameraManager cameraManager=(CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);


           try {
               String cameraId = cameraManager.getCameraIdList()[0];
               cameraManager.setTorchMode(cameraId,true);
           } catch (CameraAccessException e) {
               e.printStackTrace();
           }


 }

๋‹ต๋ณ€


์ด ๊ธ€์€ Android ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ถ„๋ฅ˜๋˜์—ˆ๊ณ  ๋‹˜์— ์˜ํ•ด ์— ์ž‘์„ฑ๋์Šต๋‹ˆ๋‹ค.