web-dev-qa-db-fra.com

Prendre des photos avec l'appareil photo sur Android par programmation

J'ai créé une application avec un bouton et écrit onClickListener pour ce bouton. J'ai essayé plusieurs exemples de code et aucun d'entre eux n'a fonctionné. Ils ouvrent tous la Android de l'appareil photo et ne prennent pas de photos. Je veux du code que je peux mettre dans mon onClickListener afin que, lorsque j'appuie sur le bouton de l'écran, une photo soit prise. .

Comment puis-je obliger l'appareil photo à prendre une photo lorsque j'appuie sur un bouton dans une activité Android?

56
Kevik

Regardez le code de démonstration suivant.

Voici votre fichier XML pour l'interface utilisateur,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

    <Button
        Android:id="@+id/btnCapture"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Camera" />

</LinearLayout>

Et voici votre fichier Java,

public class CameraDemoActivity extends Activity {
    int TAKE_PHOTO_CODE = 0;
    public static int count = 0;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Here, we are making a folder named picFolder to store
        // pics taken by the camera using this application.
        final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/picFolder/";
        File newdir = new File(dir);
        newdir.mkdirs();

        Button capture = (Button) findViewById(R.id.btnCapture);
        capture.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                // Here, the counter will be incremented each time, and the
                // picture taken by camera will be stored as 1.jpg,2.jpg
                // and likewise.
                count++;
                String file = dir+count+".jpg";
                File newfile = new File(file);
                try {
                    newfile.createNewFile();
                }
                catch (IOException e)
                {
                }

                Uri outputFileUri = Uri.fromFile(newfile);

                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

                startActivityForResult(cameraIntent, TAKE_PHOTO_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) {
            Log.d("CameraDemo", "Pic saved");
        }
    }
}

Note:

Spécifiez les autorisations suivantes dans votre fichier manifeste,

<uses-permission Android:name="Android.permission.CAMERA"/>

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
97
Mehul Joisar

Il y a deux façons de prendre une photo:

1 - Utiliser une intention pour faire une photo

2 - Utiliser l'API de la caméra

Je pense que vous devriez utiliser la deuxième façon et il y a un exemple de code ici pour deux d'entre eux.

29
hm1984ir

Vous pouvez utiliser la bibliothèque Magical Take Photo.

1. Essayez avec compile in gradle

compile 'com.frosquivel:magicaltakephoto:1.0'

2. Vous avez besoin de cette permission dans votre fichier manifest.xml

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.CAMERA"/>

. Exemple la classe comme ceci

// "ceci" est le paramètre d'activité en cours

MagicalTakePhoto magicalTakePhoto =  new MagicalTakePhoto(this,ANY_INTEGER_0_TO_4000_FOR_QUALITY);

4. Si vous avez besoin de prendre une photo, utilisez la méthode

magicalTakePhoto.takePhoto("my_photo_name");

5. Si vous devez sélectionner une image dans l'appareil, essayez la méthode suivante:

magicalTakePhoto.selectedPicture("my_header_name");

6. Vous devez écraser la méthode onActivityResult de l'activité ou du fragment comme ceci:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
     magicalTakePhoto.resultPhoto(requestCode, resultCode, data);

     // example to get photo
     // imageView.setImageBitmap(magicalTakePhoto.getMyPhoto());
}

Remarque: Seule cette bibliothèque vous permet de prendre et de sélectionner une image sur le périphérique. Elle utilise une API minimale de 15.

5
fabian7593

Prenez et stockez l'image dans le dossier souhaité

 //Global Variables
   private static final int CAMERA_IMAGE_REQUEST = 101;
    private String imageName;

Fonction photo

 public void captureImage() {

            // Creating folders for Image
            String imageFolderPath = Environment.getExternalStorageDirectory().toString()
                    + "/AutoFare";
            File imagesFolder = new File(imageFolderPath);
            imagesFolder.mkdirs();

            // Generating file name
            imageName = new Date().toString() + ".png";

            // Creating image here
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(imageFolderPath, imageName)));
            startActivityForResult(takePictureIntent,
                    CAMERA_IMAGE_REQUEST);

        }

Diffuser une nouvelle image ajoutée sinon la photo ne sera pas visible dans la galerie d'images

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
                // TODO Auto-generated method stub
                super.onActivityResult(requestCode, resultCode, data);

                if (resultCode == Activity.RESULT_OK && requestCode == CAMERA_IMAGE_REQUEST) {

                    Toast.makeText(getActivity(), "Success",
                            Toast.LENGTH_SHORT).show();

 //Scan new image added
                    MediaScannerConnection.scanFile(getActivity(), new String[]{new File(Environment.getExternalStorageDirectory()
                            + "/AutoFare/" + imageName).getPath()}, new String[]{"image/png"}, null);


 // Work in few phones
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {

                        getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(Environment.getExternalStorageDirectory()
                                + "/AutoFare/" + imageName)));

                    } else {
                        getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(Environment.getExternalStorageDirectory()
                                + "/AutoFare/" + imageName)));
                    }
                } else {
                    Toast.makeText(getActivity(), "Take Picture Failed or canceled",
                            Toast.LENGTH_SHORT).show();
                }
            }

Les permissions

    <uses-permission Android:name="Android.permission.CAMERA" />
    <uses-feature Android:name="Android.hardware.camera" />
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
2
Hitesh Sahu

Pour ceux qui sont venus ici à la recherche d'un moyen de prendre des photos/photos par programmation en utilisant à la fois l'API caméra et l'API Camera2 d'Android, jetez un oeil à l'exemple open source fourni par Google lui-même ici .

2
Phileo99