Cámara personalizada android

Quiero usar la camera preview en una actividad. Quiero agregar imágenes (marcos transparentes en la vista de la superficie). He intentado seguir el código para que pueda personalizar fácilmente el diseño xml deseablemente:

 package com.demo; import java.io.IOException; import android.app.Activity; import android.graphics.PixelFormat; import android.hardware.Camera; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.widget.Toast; public class CameraDemoActivity extends Activity implements SurfaceHolder.Callback{ /** Called when the activity is first created. */ Camera camera; SurfaceView surfaceView; SurfaceHolder surfaceHolder; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); getWindow().setFormat(PixelFormat.UNKNOWN); surfaceView = (SurfaceView)findViewById(R.id.surfaceview); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); camera = Camera.open(); if(camera!=null){ try { camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); } catch (IOException e) { Toast.makeText(this, (CharSequence) e, Toast.LENGTH_LONG).show(); } } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } } 

Aquí está mi manifiesto:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.demo" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".CameraDemoActivity" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android:hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> </manifest> 

Y aquí está mi diseño:

 <?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" > <SurfaceView android:id="@+id/surfaceview" android:layout_width="fill_parent" android:layout_height="fill_parent"/> </LinearLayout> 

¿No sabes por qué la vista previa de la camera no se muestra?

One Solution collect form web for “Cámara personalizada android”

Utilice este código

PreviewDemo.java

 public class PreviewDemo extends Activity implements OnClickListener { private SurfaceView preview = null; private SurfaceHolder previewHolder = null; private Camera camera = null; private boolean inPreview = false; ImageView image; Bitmap bmp, itembmp; static Bitmap mutableBitmap; PointF start = new PointF(); PointF mid = new PointF(); float oldDist = 1f; File imageFileName = null; File imageFileFolder = null; private MediaScannerConnection msConn; Display d; int screenhgt, screenwdh; ProgressDialog dialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.preview); image = (ImageView) findViewById(R.id.image); preview = (SurfaceView) findViewById(R.id.surface); previewHolder = preview.getHolder(); previewHolder.addCallback(surfaceCallback); previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); previewHolder.setFixedSize(getWindow().getWindowManager() .getDefaultDisplay().getWidth(), getWindow().getWindowManager() .getDefaultDisplay().getHeight()); } @Override public void onResume() { super.onResume(); camera = Camera.open(); } @Override public void onPause() { if (inPreview) { camera.stopPreview(); } camera.release(); camera = null; inPreview = false; super.onPause(); } private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) { Camera.Size result = null; for (Camera.Size size: parameters.getSupportedPreviewSizes()) { if (size.width <= width && size.height <= height) { if (result == null) { result = size; } else { int resultArea = result.width * result.height; int newArea = size.width * size.height; if (newArea > resultArea) { result = size; } } } } return (result); } SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { public void surfaceCreated(SurfaceHolder holder) { try { camera.setPreviewDisplay(previewHolder); } catch (Throwable t) { Log.e("PreviewDemo-surfaceCallback", "Exception in setPreviewDisplay()", t); Toast.makeText(PreviewDemo.this, t.getMessage(), Toast.LENGTH_LONG) .show(); } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Camera.Parameters parameters = camera.getParameters(); Camera.Size size = getBestPreviewSize(width, height, parameters); if (size != null) { parameters.setPreviewSize(size.width, size.height); camera.setParameters(parameters); camera.startPreview(); inPreview = true; } } public void surfaceDestroyed(SurfaceHolder holder) { // no-op } }; Camera.PictureCallback photoCallback = new Camera.PictureCallback() { public void onPictureTaken(final byte[] data, final Camera camera) { dialog = ProgressDialog.show(PreviewDemo.this, "", "Saving Photo"); new Thread() { public void run() { try { Thread.sleep(1000); } catch (Exception ex) {} onPictureTake(data, camera); } }.start(); } }; public void onPictureTake(byte[] data, Camera camera) { bmp = BitmapFactory.decodeByteArray(data, 0, data.length); mutableBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true); savePhoto(mutableBitmap); dialog.dismiss(); } class SavePhotoTask extends AsyncTask < byte[], String, String > {@Override protected String doInBackground(byte[]...jpeg) { File photo = new File(Environment.getExternalStorageDirectory(), "photo.jpg"); if (photo.exists()) { photo.delete(); } try { FileOutputStream fos = new FileOutputStream(photo.getPath()); fos.write(jpeg[0]); fos.close(); } catch (java.io.IOException e) { Log.e("PictureDemo", "Exception in photoCallback", e); } return (null); } } public void savePhoto(Bitmap bmp) { imageFileFolder = new File(Environment.getExternalStorageDirectory(), "Rotate"); imageFileFolder.mkdir(); FileOutputStream out = null; Calendar c = Calendar.getInstance(); String date = fromInt(c.get(Calendar.MONTH)) + fromInt(c.get(Calendar.DAY_OF_MONTH)) + fromInt(c.get(Calendar.YEAR)) + fromInt(c.get(Calendar.HOUR_OF_DAY)) + fromInt(c.get(Calendar.MINUTE)) + fromInt(c.get(Calendar.SECOND)); imageFileName = new File(imageFileFolder, date.toString() + ".jpg"); try { out = new FileOutputStream(imageFileName); bmp.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); scanPhoto(imageFileName.toString()); out = null; } catch (Exception e) { e.printStackTrace(); } } public String fromInt(int val) { return String.valueOf(val); } public void scanPhoto(final String imageFileName) { msConn = new MediaScannerConnection(PreviewDemo.this, new MediaScannerConnectionClient() { public void onMediaScannerConnected() { msConn.scanFile(imageFileName, null); Log.i("msClient obj in Photo Utility", "connection established"); } public void onScanCompleted(String path, Uri uri) { msConn.disconnect(); Log.i("msClient obj in Photo Utility", "scan completed"); } }); msConn.connect(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0) { onBack(); } return super.onKeyDown(keyCode, event); } public void onBack() { Log.e("onBack :", "yes"); camera.takePicture(null, null, photoCallback); inPreview = false; } @Override public void onClick(View v) { } } 

Preview.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <android.view.SurfaceView android:id="@+id/surface" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </RelativeLayout> 

Utilice el botón Menú del dispositivo para tomar la fotografía.

Agregar los permisos en el archivo de manifiesto

Seleccione Rotar carpeta en la Galería de la imagen capturada.

  • ¿Cómo implementar la funcionalidad de la cámara con opciones adicionales (como Panorama)?
  • El enfoque automático de la cámara no funciona en el Galaxy S4
  • Tome una foto con la cámara y obtenga bitmap
  • ¿Cómo funciona un obturador remoto para trabajar con la cámara en Android / iOS?
  • Error de la cámara 100 Detalle
  • Obtener la carpeta de imagen actual de la cámara
  • Apertura de la linterna del Galaxy Nexus
  • Android - Reducción del resplandor en la cámara (Foto / Video)
  • Tamaño de la imagen de la cámara Android
  • Política de privacidad de la cámara Android
  • SurfaceView con vista previa de cámara no se destruye
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.