使用int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();可以获取屏幕旋转的方向

本文介绍了一种通过Java代码获取Android设备屏幕旋转方向的方法。使用int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();这一行代码即可实现。

使用int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();可以获取屏幕旋转的方向



第一幅图不对,现在修正。

package com.android.example.cameraappxjava; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.content.pm.PackageManager; import android.graphics.ImageFormat; import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraManager; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.TotalCaptureResult; import android.hardware.camera2.params.StreamConfigurationMap; import android.media.Image; import android.media.ImageReader; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.util.Size; import android.view.Surface; import android.view.TextureView; import android.view.View; import android.widget.Toast; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.List; import android.Manifest; import android.content.Context; public class MainActivity extends AppCompatActivity { private CameraManager cameraManager; private String cameraId; private Size photoSize; private TextureView textureView; private CameraDevice cameraDevice; private CameraCaptureSession captureSession; private ImageReader imageReader; private int screenWidth, screenHeight; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CameraUtils.init(this); initCamera(); initViews(); setupTextureListener(); } private void initCamera() { List<Size> outputSizes; // 获取屏幕尺寸 DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); screenWidth = metrics.widthPixels; screenHeight = metrics.heightPixels; try { CameraUtils cameraUtils = CameraUtils.getInstance(); cameraManager = cameraUtils.getCameraManager(); cameraId = cameraUtils.getBackCameraId(); outputSizes = cameraUtils.getCameraOutputSizes(cameraId, SurfaceTexture.class); // 根据屏幕比例选择最佳预览尺寸 photoSize = chooseOptimalSize(outputSizes); Log.d("Camera", "Selected preview size: " + photoSize.getWidth() + "x" + photoSize.getHeight()); } catch (Exception e) { Log.e("Camera", "初始化失败", e); } } private Size chooseOptimalSize(List<Size> choices) { // 获取视图的实际尺寸 int viewWidth = textureView.getWidth(); int viewHeight = textureView.getHeight(); if (viewWidth == 0 || viewHeight == 0) { // 视图未渲染时使用屏幕尺寸 DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); viewWidth = metrics.widthPixels; viewHeight = metrics.heightPixels; } float targetRatio = (float) viewWidth / viewHeight; float minAspectDiff = Float.MAX_VALUE; float minSizeDiff = Float.MAX_VALUE; Size optimalSize = null; for (Size size : choices) { float aspectRatio = (float) size.getWidth() / size.getHeight(); float aspectDiff = Math.abs(aspectRatio - targetRatio); float sizeDiff = Math.abs(size.getWidth() - viewWidth) + Math.abs(size.getHeight() - viewHeight); // 优先选择宽高比匹配的尺寸 if (aspectDiff < minAspectDiff || (aspectDiff == minAspectDiff && sizeDiff < minSizeDiff)) { minAspectDiff = aspectDiff; minSizeDiff = sizeDiff; optimalSize = size; } } return optimalSize != null ? optimalSize : choices.get(0); } private void initViews() { textureView = findViewById(R.id.texture_view); } private void setupTextureListener() { textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { openCamera(); } @Override public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surface, int width, int height) { // 视图尺寸变化时重新配置相机 closeCamera(); configureTextureSize(width, height); openCamera(); } private void configureTextureSize(int width, int height) { // 计算视图宽高比 float viewRatio = (float) width / height; // 获取相机特性 CameraCharacteristics characteristics = null; characteristics = CameraUtils.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); // 找出匹配视图比例的输出尺寸 for (Size size : map.getOutputSizes(SurfaceTexture.class)) { float sizeRatio = (float) size.getWidth() / size.getHeight(); if (Math.abs(sizeRatio - viewRatio) < 0.01) { photoSize = size; break; } } } @Override public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surface) { return false; } @Override public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) { } // 其他回调方法省略... }); } private void openCamera() { try { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { cameraDevice = camera; createPreviewSession(); } @Override public void onDisconnected(@NonNull CameraDevice camera) { } @Override public void onError(@NonNull CameraDevice camera, int error) { } // 其他回调方法省略... }, null); } } catch (CameraAccessException e) { e.printStackTrace(); } } private void createPreviewSession() { try { SurfaceTexture texture = textureView.getSurfaceTexture(); // 确保尺寸匹配 texture.setDefaultBufferSize(photoSize.getWidth(), photoSize.getHeight()); Surface previewSurface = new Surface(texture); // 添加会话状态回调 cameraDevice.createCaptureSession(Arrays.asList(previewSurface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { captureSession = session; try { CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.addTarget(previewSurface); // 设置连续自动对焦 builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); session.setRepeatingRequest(builder.build(), null, null); } catch (CameraAccessException e) { Log.e("Camera", "预览失败", e); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { Toast.makeText(MainActivity.this, "预览配置失败", Toast.LENGTH_SHORT).show(); } }, null); } catch (CameraAccessException e) { Log.e("Camera", "创建会话异常", e); } } public void capturePhoto(View view) { if (cameraDevice == null) return; try { // 确保只有一个ImageReader实例 if (imageReader != null) { imageReader.close(); } imageReader = ImageReader.newInstance( photoSize.getWidth(), photoSize.getHeight(), ImageFormat.JPEG, 2); imageReader.setOnImageAvailableListener(reader -> { Image image = reader.acquireNextImage(); saveImage(image); image.close(); }, null); CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); Surface previewSurface = new Surface(textureView.getSurfaceTexture()); captureBuilder.addTarget(previewSurface); // 维持预览目标 captureBuilder.addTarget(imageReader.getSurface()); // 添加拍照目标 captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); // 设置拍照方向(根据设备方向调整) int rotation = getWindowManager().getDefaultDisplay().getRotation(); captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation)); // 停止预览,拍照,然后恢复预览 captureSession.stopRepeating(); captureSession.capture(captureBuilder.build(), new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); // 拍照完成后恢复预览 try { CaptureRequest.Builder previewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); previewBuilder.addTarget(previewSurface); session.setRepeatingRequest(previewBuilder.build(), null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } }, null); } catch (CameraAccessException e) { e.printStackTrace(); } } // 根据屏幕旋转计算照片方向 private int getOrientation(int rotation) { switch (rotation) { case Surface.ROTATION_0: return 90; case Surface.ROTATION_90: return 0; case Surface.ROTATION_180: return 270; case Surface.ROTATION_270: return 180; default: return 0; } } private void saveImage(Image image) { ByteBuffer buffer = image.getPlanes()[0].getBuffer(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes); File file = new File(getExternalFilesDir(null), "photo_" + System.currentTimeMillis() + ".jpg"); try (FileOutputStream output = new FileOutputStream(file)) { output.write(bytes); Toast.makeText(this, "Saved: " + file.getAbsolutePath(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } // CameraUtils类扩展 public static class CameraUtils { private static Context appContext; private static CameraManager cameraManager; private static CameraUtils instance; public static void init(Context context) { if (appContext == null) { appContext = context.getApplicationContext(); cameraManager = (CameraManager) appContext.getSystemService(Context.CAMERA_SERVICE); } } public static CameraUtils getInstance() { if (instance == null) { instance = new CameraUtils(); } return instance; } public CameraManager getCameraManager() { return cameraManager; } public String getBackCameraId() throws CameraAccessException { for (String id : cameraManager.getCameraIdList()) { CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(id); Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING); if (facing != null && facing == CameraCharacteristics.LENS_FACING_BACK) { return id; } } return null; } public List<Size> getCameraOutputSizes(String cameraId, Class klass) throws CameraAccessException { CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); return Arrays.asList(map.getOutputSizes(klass)); } public static CameraCharacteristics getCameraCharacteristics(String cameraId) { try { return cameraManager.getCameraCharacteristics(cameraId); } catch (CameraAccessException e) { Log.e("Camera", "获取特性失败", e); return null; } } public static int getCameraOrientation(String cameraId) { CameraCharacteristics characteristics = getCameraCharacteristics(cameraId); if (characteristics != null) { return characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); } return 0; } } // 添加权限请求码 private static final int CAMERA_PERMISSION_CODE = 101; @Override protected void onResume() { super.onResume(); if (!checkCameraPermission()) { requestCameraPermission(); } else if (textureView.isAvailable()) { openCamera(); } } private boolean checkCameraPermission() { return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; } private void requestCameraPermission() { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_CODE); } @Override protected void onPause() { closeCamera(); super.onPause(); } private void closeCamera() { if (captureSession != null) { captureSession.close(); captureSession = null; } if (cameraDevice != null) { cameraDevice.close(); cameraDevice = null; } if (imageReader != null) { imageReader.close(); imageReader = null; } } } 现在代码闪退
最新发布
09-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值