본문 바로가기

개발/Android

[손전등 어플 만들기 #1] 플래시 켜기/끄기 - Flashlight API

이전 손전등 제어를 하기 위해서는 camera의 권한을 받아와야만 했지만,

Android 6.0 (Marshmello, API level 23) 이상부터는 손전등만을 위한 Flashlight API가 추가되어 카메라 등 다른 권한을 필요로 하지 않는다.

 

 

private static CameraManager mCameraManager;
private static ImageButton mImageButtonFlashOnOff;
private static boolean mFlashOn = false;    

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

        initFlashlight();

        // button turn on off
        mImageButtonFlashOnOff = findViewById(R.id.ibFlashOnoff);
        mImageButtonFlashOnOff.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mFlashOn) {
                    flashLightOff();
                } else {
                    flashLightOn();
                }
            }
        });
}

 

우선 초기화 부분에서 camera의 flash 기능이 있는지 체크해 주고, 없으면 토스트를 띄우고 종료시킨다.

기능이 있으면 CameraManager 객체를 생성하고 이 객체를 통해 카메라들 특성을 구하여, 카메라 id를 구한다.

 

   void initFlashlight() {
        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
            Toast.makeText(getApplicationContext(), "This device is not support camera flash.\n The app will be terminated!", Toast.LENGTH_LONG).show();
            delayedFinish();
            return;
        }

        mCameraManager = (CameraManager) getSystemService(CAMERA_SERVICE);

        if (mCameraId == null) {
            try {
                for (String id : mCameraManager.getCameraIdList()) {
                    CameraCharacteristics c = mCameraManager.getCameraCharacteristics(id);
                    Boolean flashAvailable = c.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
                    Integer lensFacing = c.get(CameraCharacteristics.LENS_FACING);
                    if (flashAvailable != null && lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
                        mCameraId = id;
                        break;
                    }
                }
            } catch (CameraAccessException e) {
                mCameraId = null;
                e.printStackTrace();
                return;
            }
        }
    }

 

 

이후 setTorchMode API를 통하여 flash의 on off를 제어해주고, 그에 상응하여 버튼의 이미지도 변환시켜 준다.

주석처리된 stopFilcker()와 stopSOS()는 이후 페이지에서 다룰 Thread를 이용한 깜빡이와, 모스부호 SOS 깜빡임 구현에 필요한 함수이다.

 

    public void flashLightOn() {
        mFlashOn = true;
        try {
            mCameraManager.setTorchMode(mCameraId, true);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        mImageButtonFlashOnOff.setImageResource(android.R.drawable.presence_online);
    }

    public void flashLightOff() {
        mFlashOn = false;
        //stopFlicker();
        //stopSOS();
        try {
            mCameraManager.setTorchMode(mCameraId, false);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        mImageButtonFlashOnOff.setImageResource(android.R.drawable.presence_invisible);
    }
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context=".MainActivity">

    <ImageButton
        android:id="@+id/ibFlashOnoff"
        android:layout_width="55dp"
        android:layout_height="0dp"
        android:layout_marginBottom="216dp"
        android:contentDescription="flashButton"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:srcCompat="@android:drawable/presence_invisible" />


</android.support.constraint.ConstraintLayout>

 

다음 포스트 :

 

[손전등 어플 만들기 #2] SeekBar를 사용하여 깜빡임 조절하기(SeekBar api)

 

[손전등 어플 만들기 #2] SeekBar를 사용하여 깜빡임 조절하기(SeekBar api)

SeekBar를 사용하여 손전등 깜빡임을 제어해 보겠다. SeekBar는 SeekBar.setOnSeekBarChangeListener()를 통해 하기의 3개의 이벤트에 대해 noti를 받을 수 있다. 1. onStartTrackingTouch()  : 최초 터치하여 드..

gozz123.tistory.com