11

誰かが自分のデバイスのロックを解除して間違ったパスワードを3回入力しようとしたときに、前面のカメラで画像をキャプチャする機能を実装したい。私はそれがAndroidで可能であることを確認し、いくつかのアプリケーションも市場で利用可能です。デバイスがパスワードでロックされている間に画像をキャプチャする

これを達成するためにいくつかの作業を行っていますが、私は黒い画像を取得しています。ここでは、コードです:画像をキャプチャし、SDカードに保存し

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

} 

} 

Cameraクラス:私は

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

電話機のロックが解除されているときにコードをテストしましたか? –

+0

はい携帯電話のロックが解除されている間、このコードで画像をキャプチャすることができます。 –

+0

@KrishnakantDalal:Androidコンソールのログを確認しましたか?エラーメッセージはありますか? –

答えて

6

私はあなたのコードをテストしたので、私はあなたのカメラコードがうまく動作すると思うので、適切な画像を取得します。

私のコードhereをチェックすることができます。 私はあなたからCameraViewクラスをコピーしました。 私が持っていたデバイス管理部分https://github.com/marakana/DevicePolicyDemo 最初の試行が失敗したときに撮影されました。

ハードウェアの問題ではないかと疑いがあります。 Taking picture from camera without previewを見たことがあるかわかりません。

2番目の答えは、ダミーSurfaceViewでプレビューを偽装することは、すべてのAndroidデバイスで機能しないことを示しています。彼のblogをご覧ください。彼は様々な携帯電話でテストを行っています。 あなたのプロジェクトを試してみることができますし、それがあなたの携帯電話で動作しない場合。これは事実かもしれません。 (他の回答も役に立ちます)

私はCM10でGalaxy S3で自分のコードを試しました。

これが役に立ちます。

Edit1:HTC One、HTC One X、Sony Experiaでテスト済みです。正常に動作します。

Edit2:Worked on Galaxy Note。

+0

おかげさまで...本当に助かりました。最初にSamsung Nexusでテストしましたが、後で私はこれを他のデバイスの数でテストし、Samsung Nexusを除くすべてのデバイスでこれをテストしています。 LG Nexus、Samsung Galaxy Tab 7 '、10'、Samsung SII、Samsung SIIのアプリをテストします。おかげでもう一度たくさんありがとう.... –

+0

あなたは歓迎です – pt2121

+0

他のデバイスでこのコードをテストしても、私のアプリケーションがデバイスの数をサポートしていることを確認してください。 –

0

デバイスの管理と

登録が正しくないパスワードの試行のための放送を取得しますこれが他のデバイスでも動作するかどうかはわかりませんが、そうであれば、何が起こっているのかについてのいくつかの洞察を提供するかもしれません。

Camera.Parametersには、生のベイヤーイメージを直接SDカードに保存する機能があります。このイメージは.jpegファイルが作成される前に発生するため、オペレーティングシステムがイメージを消去している場合、このイメージは影響を受けない可能性があります。

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

この機能は、お使いのデバイス上で動作する場合は、写真を撮影し、一掃またはそれがすべて取られていない場合はされているかどうかを決定することができるはずです。

生画像が機能する場合、ベイヤーをRGB画像またはグレースケール画像に変換するのはかなり簡単です。

私が探している他の領域は、logcat情報で、コードのロックされていないコンテキストとコードのロックされたコンテキストの間のログを比較します。セキュリティ上の問題がある場合は、logcatに反映する必要があります。

関連する問題