Android - podgląd kamery jest boczny
Używam podglądu, aby wyświetlić to, co kamera widzi na ekranie.
Mogę uzyskać wszystko działa dobrze, powierzchnia utworzona, powierzchnia ustawiona i powierzchnia jest wyświetlana.
Jednak zawsze wyświetla obraz pod nieprawidłowym kątem 90 stopni w trybie portretowym.
Takie jak na zdjęciu:
Zdaję sobie sprawę, że użycie poniższego kodu ustawi obraz prosto:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Jednak mam podgląd w aktywności to ma inne elementy i nie ma sensu, aby Moja aktywność była wyświetlana w trybie poziomym. (Domyślnie wyłączony)
Więc zastanawiałem się, czy w ogóle można zmienić orientację podglądu? I pozostawić resztę mojej aktywności poprawnie wyświetlaną w trybie portretowym?
Lub obrócić podgląd tak, aby był wyświetlany poprawnie?
8 answers
Ten problem wydawał się zaczynać jako błąd z pewnym sprzętem zobacz tutaj ale można go przezwyciężyć za pomocą wywołania mCamera.setDisplayOrientation (stopnie) dostępne w API 8. Więc tak to realizuję:
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);
}
}
To było na HTC Desire i musiałem początkowo umieścić w instrukcji logging w każdej z kontroli obrotów, aby powiedzieć, co to był obrót, a następnie debugować na urządzeniu i obserwował wyjście logCat podczas obracania urządzenia. Dla HTC Desire, 0 było telefon jak byś się spodziewał (portret), 90 stopni obracał telefon o 90 stopni przeciwnie do ruchu wskazówek zegara (zakładałem, że będzie zgodnie z ruchem wskazówek zegara). W kodzie zobaczysz, że nie musiałem obracać wyświetlacza, gdy telefon był pod kątem 90 lub 180 stopni - urządzenie wydawało się samo sobie z tym radzić. Tylko jeden punkt nie działa poprawnie: obrót o 270 stopni następuje po obróceniu urządzenia o 90 stopni zgodnie z ruchem wskazówek zegara, a licznik obrotu wyświetlacza jest ok, ale jeśli obrócisz urządzenie o 270 stopni przeciwnie do ruchu wskazówek zegara, wydaje się, że nie rekompensuje tego właściwie.
P. S. zwróć uwagę na zamianę szerokości i wysokości w odpowiednich obrotach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-07 16:18:05
Spróbuj ustawić orientację wyświetlacza. To rozwiązuje mój problem.
mCamera.setDisplayOrientation(90);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-30 15:12:26
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();
}
}
Wypróbuj ten kod
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-05 11:24:39
Zrobiłem to za radą mcamery.setDisplayOrientation(90); ale też obróciłem bitmapę, ponieważ z jakiegoś powodu inne podejścia nie działają dla mnie w wersji 2.3.3.
Dla obrócenia bitmapy zrobiłem tak:
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);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-14 14:06:48
Miałem problem z przednią kamerą (problem do góry nogami). Następnie zastosowałem następującą metodę udokumentowaną w Android Docs-
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);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-05 12:36:01
Porównałem mój kod do tutoriala i co w końcu naprawione było umieszczenie poniższego kodu w moim AndroidManifext.xml:
W tagach <activity>
:
android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-16 22:13:23
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();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-30 12:25:36
Myślę, że wartość SENSOR_ORIENTATION wyjaśni jaką wartość należy użyć do obrotu zamiast twardego kodowania do 90 stopni
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
if (manager == null) {
Log.i(TAG, "camera manager is null");
return;
}
for (String id: manager.getCameraIdList()) {
CameraCharacteristics characteristics = manager.getCameraCharacteristics(id);
Integer orientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
Log.i(TAG, "camera sensor orientation is " + orientation);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-19 16:55:00