Cómo configurar Live Frame en la captura de imagen de la cámara en Android

Introduzca aquí la descripción de la imagen

Tengo que fijar los marcos vivos en la cámara como encima pic. Pero mi setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); getWidth(); getHeight(); Camera.PictureCallback etc están obsoletos. Alguien sabe el código para lograr lo anterior?

solía

 public class CameraOverview1 extends Activity implements SurfaceHolder.Callback{ private Camera camera = null; private SurfaceView cameraSurfaceView = null; private SurfaceHolder cameraSurfaceHolder = null; private boolean previewing = false; private Display display = null; private static int wid = 0, hgt = 0; private LayoutInflater layoutInflater = null; private View cameraViewControl = null; private LayoutParams layoutParamsControl = null; private Button btnCapture = null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); display = getWindowManager().getDefaultDisplay(); wid = display.getWidth(); hgt = display.getHeight(); getWindow().setFormat(PixelFormat.TRANSLUCENT); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.cameraoverlay1); cameraSurfaceView = (SurfaceView)findViewById(R.id.cameraSurfaceView); cameraSurfaceHolder = cameraSurfaceView.getHolder(); cameraSurfaceHolder.addCallback(this); cameraSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); layoutInflater = LayoutInflater.from(getBaseContext()); layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); cameraViewControl = layoutInflater.inflate(R.layout.cambutton, null); this.addContentView(cameraViewControl, layoutParamsControl); btnCapture = (Button)findViewById(R.id.btnCapture); btnCapture.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub camera.takePicture(cameraShutterCallback, cameraPictureCallbackRaw, cameraPictureCallbackJpeg); } }); } ShutterCallback cameraShutterCallback = new ShutterCallback() { @Override public void onShutter() { // TODO Auto-generated method stub } }; PictureCallback cameraPictureCallbackRaw = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // TODO Auto-generated method stub } }; PictureCallback cameraPictureCallbackJpeg = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // TODO Auto-generated method stub Bitmap cameraBitmap = BitmapFactory.decodeByteArray(data, 0, data.length); wid = cameraBitmap.getWidth(); hgt = cameraBitmap.getHeight(); Bitmap newImage = Bitmap.createBitmap(wid, hgt, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(newImage); canvas.drawBitmap(cameraBitmap, 0f, 0f, null); Drawable drawable = getResources().getDrawable (R.drawable.frame1); drawable.setBounds(0, 0, wid, hgt); drawable.draw(canvas); File storagePath = new File(Environment. getExternalStorageDirectory() + "/MyCameraApp/"); storagePath.mkdirs(); File myImage = new File(storagePath, Long.toString(System.currentTimeMillis()) + ".jpg"); try { FileOutputStream out = new FileOutputStream(myImage); newImage.compress(Bitmap.CompressFormat.JPEG, 80, out); out.flush(); out.close(); } catch(FileNotFoundException e) { Log.d("In Saving File", e + ""); } catch(IOException e) { Log.d("In Saving File", e + ""); } camera.startPreview(); drawable = null; newImage.recycle(); newImage = null; cameraBitmap.recycle(); cameraBitmap = null; } }; @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub if(previewing) { camera.stopPreview(); previewing = false; } if (camera != null){ try { camera.setPreviewDisplay(cameraSurfaceHolder); camera.startPreview(); previewing = true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub try { camera = Camera.open(); } catch(RuntimeException e) { Toast.makeText(getApplicationContext(), "Device camera is not working properly, please try after sometime.", Toast.LENGTH_LONG).show(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub camera.stopPreview(); camera.release(); camera = null; previewing = false; }} 

En realidad, prácticamente todo está obsoleto. ¿Algunas ideas?

Basado en este ejemplo android-Camera2Basic

He aplicado algunos cambios y esto es resultado:

Camera2BasicFragmentFront.java

Fuente

Camera2BasicFragment.java

Fuente

AutoFitTextureView.java

Fuente

Fragment_camera2_basic.xml (Asegúrese de reemplazar com.YourPackage.AutoFitTextureView)

 <?xml version="1.0" encoding="utf-8"?><!-- Copyright 2014 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.YourPackage.AutoFitTextureView android:id="@+id/texture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentTop="true" /> </RelativeLayout> 

Activity_main.xml

 <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> <FrameLayout android:id="@+id/containerFront" android:layout_width="200dp" android:layout_height="200dp" /> </RelativeLayout> 

Que en MainActivity.java:

 public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (null == savedInstanceState) { getFragmentManager().beginTransaction() .replace(R.id.container, Camera2BasicFragment.newInstance()) .commit(); getFragmentManager().beginTransaction() .replace(R.id.containerFront, Camera2BasicFragmentFront.newInstance()) .commit(); } } } 

Y use este permiso para Manifest.xml

 <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> 

¡Eso es todo!

PS clases Java también contienen el método para guardar la foto!

  • NullPointerException-: Intenta invocar el método de interfaz "android.view.View android.view.MenuItem.getActionView () 'en una referencia de objeto nulo
  • ¿Cómo puedo "previsualizar el diseño" de un archivo xml en Android?
  • Hoja inferior de Android Modal (Diálogo) no se abre completamente
  • Cómo dibujar un gráfico en android como Wifi Analyzer App?
  • Botón de acción flotante que bloquea otros componentes
  • FindViewById devuelve null en una vista <include>
  • ¿Cómo puedo usar IDs duplicados en diferentes diseños?
  • Android: ¿Cómo configuro el tamaño del texto para un diseño?
  • Problemas con la previsualización de la cámara Android Distorsión / tamaño
  • ¿Cómo funciona $ {packageName}. $ {ActivityClass} en archivos XML de diseño?
  • Estilo de la barra de herramientas de Android Spinner
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.