안녕하세요 : )
간단한 후레쉬 앱 만들고 있는데
화면 터치하면 켜지고 거기서 또 터치하면 꺼지고 아주 간단한건데
친구한테 줘보니 자기는 작동이 안된다고 하더라고요;
알고보니 제가쓴 코드가 롤리팝부터는 안되는 거더라고요 ㅠㅠ
롤리팝 부터는 camera2 써야된다고 해서 부랴부랴 코드를 찾아서 넣었는데
Lacking privileges to access camera service 라면서 자꾸 앱이 죽어버리네요;;
매네페스트 설정이 잘못된거 같은데;
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera2" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
여기서 추가해야 할게 있나요?
아래는 플래시 껏다 키는 코드입니다
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rel = (RelativeLayout)findViewById(R.id.back);
relativeLayout = (ImageView)findViewById(R.id.flash);
relativeLayout_one = (ImageView)findViewById(R.id.flash_one);
relativeLayout_two = (ImageView)findViewById(R.id.flash_two);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
try {
init();
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
try{
mCamera = Camera.open(); //카메라 인스턴스를 가져옴
}
catch(Exception e){
Toast.makeText(MainActivity.this, "카메라 오류로 실패하였습니다 :(", Toast.LENGTH_SHORT).show();
}
if(mCamera != null) {
Camera.Parameters params = mCamera.getParameters();
if (mTouch) {
params.setFlashMode(params.FLASH_MODE_TORCH); //카메라 모드 켜기
rel.setBackgroundColor(Color.parseColor("#000000"));
}
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
try{
mCamera = Camera.open(); //카메라 인스턴스를 가져옴
}
catch(Exception e){
// Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
if(mCamera != null){
Camera.Parameters params = mCamera.getParameters();
if(mTouch){
params.setFlashMode(params.FLASH_MODE_TORCH); //카메라 모드 켜기
rel.setBackgroundColor(Color.parseColor("#000000"));
}
else{
params .setFlashMode(params.FLASH_MODE_OFF); // 카메라 모드 끄기
rel.setBackgroundColor(Color.parseColor("#ffffff"));
}
mCamera.setParameters(params); //카메라 (플래쉬) 모드 설정
}
}
@Override
protected void onPause() {
if(mCamera != null){
mCamera.release(); //카메라 인스턴트 해제
mCamera = null;
}
super.onPause();
}
//화면 터치시 토글 모드로 카메라 플래쉬 on/off 하기
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onTouchEvent(MotionEvent event) {
if(mCamera != null){
if(event.getAction() == MotionEvent.ACTION_DOWN){ //화면 터치시
mTouch = !mTouch; //화면 터치 변수 토글
//기본 액티비티 소유의 뷰를 가져옴
Camera.Parameters params = mCamera.getParameters(); //현재 기본 카메라 설정값을 가져옴
if(mTouch) { //이미 터치한 값이 카메라 플래쉬 on 이면
params.setFlashMode(params.FLASH_MODE_TORCH); //카메라 플래쉬 on 설정
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
try {
mBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
mSession.setRepeatingRequest(mBuilder.build(), null, null);
}catch(CameraAccessException e){
e.printStackTrace();
}
}
rel.setBackgroundColor(Color.parseColor("#000000"));
}
else{ //이미 터치한 값이 카메라 플래쉬 off 이면
params .setFlashMode(params.FLASH_MODE_OFF); //카메라 플래쉬 off 설정
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
try {
mBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);
mSession.setRepeatingRequest(mBuilder.build(), null, null);
}catch(CameraAccessException e){
e.printStackTrace();
}
}
}
mCamera.setParameters(params); //카메라 (플래쉬) 모드 설정
}
}
return super.onTouchEvent(event);
}
private CameraManager mCameraManager;
@SuppressWarnings("ResourceType")
private void init() throws CameraAccessException {
mCameraManager = (CameraManager) MainActivity.this.getSystemService(Context.CAMERA_SERVICE);
//here to judge if flash is available
CameraCharacteristics cameraCharacteristics = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cameraCharacteristics = mCameraManager.getCameraCharacteristics("0");
}
boolean flashAvailable = false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
flashAvailable = cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
}
if (flashAvailable) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mCameraManager.openCamera("0", new MyCameraDeviceStateCallback(), null);
}
} else {
Toast.makeText(MainActivity.this, "Flash not available", Toast.LENGTH_SHORT).show();
//todo: throw Exception
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mCameraManager.openCamera("0", new MyCameraDeviceStateCallback(), null);
}
}
private SurfaceTexture mSurfaceTexture;
private Surface mSurface;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
class MyCameraCaptureSessionStateCallback extends CameraCaptureSession.StateCallback {
@Override
public void onConfigured(CameraCaptureSession session) {
mSession = session;
try {
mSession.setRepeatingRequest(mBuilder.build(), null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void close() {
if (mCameraDevice == null || mSession == null) {
return;
}
mSession.close();
mCameraDevice.close();
mCameraDevice = null;
mSession = null;
}
@Override
protected void onDestroy() {
super.onDestroy();
close();
}
}