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