Download Uso de la Cámara API

Document related concepts
no text concepts found
Transcript
Uso de la Cámara API
Android SDK es compatible con la conectividad a la cámara integrada. Usar la
cámara para tomar fotos es relativamente fácil. Es algo más difícil de configurar la
previa de la cámara para que funcione correctamente.
En nuestra actividad principal, creamos el objeto vista previa. Este objeto se
creará el objeto cámara y volver a la actividad CameraDemo.
A continuación se registra par de método de devolución de llamada con la cámara
que se realiza cuando el usuario toma una foto.
shutterCallback se llama cuando el obturador se abre y se toma la
fotografía. rawCallback yjpegCallback obtendrá los datos para la codificación de
RAW y JPEG de la foto. Depende de usted para hacer algo con estos datos, tales
como guardar en la tarjeta SD.
CameraDemo.java
Code:
package com.example;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.hardware.Camera;
android.hardware.Camera.PictureCallback;
android.hardware.Camera.ShutterCallback;
android.os.Bundle;
android.util.Log;
android.view.View;
android.view.View.OnClickListener;
android.widget.Button;
android.widget.FrameLayout;
public class CameraDemo extends Activity {
private static final String TAG = "CameraDemo";
Camera camera;
Preview preview;
Button buttonClick;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
preview = new Preview(this);
((FrameLayout)
findViewById(R.id.preview)).addView(preview);
buttonClick = (Button)
findViewById(R.id.buttonClick);
buttonClick.setOnClickListener(new
OnClickListener() {
public void onClick(View v) {
preview.camera.takePicture(shutterCallback, rawCallback,
jpegCallback);
}
});
Log.d(TAG, "onCreate'd");
}
ShutterCallback shutterCallback = new ShutterCallback() {
public void onShutter() {
Log.d(TAG, "onShutter'd");
}
};
/** Handles data for raw picture */
PictureCallback rawCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera
camera) {
Log.d(TAG, "onPictureTaken - raw");
}
};
/** Handles data for jpeg picture */
PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera
camera) {
FileOutputStream outStream = null;
try {
// write to local sandbox file system
// outStream =
//
CameraDemo.this.openFileOutput(String.format("%d.jpg",
// System.currentTimeMillis()), 0);
// Or write to sdcard
outStream = new
FileOutputStream(String.format(
"/sdcard/%d.jpg",
System.currentTimeMillis()));
outStream.write(data);
outStream.close();
Log.d(TAG, "onPictureTaken - wrote
bytes: " + data.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
Log.d(TAG, "onPictureTaken - jpeg");
}
};
}
Adelanto se encarga de la vista previa de la cámara. Se subclases clase
SurfaceView para que pueda ser colocado en la propia interfaz de
usuario. También se implementa la interfaz SurfaceHolder.Callback por lo que
recibe las devoluciones de llamada cuando la interfaz de usuario esté disponible.
Preview.java
Code:
package com.example;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import
import
import
import
import
import
import
import
import
android.content.Context;
android.graphics.Canvas;
android.graphics.Color;
android.graphics.Paint;
android.hardware.Camera;
android.hardware.Camera.PreviewCallback;
android.util.Log;
android.view.SurfaceHolder;
android.view.SurfaceView;
class Preview extends SurfaceView implements
SurfaceHolder.Callback {
private static final String TAG = "Preview";
SurfaceHolder mHolder;
public Camera camera;
Preview(Context context) {
super(context);
// Install a SurfaceHolder.Callback so we get
notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, acquire the
camera and tell it where
// to draw.
camera = Camera.open();
try {
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(new
PreviewCallback() {
public void onPreviewFrame(byte[]
data, Camera arg1) {
FileOutputStream outStream =
null;
try {
outStream = new
FileOutputStream(String.format(
"/sdcard/%d.jpg", System.currentTimeMillis()));
outStream.write(data);
outStream.close();
Log.d(TAG,
"onPreviewFrame - wrote bytes: "
+
data.length);
} catch (FileNotFoundException
e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
Preview.this.invalidate();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// Surface will be destroyed when we return, so
stop the preview.
// Because the CameraDevice object is not a shared
resource, it's very
// important to release it when the activity is
paused.
camera.stopPreview();
camera = null;
}
public void surfaceChanged(SurfaceHolder holder, int
format, int w, int h) {
// Now that the size is known, set up the camera
parameters and begin
// the preview.
Camera.Parameters parameters =
camera.getParameters();
parameters.setPreviewSize(w, h);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
Paint p = new Paint(Color.RED);
Log.d(TAG, "draw");
canvas.drawText("PREVIEW", canvas.getWidth() / 2,
canvas.getHeight() / 2, p);
}
}
El diseño es bastante sencillo. Tenemos el FrameLayout como el marcador de
posición para la vista preliminar que se adjunta. Esto se hace mediante
programación en CameraDemo.onCreate ().
/res/layout/main.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/layout">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Camera Demo"
android:textSize="24sp" />
<FrameLayout android:id="@+id/preview"
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</FrameLayout>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/buttonClick"
android:text="Click"
android:layout_gravity="center"></Button>
</LinearLayout>
Y, finalmente, recuerde agregar <uses-permission
android:name="android.permission.CAMERA" /> a su archivo
AndroidManifest.xml.
La aplicación final se parece a esto:
Source Code:
/static/tutorials/CameraDemo.zip
P.D: Version en Original (Ingles)
Link: http://marakana.com/forums/android/examples/39.html