Como faço para salvar os dados da câmera para o disco usando MediaStore no Android?

votos
10

Para o meu pedido, eu estava usando minha própria classe Camera para tirar fotos e meu próprio banco de dados, mas em breve eu não podia realmente acompanhar as mudanças e eu decidi usar o construída em aplicativo de câmera em Android para fazer o trabalho, mas Eu não consigo para obtê-lo para salvar o arquivo. O que estou perdendo aqui? O aplicativo parece para salvar o arquivo, mas é apenas a 0 bytes. Olhei para o código-fonte da aplicação Câmara e está procurando o output em Extras para salvar o arquivo. Qualquer ajuda seria muito apreciada.

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());
        }
    }


}
Publicado 16/03/2009 em 03:22
fonte usuário
Em outras línguas...                            


5 respostas

votos
14

Isso funcionou com o seguinte código, concedido eu estava sendo um pouco idiota com a última. Eu ainda acho que tem que haver uma maneira melhor para que a imagem original ainda está guardado em algum lugar. Ainda me envia a imagem em tamanho menor de 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) {
            //
        }
    }
}

Além disso, eu sei que a liberação queque do Android deve corrigir o tamanho pequena imagem em breve.

Respondeu 16/03/2009 em 04:31
fonte usuário

votos
6

O código abaixo irá iniciar a câmera padrão e ter a câmera salvar a imagem para o URI especificado. A chave é colocar o extra "MediaStore.EXTRA_OUTPUT", juntamente com o URI desejado.

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);
Respondeu 01/09/2011 em 22:20
fonte usuário

votos
4

FYI, achei essa mensagem em docs: O chamador pode passar um EXTRA_OUTPUT extra para controlar onde esta imagem vai ser escrito. Se o EXTRA_OUTPUT não estiver presente, em seguida, uma imagem de tamanho pequeno é retornado como um objeto Bitmap no campo extra. Isso é útil para aplicações que só precisam de uma pequena imagem. Se o EXTRA_OUTPUT está presente, então a imagem em tamanho normal será escrito ao valor Uri de EXTRA_OUTPUT.

localizado aqui: http://developer.android.com/reference/android/provider/MediaStore.html

de modo que o aplicativo pode salvar a imagem em tamanho completo para você, se você dizer onde.

** Edit: Este não é o caso com os dispositivos HTC. HTC (não nexo) que usa interface Sense HTC têm ramificações a partir do Android 1.5 e realizar um bug que sempre salvar a imagem em baixa resolução. você pode actividade almoço para a câmera e usar a função social de câmera para usar a imagem de tamanho completo.

Respondeu 28/06/2010 em 08:25
fonte usuário

votos
4

Em sua primeira tentativa, pode ser que a aplicação Câmara trava quando ele lê o "output" extra, uma vez que espera que seja um Uri, enquanto você fornecer uma String. O aplicativo da câmera parece ler a bandeira extra após capturar a foto. Você deve apenas fornecer uri, e não uri.getPath (). Então, uma vez que você já sabe o URI para a foto, não vai ser devolvido na chamada onResult. É preciso lembrar o URI em uma variável de membro.

Na segunda tentativa Você vai ter uma reduzida (50%) bitmap de volta. Destina-se principalmente para a vista. Eu acho que o bitmap de tamanho completo é muito grande para o orçamento de memória do aplicativo. Esta pode ser a razão para o downscale.

Respondeu 24/08/2009 em 12:57
fonte usuário

votos
0

Eu tenho o mesmo problema com o emulador, eu tentei em um telefone real, uma funcionou, talvez seja porque o telefone virtual não pode realmente ter Picures.

Respondeu 25/03/2010 em 18:53
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more