Comment enregistrer des données de l'appareil photo sur un disque à l'aide de MediaStore sur Android?

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

Question

Pour mon application, j'avais déjà utilisé ma propre classe d'appareils photo pour prendre des images et ma propre base de données, mais je ne pouvais pas me tenir au courant des modifications et j'ai décidé d'utiliser l'application appareil photo intégré dans Android pour effectuer les tâches suivantes. travail, mais je ne semble pas pouvoir l'obtenir pour enregistrer le fichier. Qu'est-ce que j'oublie ici? L'application semble enregistrer le fichier mais il ne s'agit que de 0 octet. J'ai consulté le code source de l'application Caméra et elle a recherché le "résultat". dans Extras pour enregistrer le fichier. Toute aide serait grandement appréciée.

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


}
Était-ce utile?

La solution

Cela fonctionnait avec le code suivant, en admettant que j'étais un peu stupide avec le dernier. Je pense toujours qu'il doit y avoir un meilleur moyen pour que l'image originale soit encore enregistrée quelque part. Il m'envoie toujours la plus petite image 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) {
            //
        }
    }
}

De plus, je sais que la version cupcake d'Android devrait bientôt corriger la petite taille de l'image.

Autres conseils

Le code ci-dessous démarrera la caméra par défaut et lui permettra de sauvegarder l'image dans l'URI spécifié. L'important est de placer le supplément "MediaStore.EXTRA_OUTPUT" " avec l'uri désiré.

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

Lors de votre première tentative, il se peut que l'application Caméra se bloque lors de la lecture de votre "sortie". extra, puisqu'il s'attend à ce que ce soit un Uri, alors que vous fournissez une chaîne. L'application Appareil photo semble lire le drapeau supplémentaire après avoir capturé la photo. Vous devriez simplement fournir uri, et pas uri.getPath (). Ensuite, puisque vous connaissez déjà l'URI de la photo, celle-ci ne sera pas renvoyée dans l'appel onResult. Vous devez vous rappeler l'URI dans une variable membre.

Lors de la deuxième tentative, vous obtiendrez un bitmap réduit (50%). Il est principalement destiné aux vues. Je pense que le bitmap complet est trop volumineux pour le budget mémoire de l'application. C’est peut-être la raison de la décroissance.

FYI, trouvé ceci sur la documentation: L'appelant peut passer un EXTRA_OUTPUT supplémentaire pour contrôler l'emplacement où cette image sera écrite. Si EXTRA_OUTPUT n'est pas présent, une image de petite taille est renvoyée sous forme d'objet Bitmap dans le champ supplémentaire. Ceci est utile pour les applications nécessitant seulement une petite image. Si EXTRA_OUTPUT est présent, l’image de taille normale sera écrite dans la valeur Uri de EXTRA_OUTPUT.

situé ici: http://developer.android.com/reference/ android / provider / MediaStore.html

afin que l'application puisse enregistrer une image en taille réelle pour vous, si vous lui indiquez où.

** Modifier: ce n'est pas le cas avec les appareils HTC. HTC (pas de lien) qui utilise htc sense ui s'est branché à partir d'Android 1.5 et comporte un bug qui enregistre toujours l'image en basse résolution. vous pouvez organiser une activité pour la caméra et utiliser la fonction de partage de la caméra pour utiliser une image de taille normale.

J'ai le même problème avec l'émulateur, Je l'ai essayé sur un vrai téléphone et ça a marché, c'est peut-être parce que le téléphone virtuel ne peut pas vraiment prendre des photos.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top