Tomar fotos con la cámara en Android programáticamente

Creé una aplicación con un botón y escribí onClickListener para ese botón. He intentado varios ejemplos de ejemplos de código y ninguno de ellos funcionó. Todos muestran la aplicación de la cámara de Android y no toman fotografías. Quiero un código que pueda poner en mi onClickListener para que cuando presione el botón en la pantalla, se tome una foto.

¿Cómo puedo hacer que la cámara tome una foto cuando presiono un botón en una actividad de Android?

Mire el siguiente código de demostración.

Aquí está su archivo XML para UI,

    

Y aquí está su archivo de clase 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"); } } } 

Nota:

Especifique los siguientes permisos en su archivo de manifiesto,

   

Hay dos formas de tomar una foto:

1 – Usar una intención para hacer una foto

2 – Uso de la API de la cámara

Creo que deberías usar la segunda vía y aquí hay un código de muestra para dos de ellos.

Puede usar la biblioteca Magical Take Photo.

1. prueba con comstackr en gradle

 compile 'com.frosquivel:magicaltakephoto:1.0' 

2. Necesitas este permiso en tu manifest.xml

    

3. instancia la clase como esta

// “this” es el param de actividad actual

 MagicalTakePhoto magicalTakePhoto = new MagicalTakePhoto(this,ANY_INTEGER_0_TO_4000_FOR_QUALITY); 

4. si necesitas tomar una foto usa el método

 magicalTakePhoto.takePhoto("my_photo_name"); 

5. si necesita seleccionar una imagen en el dispositivo, intente con el método:

 magicalTakePhoto.selectedPicture("my_header_name"); 

6. Necesita anular el método en el resultado de actividad de la actividad o fragmento como este:

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

Nota: Solo con esta biblioteca puede tomar y seleccionar una imagen en el dispositivo, esta usa una API mínima 15.

Para aquellos que vinieron aquí en busca de una manera de tomar fotografías / fotos programáticamente utilizando la cámara de Android y la API de Camera2, echen un vistazo a la muestra de código abierto proporcionada por Google aquí .

Tomar y almacenar la imagen en la carpeta deseada

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

Tomar la función de imagen

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

Transmitir nueva imagen añadida; de lo contrario, la imagen no estará visible en la galería de imágenes

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

Permisos

     

La siguiente es una manera simple de abrir la cámara:

 private void startCamera() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI.getPath()); startActivityForResult(intent, 1); } 
 Intent takePhoto = new Intent("android.media.action.IMAGE_CAPTURE"); startActivityForResult(takePhoto, CAMERA_PIC_REQUEST) 

y establecer CAMERA_PIC_REQUEST= 1 or 0