Android의 Medicstore를 사용하여 카메라에서 디스크로 데이터를 저장하려면 어떻게합니까?

StackOverflow https://stackoverflow.com/questions/649057

문제

내 응용 프로그램의 경우 이미지와 데이터베이스를 촬영하기 위해 카메라 클래스를 사용하고 있었지만 곧 변경 사항을 따라 잡을 수 없었고 Android의 내장 카메라 응용 프로그램을 사용하여 작업을 수행하기로 결정했습니다. 파일을 저장할 수없는 것 같습니다. 내가 여기서 무엇을 놓치고 있습니까? 응용 프로그램은 파일을 저장하는 것처럼 보이지만 단지 0 바이트입니다. 카메라 애플리케이션의 소스 코드를 찾았으며 파일을 저장하기 위해 엑스트라에서 "출력"을 찾고 있습니다. 모든 도움은 대단히 감사하겠습니다.

Public class CameraTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button cameraButton = (Button) findViewById(R.id.cameraButton);
        cameraButton.setOnClickListener( new OnClickListener(){
            public void onClick(View v ){
                ContentValues values = new ContentValues();
                values.put(Images.Media.TITLE, "title");
                values.put(Images.Media.BUCKET_ID, "test");
                values.put(Images.Media.DESCRIPTION, "test Image taken");
                Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra("output", uri.getPath());
                startActivityForResult(intent,0);
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode== 0 && resultCode == Activity.RESULT_OK){
            ((ImageView)findViewById(R.id.pictureView)).setImageURI(data.getData());
        }
    }


}
도움이 되었습니까?

해결책

이것은 다음 코드와 함께 작동했습니다. 나는 여전히 원본 이미지가 여전히 어딘가에 저장되도록 더 나은 방법이 있어야한다고 생각합니다. 여전히 더 작은 25% 크기의 이미지를 보냅니다.

public class CameraTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button cameraButton = (Button) findViewById(R.id.cameraButton);
    cameraButton.setOnClickListener( new OnClickListener(){
        public void onClick(View v ){

            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");

            startActivityForResult(intent,0);
        }
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode== 0 && resultCode == Activity.RESULT_OK) {
        Bitmap x = (Bitmap) data.getExtras().get("data");
        ((ImageView)findViewById(R.id.pictureView)).setImageBitmap(x);
        ContentValues values = new ContentValues();
        values.put(Images.Media.TITLE, "title");
        values.put(Images.Media.BUCKET_ID, "test");
        values.put(Images.Media.DESCRIPTION, "test Image taken");
        values.put(Images.Media.MIME_TYPE, "image/jpeg");
        Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
        OutputStream outstream;
        try {
            outstream = getContentResolver().openOutputStream(uri);
            x.compress(Bitmap.CompressFormat.JPEG, 70, outstream);
            outstream.close();
        } catch (FileNotFoundException e) {
            //
        } catch (IOException e) {
            //
        }
    }
}

또한 Android의 컵 케이크 릴리스가 곧 작은 이미지 크기를 수정해야한다는 것을 알고 있습니다.

다른 팁

아래 코드는 기본 카메라를 시작하고 카메라에 이미지를 지정된 URI에 저장하도록합니다. 열쇠는 추가 "medicstore.extra_output"를 원하는 URI와 함께 배치하는 것입니다.

File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/" + image_name + ".jpg");
Uri imageUri = Uri.fromFile(file);

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

startActivityForResult(intent, 0);

첫 번째 시도에서 카메라 앱이 "출력"추가를 읽을 때 충돌 할 수 있습니다. 문자열을 제공하는 동안 URI가 될 것으로 예상되기 때문입니다. 카메라 앱은 사진을 캡처 한 후 여분의 깃발을 읽는 것 같습니다. uri.getPath ()가 아닌 URI를 제공해야합니다. 그런 다음 사진에 대한 URI를 이미 알고 있으므로 OnResult 호출로 반환되지 않습니다. 회원 변수에서 URI를 기억해야합니다.

두 번째 시도에서는 스케일링 (50%) 비트 맵을 다시 얻게됩니다. 주로보기를위한 것입니다. 전체 크기의 비트 맵이 응용 프로그램의 메모리 예산에 비해 너무 크다고 생각합니다. 이것이 다운 스케일의 이유 일 수 있습니다.

참고로, 문서에서 이것을 찾았습니다. 발신자는이 이미지가 작성 될 위치를 제어하기 위해 추가 엑스트라 _output을 전달할 수 있습니다. extra_output이 존재하지 않으면 추가 필드에서 작은 크기의 이미지가 비트 맵 객체로 반환됩니다. 이것은 작은 이미지 만 필요한 응용 프로그램에 유용합니다. extra_output이 있으면 전체 크기의 이미지가 extra_output의 URI 값에 기록됩니다.

여기에 위치 :http://developer.android.com/reference/android/provider/mediastore.html

따라서 앱이 어디에 있는지 말하면 전체 크기의 이미지를 저장할 수 있습니다.

** 편집 : 이것은 HTC 장치의 경우가 아닙니다. HTC Sense UI를 사용하는 HTC (Nexus)는 Android 1.5에서 분기되었으며 항상 저항으로 이미지를 저장하는 버그를 가지고 있습니다. 카메라에 대한 점심 활동을하고 카메라의 공유 기능을 사용하여 전체 크기의 이미지를 사용 할 수 있습니다.

나는 에뮬레이터와 같은 문제를 겪었고, 실제 전화에서 그것을 사용해 보았을 것입니다. 아마도 가상 전화가 실제로 사진을 찍을 수 없기 때문일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top