14

誰かが私のデバイスのロックを解除し、間違ったパスワードを 3 回入力しようとしたときに、フロント カメラで画像をキャプチャする機能を実装したいと考えています。Androidでも可能で、一部のアプリはMarketでも入手できることを確認しました。

これを達成するためにいくつかの作業を行いましたが、黒い画像が表示されます。コードは次のとおりです。

デバイス管理者に登録して、不正なパスワード試行のブロードキャストを取得します。

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

}

}

画像をキャプチャして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();
        }
    }
};
}
4

2 に答える 2

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 に反映する必要があります。

于 2013-04-23T16:50:47.513 に答える