web-dev-qa-db-fra.com

Comment capturer une image et la stocker avec l'appareil photo Android Android

J'ai un problème pour capturer une image et la stocker depuis l'application d'appareil photo natif. Voici un exemple de certains de mes codes.

_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 );

Une fois la photo prise et je reviens à mon activité d'origine, lorsque je navigue vers ma carte SD via Android Explorateur de fichiers DDMS, la photo n'est pas là. Quelqu'un sait pourquoi ce n'est pas le cas être sauvé?

35
ninjasense

Avez-vous vérifié la sortie de Environment.getExternalStorageDirectory (), car si elle ne contient pas de séparateur de fichier de fin (/), votre image se retrouvera dans un répertoire qui ne réside pas sur la carte SD, tel que:

 /mnt/sdcardmake_machine_example.jpg

Quand ce que vous voulez vraiment, c'est:

 /mnt/sdcard/make_machine_example.jpg

Essayez plutôt ce code:

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

Voici le produit final au cas où quelqu'un visiterait encore ce fil:

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

    }

}
27
ninjasense

1 . Utilisez simplement

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

et ne vous souciez pas des séparateurs.

2. Face au même problème avant. Les téléphones SenseUI ont une application d'appareil photo personnalisée qui ne crée pas de fichier. Quel appareil utilisez-vous? Il est peut-être déjà corrigé dans les derniers appareils, mais il peut également être un problème. Voici donc un exemple complet comment le surmonter Problèmes d'enregistrement d'une photo dans un fichier .

14
Fedor

Vous devez effectuer une numérisation des supports après avoir enregistré l'image

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