[Android] 카메라 설정 + Flask (2)
이전글 참고
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로 보내주면 된다 ~!