android - studio - tomar fotos con la camara y guardar en la sdcard
Tomar fotos con la cámara en Android programáticamente (7)
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.
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?
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);
}
Mire el siguiente código de demostración.
Aquí está su archivo XML para UI,
<?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>
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,
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
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 here .
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
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Puede usar la biblioteca Magical Take Photo.
1. prueba con compilar en gradle
compile ''com.frosquivel:magicaltakephoto:1.0''
2. Necesitas este permiso en tu 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"/>
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.
Intent takePhoto = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(takePhoto, CAMERA_PIC_REQUEST)
y establecer CAMERA_PIC_REQUEST= 1 or 0