Android Studio

[Android] 카메라 설정 + Flask (2)

ye11 2023. 4. 14. 15:36

이전글 참고

2023.04.14 - [건강최고당/Android Studio] - [Android] 카메라 설정 + Flask

 

[Android] 카메라 설정 + Flask

핸드폰 카메라로 사진을 찍고 플라스크 서버로 보내야한다. 지금 일단 카메라로 찍은 사진이 안보내지는데 ㅠ 일단 한 것 까지 기록해보려고 한다 1. AndroidManifest.xml mainfest태그 내부에 추가해준

yellog03.tistory.com

 

 

 

Mainactivity.java를 분석해보자.

 

 

1. 카메라 호출 

 

btn_capture.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                camera_open_intent();
            }
        });
private void camera_open_intent() {
        Log.d("Camera", "카메라실행!");
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {

            File photoFile = null;

            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                Log.d(TAG, "에러발생!!");
            }

            if (photoFile != null) {
                Uri providerURI = FileProvider.getUriForFile(this, "com.example.camera.fileprovider", photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, providerURI);
                startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
            }

        }
    }

사진찍기 버튼을 누르면  camera_open_intent()가 실행된다.

getPackageManager로 해당 디바이스의 앱 패키지 매지너를 가져오고 resolveActivity 함수를 통해

사용할 수 있는 앱이 있는지 확인한다.

 

createImageFile에서 예외가 발생할 수 있으니 예외 처리를 해주고

 

createImageFile이 성공하면  startActivirtForResult()를 실행하여 카메라 앱에서

캡쳐한 이미지를 받아오기 위해 사용한다.

Uri 보면 EXTRA_OUTPUT으로 설정해서 카메라 앱이 찍은 사진을 저장할 파일을

지정할 수 있다.

 

여기가 내 코드의 문제점이라고.. 생각중임.

 

 

 

 

 

2. 이미지 파일 생성 

private File createImageFile() throws IOException {

        Log.d(TAG, "ceateImage 들어오기 >> ");

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";

        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(imageFileName, ".jpg", storageDir);

        Log.d(TAG, "사진저장>> "+storageDir.toString());

        currentPhotoPath = image.getAbsolutePath();

        return image;
    }

현재날짜 시간 등을 저장하고 그것을 이미지 파일 이름으로 지정한다.

File storageDir은 사진을 저장할 디렉토리를 가져온다. 

\Enviroment.DIRECTORY_PICTURES는 사진 저장되는데 사용되는 표준 이름이다.

 

 

 

3. 갤러리 버튼

btn_gallery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                gallery_open_intent();
            }
        });
private void gallery_open_intent() {
        Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(galleryIntent, GET_GALLERY_IMAGE);
    }

 

galleryIntent 에 갤러리 앱의 외부저장소에 있는 이미지들을 나타내는 URI를 넣고,

startActivityForResult() 메서드를 사용하여 실행한다.

 

 

4. 이미지 전송

 

btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progress = new ProgressDialog(MainActivity.this);
                progress.setMessage("Uploading...");
                progress.show();

                sendImage();
            }
        });
    private void sendImage() {

        //비트맵 이미지를 byte로 변환 -> base64형태로 변환
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] imageBytes = baos.toByteArray();
        imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);


        //base64형태로 변환된 이미지 데이터를 플라스크 서버로 전송
        String flask_url = "http://172.30.1.6:5000/sendFrame";
        StringRequest request = new StringRequest(Request.Method.POST, flask_url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        progress.dismiss();
                        if(response.equals("true")){
                            Toast.makeText(MainActivity.this, "Uploaded Successful", Toast.LENGTH_LONG).show();
                        }
                        else{
                            Toast.makeText(MainActivity.this, "Some error occurred!", Toast.LENGTH_LONG).show();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        progress.dismiss();
                        Toast.makeText(MainActivity.this, "Some error occurred -> "+error, Toast.LENGTH_LONG).show();
                    }
                }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("image", imageString);

                return params;
            }
        };

        queue.add(request);
    }

 

일단 비트맵 이미지 형식을 -> byte -> base64로 인코딩 한다음에

map 형식으로 만든다. 그다음에 원하는 주소를 적고 Flask로 보내주면 된다 ~!