Pergunta

Estou tendo problemas para capturar uma imagem e armazená -la no aplicativo de câmera nativa. Aqui está uma amostra de parte do meu código.

_path = Environment.getExternalStorageDirectory() + "make_machine_example.jpg";
File file = new File( _path );
Uri outputFileUri = Uri.fromFile( file );

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

startActivityForResult( intent, 0 );

Depois que a foto foi tirada e volto à minha atividade original, quando navego para o meu cartão SD via Android DDMS File Explorer, a imagem não está lá. Alguém sabe por que isso não está sendo salvo?

Foi útil?

Solução

Você verificou qual é a saída do Environment.GetexternalStorAgedirectory (), porque se não contiver um arquivo de arquivo à direita (/), sua imagem acabará em um diretório que não reside no SDCARD como:

 /mnt/sdcardmake_machine_example.jpg

Quando o que você realmente quer é:

 /mnt/sdcard/make_machine_example.jpg

Experimente este código em vez disso:

 _path = Environment.getExternalStorageDirectory() + File.separator +  "make_machine_example.jpg";

Outras dicas

Aqui estava o produto final, caso alguém ainda esteja visitando este tópico:

public class CameraCapture extends Activity {

    protected boolean _taken = true;
    File sdImageMainDirectory;

    protected static final String PHOTO_TAKEN = "photo_taken";

    @Override
    public void onCreate(Bundle savedInstanceState) {

        try {

            super.onCreate(savedInstanceState);         
                    File root = new File(Environment
                            .getExternalStorageDirectory()
                            + File.separator + "myDir" + File.separator);
                    root.mkdirs();
                    sdImageMainDirectory = new File(root, "myPicName");


                startCameraActivity();
            }
        } catch (Exception e) {
            finish();
            Toast.makeText(this, "Error occured. Please try again later.",
                    Toast.LENGTH_SHORT).show();
        }

    }

    protected void startCameraActivity() {

        Uri outputFileUri = Uri.fromFile(sdImageMainDirectory);

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

        startActivityForResult(intent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (resultCode) {
        case 0:
            finish();
            break;

        case -1:

            try {
                StoreImage(this, Uri.parse(data.toURI()),
                        sdImageMainDirectory);
            } catch (Exception e) {
                e.printStackTrace();
            }

            finish();
            startActivity(new Intent(CameraCapture.this, Home.class));

        }

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) {
            _taken = true;
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken);
    }

        public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) {
        Bitmap bm = null;
        try {
            bm = Media.getBitmap(mContext.getContentResolver(), imageLoc);
            FileOutputStream out = new FileOutputStream(imageDir);
            bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
            bm.recycle();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

1. Apenas use

new File(Environment.getExternalStorageDirectory(),  "make_machine_example.jpg");

E não se preocupe com os separadores.

2. Enfrentou o mesmo problema antes. Os telefones SenseUi possuem um aplicativo de câmera personalizado que não cria arquivo. Que dispositivo você está utilizando? Ele já pode ser corrigido nos dispositivos mais recentes, mas também pode ser um problema. Então, aqui está uma amostra completa de como superá -lo Problemas salvar uma foto em um arquivo.

Você deve realizar uma digitalização de mídia depois de salvar a imagem

 sendBroadcast(new Intent(
            Intent.ACTION_MEDIA_MOUNTED,
            Uri.parse("file://" + Environment.getExternalStorageDirectory())));

Adicione esta linha no arquivo androidmanifest.xml e remova a extensão make_machine_example:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Começará a capturar a foto e armazenar no SDCARD.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top