11

Desidero implementare una funzionalità per acquisire l'immagine tramite la fotocamera anteriore quando qualcuno tenta di sbloccare il dispositivo e immettere la password errata per 3 volte. Ho verificato che è possibile su Android e alcune applicazioni sono disponibili anche su Market.Cattura immagine mentre il dispositivo è bloccato con password

Ho fatto del lavoro per raggiungere questo obiettivo, ma sto ottenendo un'immagine nera. Ecco il codice:

Registrati con amministratore dispositivo per ottenere la trasmissione per errato tentativo password

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); 

} 

} 

classe Camera per acquisire un'immagine e salvarla su scheda 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(); 
     } 
    } 
}; 
} 
+0

Hai testato il codice quando il telefono è sbloccato? –

+0

Sì, sono in grado di acquisire l'immagine con questo codice mentre il telefono è sbloccato ... –

+0

@KrishnakantDalal: hai controllato il log della console Android. Ci sono messaggi di errore? –

risposta

6

Ho testato il codice e ottengo un'immagine corretta, quindi penso che il codice della fotocamera funzioni correttamente.

È possibile controllare il mio codice here. Ho copiato la classe CameraView dalla tua. La parte di amministrazione del dispositivo che ho preso da https://github.com/marakana/DevicePolicyDemo L'immagine viene scattata quando il primo tentativo fallisce.

Dubito che potrebbe essere una sorta di problema hardware. Non sono sicuro di aver visto Taking picture from camera without preview.

La seconda risposta indica che simulare l'anteprima con un fittizio SurfaceView non funziona su tutti i dispositivi Android. Si prega di consultare il suo blog. Ha fatto il test su vari telefoni. Puoi provare il mio progetto e se non funziona sul tuo telefono. Questo potrebbe essere il caso. (Le altre risposte potrebbero essere utili anche per te.)

Ho provato il mio codice su Galaxy S3 con CM10.

Spero che questo aiuti.

Edit1: Test su HTC One, HTC One X, Sony Experia. Funziona bene.

Edit2: ha funzionato su Galaxy Note.

+0

Grazie mille ... È davvero utile. Lo stavo testando per la prima volta su Samsung Nexus, ma in seguito lo collaudo su molti altri dispositivi e sta lavorando su tutto questo tranne su quello di Samsung Nexus. Ho testato l'app su LG Nexus, Samsung Galaxy Tab 7 'e 10', Samsung SII e Samsung SII. Grazie mille ancora cara .... –

+0

prego – pt2121

+0

Ti prego, fammi un favore, se verifichi questo codice su un altro dispositivo, ti preghiamo di continuare ad aggiornare qui in modo da essere sicuro che la mia applicazione supporta numeri di dispositivi. –

0

Sono non è sicuro che funzionerà su altri dispositivi, ma se lo fa potrebbe offrire qualche informazione su cosa sta succedendo.

In Camera.Parameters, c'è una funzione per salvare l'immagine raw bayer direttamente sulla scheda SD. Questa immagine si verifica prima che venga creato il file .jpeg, quindi se il sistema operativo sta cancellando l'immagine, questa immagine potrebbe non essere effettuata.

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

Se questa funzione è disponibile sul dispositivo, si dovrebbe essere in grado di determinare se l'immagine viene presa e spazzato via o se non viene preso affatto.

Se l'immagine grezza funziona, è abbastanza facile convertire un bayer in un'immagine RGB o in un'immagine in scala di grigi.

L'altra area che guarderei è le informazioni logcat e confrontare i registri tra un contesto sbloccato del codice e un contesto bloccato del codice. Se c'è un problema di sicurezza, dovrebbe riflettersi nel logcat.

Problemi correlati