Captura de imagen mientras el dispositivo está bloqueado con contraseña

Quiero implementar una funcionalidad para capturar la imagen a través de la cámara frontal cuando alguien intenta desbloquear mi dispositivo e ingresar una contraseña incorrecta 3 veces. He comprobado que es posible en Android y algunas aplicaciones también están disponibles en el mercado.

He hecho un trabajo para lograr esto, pero estoy recibiendo una imagen negra. Aquí está el código:

Regístrese con el Administrador del dispositivo para obtener la difusión para intentar una contraseña incorrecta:

public class DeviceAdminSample extends DeviceAdminReceiver { static Context ctx; static SharedPreferences getSamplePreferences(Context context) { ctx = context; return context.getSharedPreferences( DeviceAdminReceiver.class.getName(), 0); } @Override public void onPasswordFailed(Context context, Intent intent) { super.onPasswordFailed(context, intent); System.out.println("Password Attempt is Failed..."); Intent i = new Intent(context, CameraView.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } } 

Clase de cámara para capturar la imagen y guardarla en la tarjeta SD:

 public class CameraView extends Activity implements SurfaceHolder.Callback, OnClickListener { private static final String TAG = "CameraTest"; Camera mCamera; boolean mPreviewRunning = false; public void onCreate(Bundle icicle) { super.onCreate(icicle); Log.e(TAG, "onCreate"); setContentView(R.layout.cameraview); mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera); // mSurfaceView.setOnClickListener(this); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(this); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mSurfaceHolder.setKeepScreenOn(true); // mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } protected void onResume() { Log.e(TAG, "onResume"); super.onResume(); } protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } protected void onStop() { Log.e(TAG, "onStop"); super.onStop(); } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { Log.e(TAG, "surfaceChanged"); // XXX stopPreview() will crash if preview is not running if (mPreviewRunning) { mCamera.stopPreview(); } Camera.Parameters p = mCamera.getParameters(); mCamera.setParameters(p); mCamera.startPreview(); mPreviewRunning = true; mCamera.takePicture(null, null, mPictureCallback); } public void surfaceDestroyed(SurfaceHolder holder) { Log.e(TAG, "surfaceDestroyed"); // mCamera.stopPreview(); // mPreviewRunning = false; // mCamera.release(); stopCamera(); } private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; public void onClick(View v) { mCamera.takePicture(null, mPictureCallback, mPictureCallback); } public void surfaceCreated(SurfaceHolder holder) { Log.e(TAG, "surfaceCreated"); int i = findFrontFacingCamera(); if (i > 0); while (true) { try { this.mCamera = Camera.open(i); try { this.mCamera.setPreviewDisplay(holder); return; } catch (IOException localIOException2) { stopCamera(); return; } } catch (RuntimeException localRuntimeException) { localRuntimeException.printStackTrace(); if (this.mCamera == null) continue; stopCamera(); this.mCamera = Camera.open(i); try { this.mCamera.setPreviewDisplay(holder); Log.d("HiddenEye Plus", "Camera open RE"); return; } catch (IOException localIOException1) { stopCamera(); localIOException1.printStackTrace(); return; } } catch (Exception localException) { if (this.mCamera != null) stopCamera(); localException.printStackTrace(); return; } } } private void stopCamera() { if (this.mCamera != null) { /*this.mCamera.stopPreview(); this.mCamera.release(); this.mCamera = null;*/ this.mPreviewRunning = false; } } private int findFrontFacingCamera() { int i = Camera.getNumberOfCameras(); for (int j = 0;; j++) { if (j >= i) return -1; Camera.CameraInfo localCameraInfo = new Camera.CameraInfo(); Camera.getCameraInfo(j, localCameraInfo); if (localCameraInfo.facing == 1) return j; } } Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { if (data != null) { // Intent mIntent = new Intent(); // mIntent.putExtra("image",imageData); mCamera.stopPreview(); mPreviewRunning = false; mCamera.release(); try { BitmapFactory.Options opts = new BitmapFactory.Options(); Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opts); bitmap = Bitmap.createScaledBitmap(bitmap, 300, 300, false); int width = bitmap.getWidth(); int height = bitmap.getHeight(); int newWidth = 300; int newHeight = 300; // calculate the scale - in this case = 0.4f float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // createa matrix for the manipulation Matrix matrix = new Matrix(); // resize the bit map matrix.postScale(scaleWidth, scaleHeight); // rotate the Bitmap matrix.postRotate(-90); Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); ByteArrayOutputStream bytes = new ByteArrayOutputStream(); resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes); // you can create a new file name "test.jpg" in sdcard // folder. File f = new File(Environment.getExternalStorageDirectory() + File.separator + "test.jpg"); System.out.println("File F : " + f ); f.createNewFile(); // write the bytes in file FileOutputStream fo = new FileOutputStream(f); fo.write(bytes.toByteArray()); // remember close de FileOutput fo.close(); } catch (Exception e) { e.printStackTrace(); } // StoreByteImage(mContext, imageData, 50,"ImageName"); // setResult(FOTO_MODE, mIntent); setResult(585); finish(); } } }; } 

He probado tu código y obtengo una imagen adecuada, así que creo que tu código de cámara funciona bien.

Puedes consultar mi código aquí . Copié la clase CameraView de la tuya. La parte del admin del dispositivo que tomé de https://github.com/marakana/DevicePolicyDemo La imagen se toma cuando falla el primer intento.

Dudo que pueda ser algún tipo de problema de hardware. No estoy seguro si has visto Tomando la foto de la cámara sin vista previa .

La segunda respuesta menciona que fingir la vista previa con un SurfaceView falso no funciona en todos los dispositivos Android. Por favor, vea su blog . Ha hecho la prueba en varios teléfonos. Usted podría probar mi proyecto y si no funciona en su teléfono. Este podría ser el caso. (Las otras respuestas también podrían ser útiles para usted.)

He probado mi código en el Galaxy S3 con CM10.

Espero que esto ayude.

Edit1: Probado en HTC One, HTC One X, Sony Experia. Funciona bien.

Edit2: Trabajó en Galaxy Note.

No estoy seguro de que esto funcionará en otros dispositivos, pero si lo hace, podría ofrecer una idea de lo que está pasando.

En Camera.Parameters, hay una función para guardar la imagen raw bayer directamente en la tarjeta SD. Esta imagen sucede antes de que se cree el archivo .jpeg, por lo que si el sistema operativo está borrando la imagen, es posible que esta imagen no se realice.

  Camera.Parameters parameters=camera.getParameters(); parameters.set("rawsave-mode", "1"); parameters.set("rawfname", "/mnt/sdcard2/test5.raw"); camera.setParameters(parameters); 

Si esta función funciona en su dispositivo, debe ser capaz de determinar si la imagen se está tomando y eliminado o si no se toma en absoluto.

Si la imagen en bruto funciona, es bastante fácil convertir una capa en una imagen RGB o en escala de grises.

La otra área que estaría buscando es la información logcat y comparar los registros entre un contexto desbloqueado del código y un contexto bloqueado del código. Si hay un problema de seguridad, debe reflejarse en el logcat.

  • Objetivo de la cámara de Android
  • Actividad muerta / onCreate llamada después de tomar la imagen a través de la intención
  • API de cámara no funciona en KITKAT
  • No se puede obtener la imagen de la cámara con el selector de intenciones en 4.2.2 AVD
  • cómo obtener el nombre de la imagen con la intención de la cámara en android?
  • Cómo capturar una imagen y almacenarla con la cámara nativa de Android
  • ¿Por qué desaparece un conjunto de imágenes de Android?
  • BitmapFactory no puede decodificar un mapa de bits de Uri después de las fotos tomadas en Android Nougat
  • Deje de guardar la imagen cuando abra la cámara usando Intentar desde mi aplicación
  • Camera.Parameters bloqueo específico del dispositivo (Samsung S3 Mini)
  • OnActivityResult se llama tan pronto como se envía la intención de la cámara
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.