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:
- Cómo escribir datos exif a la imagen en Android?
- Intención de la cámara Android Guardar imagen Paisaje cuando se toma Retrato
- Guardar las imágenes pulsadas en la carpeta personalizada (Preferentemente interna a la aplicación) en lugar de la galería
- Imagen procedente de cámara o galería?
- Foto androide de la cámara que se toma en un tamaño realmente pequeño
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(); } } }; }
- Android: Crash after Image Crop cuando se actualiza la versión del sistema operativo a 5.1.1
- Android 5.1.1 por defecto la cámara devuelve la intención vacía en onActivityResult después de capturar la imagen
- resultcode y datos null in onActivityresult
- Evitar que la actividad sea destruida
- La intención de la cámara Android crea dos archivos
- Guardar la imagen capturada en la carpeta específica de la tarjeta sd
- Receptor de radiodifusión no recibirá evento de cámara
- ¿Cuál es la diferencia entre ActivityCompat y ContextCompat?
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.
- La gravedad de TextView no funciona con hebreo
- Utilizar AudioManager interfiere con el audio de la llamada