我已将相机设置为墙纸,但相机预览被垂直拉伸

问题描述 投票:0回答:1

我正在开发墙纸应用程序,因为我已经在墙纸中设置了摄像头预览,但是摄像头预览被拉伸为动态墙纸,我尝试了很多代码,但是没有人处理墙纸,所有代码都可以在纹理视图和帧布局中使用

TransallpaperService

import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.view.SurfaceHolder;

import static android.graphics.PixelFormat.OPAQUE;

public class TransparentWallpaperService extends WallpaperService {


    @Override
    public Engine onCreateEngine() {
        return new GlowEngine();
    }

    private class GlowEngine extends Engine {
        private final Handler handler = new Handler();
        private final Runnable viewRunner = new Runnable() {

            @Override
            public void run() {

                drawView();

            }

        };

        private boolean visible = true;

        public GlowEngine() {

            super();
            view = new CameraView(getBaseContext(), getSurfaceHolder());
            handler.post(viewRunner);

        }

        @Override
        public void onVisibilityChanged(boolean visible) {
            this.visible = visible;
            if (visible) {
                handler.post(viewRunner);
            } else {
                handler.removeCallbacks(viewRunner);
            }
        }


        private CameraView view;

        @Override
        public void onSurfaceDestroyed(SurfaceHolder holder) {
            super.onSurfaceDestroyed(holder);
            this.visible = false;
            handler.removeCallbacks(viewRunner);
        }

        private void drawView() {

            view.surfaceChanged(getSurfaceHolder(), OPAQUE, view.getMeasuredWidth(), view.getMeasuredHeight());
            handler.removeCallbacks(viewRunner);
            if (visible) {
                handler.postDelayed(viewRunner, 4000);
            }
        }


    }

}

CameraView.java

我尝试使用该代码显示摄影机预览,但摄影机在墙纸中拉伸

import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Build;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.IOException;

public class CameraView extends SurfaceView implements SurfaceHolder.Callback {

    private SurfaceHolder holder;

    private Camera camera;
    private Camera mCamera;

    public CameraView(Context context) {

        super(context);

        camera = getCameraInstance();

    }

    public CameraView(Context context, SurfaceHolder holder) {

        this(context);
        this.holder = holder;

        holder.addCallback(this);
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }

    }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {


        if(camera == null) {
            camera = getCameraInstance();
        }

        if(camera != null) {
            // The Surface has been created, now tell the camera where to draw the preview.
            try {
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();
            }
            catch (IOException e) {
                Log.e("CameraView", "Error setting camera preview: " + e.getMessage());
            }
        }

    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {

        boolean portrait = true;

        if (width > 0 && height >0 && width < height){
            portrait =true;
        } else if (width > 0 && height >0 && width > height){
            portrait = false;
        }

        Camera.Parameters parameters;
        if (camera == null) {
            camera = getCameraInstance();
        }
        if (camera != null){
            parameters = camera.getParameters();
            Camera.Size size = parameters.getPictureSize();
            size = parameters.getPreviewSize();
            parameters.setPreviewSize(size.width, size.height);
            if (portrait) {
                camera.setDisplayOrientation(90);
            } else {
                camera.setDisplayOrientation(180);
            }
            try {
                camera.setParameters(parameters);
                camera.setPreviewDisplay(holder);
                camera.startPreview();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        if(camera != null) {
            try {
                camera.stopPreview();
                camera.release();
            }
            catch (Exception e) {
                Log.e("CameraView", "Error stopping camera preview: " + e.getMessage());
            }
        }

    }

    private Camera getCameraInstance() {

        Context context = getContext();
        Camera camera = null;
        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
            try {
                camera = Camera.open();
            }
            catch (Exception e) {
                Log.e("CameraView", "Error getting camera instance: " + e.getMessage());
            }
        }
        else {
            Log.i("CameraView", "No camera found!");
        }
        return camera;
    }
}
android android-camera2 live-wallpaper
1个回答
0
投票
您有解决方案吗?我在使用相机API 2时遇到同样的问题
© www.soinside.com 2019 - 2024. All rights reserved.