2011-01-18 2 views
4

기본 Android 카메라를 시작하고 지정된 위치에 이미지를 저장하고 싶습니다. 문제는 사진을 클릭하면 미리보기에 저장/삭제 옵션이 나타납니다. 저장을 클릭하면 카메라가 다시 시작되고 캡처 한 이미지가 지정된 위치에 저장되지 않습니다. 오히려 기본 위치에 저장됩니다. 사실 내가 클릭 한 이미지의 위치가 필요합니다. 다음은 카메라를 실행하는 데 사용하는 코드입니다.기본 카메라를 사용하여 Android 저장 이미지

MediaScannerConnection_MSC = null; 
String fileName = String.valueOf(System.currentTimeMillis())+".jpg"; 
f = new File(Environment.getExternalStorageDirectory(), fileName); 
_imageUri = Uri.fromFile(f); 
// create new Intent 
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, _imageUri); 
startActivityForResult(intent, 1); 

자, 내가이 일에 대한 높고 낮은 검색 한,

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 1) { 
      if (resultCode == RESULT_OK) { 
       // use imageUri here to access the image 

       final String imagePath = f.getAbsolutePath(); 
       _MSC = new MediaScannerConnection(this, new MediaScannerConnectionClient() { 

        public void onMediaScannerConnected() { 
         _MSC.scanFile(imagePath, null); 
        } 

        public void onScanCompleted(String path, Uri uri) { 
         _MSC.disconnect(); 
         _MSC = null; 
        } 

       }); 
       _MSC.connect(); 

      } 
     } 
    } 

내가 여기에 내가 대답을 생각

+0

나는 매우 비슷한 질문이 있습니다. 누구든지이 답변을 수 있습니까? –

답변

2

을 어떤 실수를하고있는 중이 야 카메라에서 돌아온 후 코드의 좀 까다 롭습니다. 모든

첫째, 나는,

intent.putExtra(MediaStore.EXTRA_OUTPUT, _imageUri); 

당신이이기 그래서 내 최선의 대답은, 대신 "EXTRA_OUTPUT"플래그를 설정하지 :-(무시, 특정 휴대폰에 생각 . 정상적으로 실행 URI 그런 다음, 거기에서 사용 새 사진을 돌려 보자 거기에서 다음

Uri u = intent.getData(); 

새 사진의 정보를 얻으려면, 나는 새로운 locati에 이미지 파일을 작성하는 FileOutputStream 또는를 사용 나는 그것을 가지고 싶다. 그런 다음 마지막으로 원본 파일을 삭제합니다. :-)

나는 그것이 일종의 호키족이라는 것을 알고있다. 그러나 그것은 작동한다. 그리고 나는 그것이 꽤 신뢰할 만하다고 생각한다. :-)

도움이 되었기를 바랍니다. :-) J @llango

-Jared

8-28-11

아니라, 여기 당신이 경우 복사하여 붙여 볼 환영합니다, 전체 코드입니다, 확인 당신이이 우선 들어

:-) 작업을 얻을 수 있습니다, 당신은 다음과 같이 카메라를 호출 할 것이다

startActivityForResult(CameraIntent, TAKE_PICTURE); 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    if (resultCode == Activity.RESULT_OK) { 
     switch (requestCode) { 
     case TAKE_PICTURE: 
      Uri u = intent.getData(); 
      //Toast.makeText(getApplicationContext(), u.getPath(), Toast.LENGTH_SHORT).show(); 
      WriteFiles(u); 
      break; 

     } 
    } 
} 

을 그리고 주요 마법이 기능에서 발생 : 414,다음, 결과를 당신이 원하는 것 내가 그 당신이를 사용하여 저장하기 위해 필요한 모든 부품 생각

private void WriteFiles(Uri myNewPic) { 
    String TempFilePath; 
    String TempPath; 

    File directory = new File("/sdcard/" + getString(R.string.app_name)); 

    if (!directory.exists()) { 
     directory.mkdirs(); 
    } 

    String TempPictureFile; 
    try { 
     TempPictureFile = myNewPic.getLastPathSegment() + ".jpg"; 
     TempFilePath = directory.getPath() + "/" + TempPictureFile; 
     FileOutputStream myOutStream = new FileOutputStream(TempFilePath); 
     InputStream myInStream = getContentResolver().openInputStream(myNewPic); 
     FileIO myFileIO = new FileIO(); 
     myFileIO.copy(myInStream, myOutStream); 
     //now delete the file after copying 
     getContentResolver().delete(myNewPic, null, null); 
     TempFilePaths.add(TempFilePath); 
    } catch (Exception e) { 
     Toast.makeText(getApplicationContext(), getString(R.string.ErrorOpeningFileOutput), Toast.LENGTH_SHORT).show(); 
    } 
} 

네이티브 카메라 앱. 그러나, 나는이 코드를 포기할 때까지 결국 당신을 경계해야한다. 왜냐하면 내가 제공 한 것보다 더 많은 융통성과 의존성이 필요하기 때문이다. (나는이 전화기를 여러 대의 전화기에서 사용한다면 한 가지 이유로 문제가 있다는 것을 알 수있다. 예를 들어 삼성의 UI 사용자 정의로 인해 많은 문제가 발생 했으므로 모든 전화기에서 작동하지만 삼성에서는 문제가 없습니다. 그래서 나는 내 카메라 앱을 만들었지 만, 응용 프로그램에 따라 잘 될지도 모르겠다. 어느쪽으로 든 .... 행운을 빌어 요!:-)

이 좋아, 여기 내가 사용하는 내 파일 입출력 클래스입니다, 죄송합니다 내가 처음이 포함되지 않았다

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.util.Log; 

public class FileIO { 
private static final int BUFFER_SIZE = 1024 * 2; 

public FileIO() { 
    // Utility class. 
} 

public int copy(InputStream input, OutputStream output) throws Exception, IOException { 
    byte[] buffer = new byte[BUFFER_SIZE]; 

    BufferedInputStream in = new BufferedInputStream(input, BUFFER_SIZE); 
    BufferedOutputStream out = new BufferedOutputStream(output, BUFFER_SIZE); 
    int count = 0, n = 0; 
    try { 
     while ((n = in.read(buffer, 0, BUFFER_SIZE)) != -1) { 
      out.write(buffer, 0, n); 
      count += n; 
     } 
     out.flush(); 
    } finally { 
     try { 
      out.close(); 
     } catch (IOException e) { 
      Log.e(e.getMessage(), null); 
     } 
     try { 
      in.close(); 
     } catch (IOException e) { 
      Log.e(e.getMessage(), null); 
     } 
    } 
    return count; 
} 

} 
+0

알았어요. 시도해 보시고 어떻게되는지 보여 드리겠습니다. – pankajagarwal

+0

시도했지만 작동하지 않았습니다. –

+0

@llango J, 코드를 수정하여 확장하여 앱에 복사하여 붙여 넣을 수 있습니다. 그것이 당신을 위해 그것을 해결하지 않으면 알려 주시기 바랍니다. :-) – Jared

관련 문제