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

카메라 이미지뷰 연동 방법 질문..

0 추천
protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
     Intent intent;
     File toFile = null;
     File fromFile = null;
     FileInputStream inputStream = null;
     FileOutputStream outputStream = null;
     
     switch(requestCode){
     
     case REQUEST_CODE_CAMERA:
      if(resultCode == RESULT_CANCELED) return;
      
      if(cropedImageUri != null){
       File f = new File(cropedImageUri.getPath());
       if(f.exists()){
        f.delete();
       }
      }
      
      Uri uriImages = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
      int id = -1;
      
      String[] IMAGE_PROJECTION = {
        MediaStore.Images.ImageColumns.DATA,
        MediaStore.Images.ImageColumns._ID
      };
      
      
      
      try{
       Cursor cursorImages = getContentResolver().query(uriImages, IMAGE_PROJECTION, null, null, null);
       
       if(cursorImages != null && cursorImages.moveToLast()){
        fromFile = new File(cursorImages.getString(0));
        id = cursorImages.getInt(1);
        toast.makeText(getBaseContext(), cursorImages.getString(0), Toast.LENGTH_LONG).show();
        toast.makeText(getBaseContext(), cursorImages.getString(1), Toast.LENGTH_LONG).show();
        cursorImages.close();
       }
      }catch(Exception e){
       e.printStackTrace();
      }
      
      toFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + System.currentTimeMillis() + ".jpg");
      
      try{
       inputStream = new FileInputStream(fromFile);
       outputStream = new FileOutputStream(toFile);
       FileChannel fcin = inputStream.getChannel();
       FileChannel fcout = outputStream.getChannel();
       
       long size = fcin.size();
       
       fcin.transferTo(0, size, fcout);
       
       fcout.close();
       fcin.close();
       outputStream.close();
       inputStream.close();
      }catch(FileNotFoundException e){
       e.printStackTrace();
      }catch(IOException e){
       e.printStackTrace();
      }
      
      fromFile.delete();
      
      getBaseContext().getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.ImageColumns._ID+"="+id, null);
      
      cropedImageUri = Uri.fromFile(toFile);
      
      
      
      intent = new Intent("com.android.camera.action.CROP");
      intent.setDataAndType(cropedImageUri, "image/*");
      intent.putExtra("scale", true);
      intent.putExtra("output", cropedImageUri);
      startActivityForResult(intent, REQUEST_CODE_CROP);
      
      break; //case REQUEST_CODE_CAMERA: 끝남
      
     case REQUEST_CODE_CROP:
      if(resultCode == RESULT_OK)
      {
       ImageView imageView = (ImageView)findViewById(R.id.insertImage);
       imageView.setImageURI(cropedImageUri);
       
      }
      break;
     }
     
        
    }

여기에 있는 카메라 연동 소스보고 따라해 봤는데요. 일단 에뮬레이터에서는 안 돌아가구요.

엘지폰에서는 카메라에서 찍은 화면이 잘 뜹니다. 하지만 베가폰이나 넥서스에서는 엉뚱한 이미지를 불러오는군요.

중간에 원본 삭제 코드가 있어서 사진이 몇개 날아갔습니다. ㅠㅠ

toFile은 제대로 저장되는 걸로 봐서는 이상이 없구요..

문제는 fromFile이 엉뚱한 이미지파일을 불러온다는 것에 있습니다.

제 추측은... 여기서는 MediaStore에서 가장 마지막으로 커서를 보내서 경로를 받아오는데

아무래도 여기에 다른 파일의 정보가 있는 것 같습니다. (순서가 랜덤으로 저장되나요? ㅎ)

cursorImages.getString(0)를 토스트해보니 엉뚱한 파일 경로가 들어가있네요...

그래도 카카오톡 같은 걸 보면 찍은 이미지를 제대로 불러오는 거로 봐서는 방법이 없는 건 아닌거 같은데

머리가 안 돌아가네요. 또 다른 방법은 없나요? 카메라에서 찍은 이미지 경로를 인텐트로 다이렉트로 넘겨주면 참 편할 텐데요...

머리가 (370 포인트) 님이 2014년 5월 6일 질문
머리가님이 2014년 5월 6일 수정

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...