마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

camera2 사용법..

0 추천
안녕하세요 : )

간단한 후레쉬 앱 만들고 있는데

화면 터치하면 켜지고 거기서 또 터치하면 꺼지고 아주 간단한건데

친구한테 줘보니 자기는 작동이 안된다고 하더라고요;

알고보니 제가쓴 코드가 롤리팝부터는 안되는 거더라고요 ㅠㅠ

롤리팝 부터는 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();
    }
}
익명사용자 님이 2016년 6월 24일 질문

1개의 답변

0 추천

AndroidManifest에 권한을 넣으신 듯 한데.. 

Runtime permission으로 검색하셔서 권한 획득 로직을 변경 하시면 될 듯 합니다.

 

하지만 궁극적으론 Camera2 API로 갈아타시는 것을 권장합니다.

익명사용자 님이 2016년 6월 24일 답변
답변 감사합니다 :)
카메라 2 API 를 사용하면 이전 버전 폰들에서도 정상 작동 하나요?
...