アンドロイド - カメラのプレビューが横にあります
-
27-09-2019 - |
質問
私はカメラが画面上のを見たものを表示するには、[プレビュー]を使用しています。
私はすべての作業罰金、作成された表面、表面のセットを取得することができ、表面が表示されます。
しかし、それは常に縦長モードで間違った90度の角度で画像を表示します。
このような絵のように、
私は、次のコードを使用して映像をまっすぐに設定することを承知しています
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
しかし、私はそれで他の要素を持っている活動の中にプレビューを持っており、私の活動は、風景モードで表示することは意味がありません。
(デフォルトではその使用禁止)だから私は思っていただけで、プレビューの向きを変更する方法はありますか?そして、正しくポートレートモードで表示私の活動の残りの部分を残す?
とにかくか、
?正しく表示されるように、プレビューを回転させます解決
この問題は、特定のハードウェアにバグとして開始するように見えこちらをご覧くださいのだがmCamera.setDisplayOrientationへの呼び出しAPI 8で利用可能(度)を使用することによって克服することができ、これは、私はそれを実装する方法ですだからます:
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (isPreviewRunning) {
mCamera.stopPreview();
}
Parameters parameters = mCamera.getParameters();
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0) {
parameters.setPreviewSize(height, width);
mCamera.setDisplayOrientation(90);
}
if(display.getRotation() == Surface.ROTATION_90) {
parameters.setPreviewSize(width, height);
}
if(display.getRotation() == Surface.ROTATION_180) {
parameters.setPreviewSize(height, width);
}
if(display.getRotation() == Surface.ROTATION_270) {
parameters.setPreviewSize(width, height);
mCamera.setDisplayOrientation(180);
}
mCamera.setParameters(parameters);
previewCamera();
}
And the previewCamera method :
public void previewCamera() {
try {
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.startPreview();
isPreviewRunning = true;
} catch(Exception e) {
Log.d(APP_CLASS, "Cannot start preview", e);
}
}
これはHTCの欲望にあったと私は当初回転だったし、デバイス上でデバッグと私は、デバイスを回転させながらlogCat出力を見て何を言って回転チェックの各ステートメントをログに入れていました。あなたは(肖像画)を期待しているだろうとHTCの欲望のために、0が電話した、90度は(私はそれが時計回りであったであろうと想定していた)90度反時計回りに電話を回しました。デバイスは、この自分自身を扱うように見えた - のコードでは、電話は90または180度だったとき、私は任意の表示の回転を行う必要はありませんでした表示されます。一点のみが正常に動作しません:あなたは、デバイス270度反時計回りに回転させる場合は270度回転では、時計回りに90度と表示回転カウンタデバイスの電源を入れたら、[OK]しかし、正しく、それを補うためには表示されませんされていることを<。 / P>
P.S。適切な回転の幅及び高さのswapoverに留意されたい。
他のヒント
の表示の向きを設定してみてください。それは私の問題を解決します。
mCamera.setDisplayOrientation(90);
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
mCamera.setDisplayOrientation(90);
try {
mCamera.setPreviewDisplay(holder);
mCamera.setPreviewCallback(new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
このコードを試してみてください。
私は、フロントカメラ(逆さまの問題)の問題を抱えていました。それから私は、 Androidのドキュメントの中で文書化され、次の方法を使用しました -
public void setCameraDisplayOrientation(Activity activity , int icameraId , Camera camera1s)
{
CameraInfo cameraInfo = new CameraInfo();
Camera.getCameraInfo(icameraId, cameraInfo);
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0; // k
switch (rotation)
{
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result;
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
{
// cameraType=CAMERATYPE.FRONT;
result = (cameraInfo.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
}
else
{ // back-facing
result = (cameraInfo.orientation - degrees + 360) % 360;
}
// displayRotate=result;
camera.setDisplayOrientation(result);
}
私はそれがmCamera.setDisplayOrientation(90)のアドバイスを受けました。何らかの理由で他の人が、バージョン2.3.3に私のためdoesntの仕事に近づくためだけでなく、ビットマップを回転します。
回転ビットマップのために私はこれをしませんでした
Matrix matrix = new Matrix();
matrix.postRotate(90);
imageView1 = new ImageView(this);
Bitmap bitmap = BitmapFactory.decodeFile(files[i].getAbsolutePath());
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(rotatedBitmap, 80, 80, true);
imageView1.setImageBitmap(scaledBitmap);
私は、チュートリアル1のコードとどのような最終的には固定、それは私のAndroidManifext.xmlに次のコードを入れていたのと比較しています:
<activity>
タグでます:
android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// If your preview can change or rotate, take care of those events here.
// Make sure to stop the preview before resizing or reformatting it.
if (mHolder.getSurface() == null) {
// preview surface does not exist
return;
}
try {
mCamera.stopPreview();
} catch (Exception e) {
e.printStackTrace();
}
Camera.Parameters parameters = mCamera.getParameters();
Display display = ((WindowManager) getContext().getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if (display.getRotation() == Surface.ROTATION_0) {
parameters.setPreviewSize(h, w);
mCamera.setDisplayOrientation(90);
}
if (display.getRotation() == Surface.ROTATION_90) {
parameters.setPreviewSize(w, h);
mCamera.setDisplayOrientation(0);
}
if (display.getRotation() == Surface.ROTATION_180) {
parameters.setPreviewSize(h, w);
mCamera.setDisplayOrientation(270);
}
if (display.getRotation() == Surface.ROTATION_270) {
parameters.setPreviewSize(w, h);
mCamera.setDisplayOrientation(180);
}
previewCamera();
}
public void previewCamera() {
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
//Log.d(APP_CLASS, "Cannot start preview", e);
e.printStackTrace();
}
}