[英]Custom camera displays preview in wrong orientation and zoomed image android
我正在使用簡單的自定義相機 ,單擊按鈕即可拍照。
即使手機處於縱向模式,相機也會以錯誤的方向(橫向)顯示預覽,並且圖像看起來有些縮放。
我用它googled
一下,找到了解決這個問題的許多方法,我嘗試了所有方法,但沒有人能解決我的問題。
我想我缺少一些主要概念,我無法弄清楚
CameraActivity.java
public class CameraActivity extends AppCompatActivity {
private static final String TAG = "CameraActivity";
private Camera mCamera;
private CameraPreview mPreview;
private PictureCallback mPictureCallback;
private Context myContext;
private FrameLayout cameraPreview;
private boolean frontCamera = false, backCamera = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
initialize();
}
private void findViews() {
cameraPreview = (FrameLayout) findViewById(R.id.camera_preview);
}
public void initialize() {
findViews();
myContext = this;
mCamera = Camera.open(findBackFacingCamera());
mPreview = new CameraPreview(myContext, mCamera);
cameraPreview.addView(mPreview);
}
private int findFrontFacingCamera() {
int cameraId = -1; // initialized with empty
int numberOfCameras = Camera.getNumberOfCameras();
CameraInfo cameraInfo = new CameraInfo();
for (int i = 0; i < numberOfCameras; i++) {
Camera.getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
cameraId = i;
frontCamera = true;
break;
}
}
return cameraId;
}
private int findBackFacingCamera() {
int cameraId = -1; // initialized with empty
int numberOfCameras = Camera.getNumberOfCameras();
CameraInfo cameraInfo = new CameraInfo();
for (int i = 0; i < numberOfCameras; i++) {
Camera.getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
cameraId = i;
backCamera = true;
break;
}
}
return cameraId;
}
@Override
protected void onResume() {
super.onResume();
//mPictureCallback=getPi
if (!hasCamera(myContext)) {
Log.e(TAG, "Sorry, your phone does not have a camera!");
}
if (mCamera == null) {
if (findFrontFacingCamera() == 1) {
releaseCamera();
chooseCamera();
}
}
}
private void chooseCamera() {
// If currently front camera is opened,then switch to back camera
if (frontCamera) {
int cameraId = findBackFacingCamera();
if (cameraId > 0) {
// Open backfacing camera
// Set picture callback
// refresh the preview
mCamera = Camera.open(cameraId);
mPictureCallback = getPictureCallBack();
mPreview.refreshCamera(mCamera);
}
} else {
int cameraId = findFrontFacingCamera();
if (cameraId > 0) {
mCamera = Camera.open(cameraId);
mPictureCallback = getPictureCallBack();
mPreview.refreshCamera(mCamera);
}
}
}
private PictureCallback getPictureCallBack() {
PictureCallback pictureCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getOutputMediaFile();
if (pictureFile == null) {
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
Log.e(TAG, " picture saved at " + pictureFile.getName());
} catch (Exception e) {
Log.e(TAG, " getPictureCallBack " + e);
}
mPreview.refreshCamera(mCamera);
}
};
return pictureCallback;
}
private File getOutputMediaFile() {
// make a new storage directory inside sd card
File mediaStorage = new File("/sdcard/", "Tootle Camera");
// if Tootle Camera directory doesn't exist
if (!mediaStorage.exists()) {
if (!mediaStorage.mkdirs()) {
return null;
} else {
mediaStorage.mkdirs();
}
}
String timeStamp = new SimpleDateFormat("dd/MM/yyy_hh:mm:ss a").format(new Date());
// make media file
File mediaFile = new File(mediaStorage.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
return mediaFile;
}
private void releaseCamera() {
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
public boolean hasCamera(Context context) {
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
return true;
} else {
return false;
}
}
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
}
CameraPreview.java
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private static final String TAG = "CameraPreview";
private SurfaceHolder mHolder;
private Camera mCamera;
private boolean isPreviewRunning = false;
public CameraPreview(Context context, Camera camera) {
super(context);
mCamera = camera;
mHolder = getHolder();
mHolder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
// create the surface and start camera previre
if (mCamera == null) {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
}
} catch (Exception e) {
Log.e(TAG, " surfaceCreated " + e);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// If your preview can change or rotate, take care of those events here.
// Make sure to stop the preview before resizing or reformatting it.
//refreshCamera(mCamera);
if (isPreviewRunning) {
mCamera.stopPreview();
}
Camera.Parameters parameters = mCamera.getParameters();
Display display = ((WindowManager) getContext().getSystemService(Context.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();
}
public void refreshCamera(Camera camera) {
if (mHolder == null) {
// preview surface does not exist
return;
}
try {
mCamera.stopPreview();
} catch (Exception e) {
Log.e(TAG, " refreshCamera " + e);
}
setCamera(camera);
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
Log.e(TAG, " refreshCamera " + e);
}
}
private void setCamera(Camera camera) {
//method to set a camera instance
mCamera = camera;
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.release();
}
public void previewCamera() {
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
isPreviewRunning = true;
} catch (Exception e) {
Log.d(TAG, "Cannot start preview " + e);
}
}
}
在CameraPreview.java中
后
setCamera(camera);
try {
mCamera.setPreviewDisplay(mHolder);
寫這個:
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
如果您具有文件路徑和位圖,請使用以下方法檢查旋轉並進行修復:
public Bitmap checkRotation(String filePath, Bitmap scaledBitmap) {
ExifInterface exif;
try {
exif = new ExifInterface(filePath);
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION, 0);
Log.d("EXIF", "Exif: " + orientation);
Matrix matrix = new Matrix();
if (orientation == 6) {
matrix.postRotate(90);
Log.d("EXIF", "Exif: " + orientation);
} else if (orientation == 3) {
matrix.postRotate(180);
Log.d("EXIF", "Exif: " + orientation);
} else if (orientation == 8) {
matrix.postRotate(270);
Log.d("EXIF", "Exif: " + orientation);
}
scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix,
true);
} catch (IOException e) {
e.printStackTrace();
}
return scaledBitmap;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.