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

[안드로이드] 사진 찍은거 전송하기

0 추천

사진을 찍고 서버로 전송하는데

제가 가져온 코드는 외부저장소에 저장을 한뒤 서버로 보내는겁니다.

근데 서버에 이미지가 저장되는데 굳이 외부저장소에 저장할 필요가 없습니다.

그런데 코드를 건드리려고 하니까 외부저장소에 저장해야지만 보낼 수 있더라구요.

이게 원래그런건가요? 아니면 외부저장소에 저장하지않고 바로 보낼 수 있나요?

아래는 일부 코드입니다.

private String mCurrentPhotoPath="";
String mImageCaptureName="";

//사진가져오기
private void selectPhoto() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (intent.resolveActivity(getPackageManager()) != null) {
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (photoFile != null) {
                photoUri = FileProvider.getUriForFile(this, getPackageName(), photoFile);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
                startActivityForResult(intent,101);
            }
        }
    }
}

private File createImageFile() throws IOException{
    File dir=new File(Environment.getExternalStorageDirectory()+"/path/");
    if(!dir.exists())
    {
        dir.mkdirs();
    }
    String timeStamp=new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    mImageCaptureName=timeStamp+".jpg";

    File storageDir=new File(Environment.getExternalStorageDirectory().getAbsoluteFile()+"/path/"+mImageCaptureName);
    mCurrentPhotoPath=storageDir.getAbsolutePath();

    return storageDir;
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(resultCode==Activity.RESULT_OK) {
        if (requestCode == 101)     //사진찍기
        {
            getPicturePhoto();
        }
        else if(requestCode==102) //갤러리
        {
            sendPicture(data.getData());
        }
    }
}

//카메라
private void getPicturePhoto()
{

    Bitmap bitmap= BitmapFactory.decodeFile(mCurrentPhotoPath);

    int height=bitmap.getHeight();
    int width=bitmap.getWidth();

    //숫자부분을 수정해 원하는 크기로 변경가능
    bitmap=Bitmap.createScaledBitmap(bitmap,width/10,height/10,true);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);

    byte[] array= stream.toByteArray();
    encoded_string = Base64.encodeToString(array, 0);

    ExifInterface exif=null;
    try{
        exif=new ExifInterface(mCurrentPhotoPath);
    }catch(IOException e)
    {
        e.printStackTrace();
    }
    int exifOrientation;
    int exifDegree;

    if(exif!=null)
    {
        exifOrientation=exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
        exifDegree=exifOrientationToDegrees(exifOrientation);
    }else
    {
        exifDegree=0;
    }

    imageView.setImageBitmap(photoRotate(bitmap,exifDegree));
}

 

g22206 (660 포인트) 님이 2018년 7월 17일 질문

3개의 답변

0 추천
Intent 로 카메라 호출하여 작업하시는데요. 이러면 당연히 파일로 저장되죠.

카메라 부분을 직접 컨트롤 하지 않으시는데 어떻게 데이터만 받아올 수 있겠어요.

케메라 부분을 구현하지 않고 다른 앱에 위임함으로써 이미 사진을 찍고 파일로 저장되는 부분을 컨트롤 할 수 없게 됩니다.

단지 파일 저장하는 경로만 정해줄 뿐이지요.

 

그래서 카메라  호출 -> 사진 파일 체크 -> 서버 전송 구조로 개발 된 것이구요.

만약 카메라 부분을 직접 구현하시면 들어오는 yuv 데이터(raw데이터)를 가지고

직접 jpg, png, 형태의 파일 데이터로 컨버팅하여 서버에 전송하시면 됩니다.

아니면 서버에서 yuv 데이터를 받고 서버에서 직접 파일생성하는 방법도 있습니다
원조안드로이드 (58,190 포인트) 님이 2018년 7월 18일 답변
0 추천
바이트로 전달해서 저장할 수도 있지만, 많이 쓰이지 않는 방식으로 알고 있습니다.

 

외부 스토리지에 저장 후 그 경로를 서버로 전달하여  success 나 fail 떨어지면 지우는 방식도 있지만

중간에 네트워크 단절로 인하여 유저에게 해당 이미지가 보여질 수도 있습니다.

 

따라서  외부 스토리지보다는, 내부 cache 폴더에 저장하여 관리하시는걸 추천드려요.

cache 폴더에 저장하면 본인 앱에서만 접근이 가능하고, 유저에게 보여지지 않으며(루팅하면 보이겠지만.), 앱 삭제시 같이 삭제되거든요.
개발자초심 (21,220 포인트) 님이 2018년 7월 19일 답변
–2 추천
이미지를 저장하지 않으면 메모리 overflow가 발생합니다
prague (26,200 포인트) 님이 2018년 7월 17일 답변
그럼 사진찍고 서버에만 저장해두는 앱들은
외부저장소에 저장했다가 서버에 저장하고 다시 외부저장소 사진을 지우는건가요??
Camera Preview 코드를 보면, 촬영후 jpeg 또는 png(선택가능) Byte Array로 넘어옵니다.
그렇다고 이미지가 저장된 상태는 아닙니다.
Byte Array를 서버로 보내서 (HTTP file upload - 이 부분이 파일이 아닌 bytearray를 서버로 보내주는 라이브러리가 있는지는 확인이 필요. 없으면 직접 구현해야 함.)
서버에서 jpg/png 파일로 저장하고,
클라이언트는 아무것도 안하면 파일로 저장되지는 않습니다.
제 기억에는 그래요. :)
...