이전 손전등 제어를 하기 위해서는 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)
'개발 > Android' 카테고리의 다른 글
[안드로이드] Android에서 타이틀바(TitleBar) 없애기 (0) | 2020.06.26 |
---|---|
[안드로이드] 애드몹(adMob) 내 앱에 광고 달기 #1 - 애드몹계정설정 (0) | 2020.06.26 |
[안드로이드] 구글플레이 개발자 등록하기 (0) | 2020.06.26 |
[손전등 어플 만들기 #3] 모스부호 변환하여 깜빡이기 (TreeMap, TextView 예제) (0) | 2020.06.26 |
[손전등 어플 만들기 #2] SeekBar를 사용하여 깜빡임 조절하기(SeekBar api) (0) | 2020.06.26 |