java - Android:相机表面 View 模糊

标签 java android android-camera

我正在使用 android 相机 api 构建自己的相机应用程序。我有一个可用的应用程序,但预览不如默认相机应用程序清晰。为什么会这样?下面是我的代码。

public class showCamera  extends SurfaceView implements SurfaceHolder.Callback {

       private static final int PICTURE_SIZE_MAX_WIDTH =640;
        private static final int PREVIEW_SIZE_MAX_WIDTH = 640;
    //private Camera theCamera;
    private SurfaceHolder holdMe;
       private Camera theCamera;
        int h;
       int w;

    public showCamera (Context context,Camera camera,int w,int h)
    {
          super(context);
          theCamera = camera;
          holdMe = getHolder();
          holdMe.addCallback(this);
          this.h=h;
          this.w=w;




    }

    public showCamera(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub





    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        try   {
             theCamera.setPreviewDisplay(holder);
                //setDisplayOrientation(theCamera,90);
            if( (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ))
            { theCamera.setDisplayOrientation(90); 
            }


            Camera.Parameters parameters = theCamera.getParameters();
            Log.d("     " , " THIS IS THE FLASH MODE = " + parameters.getFlashMode()) ;
             List<String> g=  parameters.getSupportedFocusModes();

             for(int j=0;j<g.size();j++)
             {
                 Log.d("     " , " THIS IS focus modes =" + g.get(j)) ;

             }

            Size bestPreviewSize = determineBestPreviewSize(parameters);
            Size bestPictureSize = determineBestPictureSize(parameters);

            parameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height);
            parameters.setPictureSize(bestPictureSize.width, bestPictureSize.height);
            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
            theCamera.setParameters(parameters);

             theCamera.startPreview(); 








          } catch (IOException e) {
          }


    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
         theCamera.stopPreview();
         theCamera.release();
        // TODO Auto-generated method stub

    }
     protected void setDisplayOrientation(Camera camera, int angle){
            Method downPolymorphic;
            try
            {
                downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
                if (downPolymorphic != null)
                    downPolymorphic.invoke(camera, new Object[] { angle });
            }
            catch (Exception e1)
            {
            }
        }

     private Size determineBestPreviewSize(Camera.Parameters parameters) {
            List<Size> sizes = parameters.getSupportedPreviewSizes();

            return determineBestSize(sizes, PREVIEW_SIZE_MAX_WIDTH);
        }

        private Size determineBestPictureSize(Camera.Parameters parameters) {
            List<Size> sizes = parameters.getSupportedPictureSizes();

            return determineBestSize(sizes, PICTURE_SIZE_MAX_WIDTH);
        }





     protected Size determineBestSize(List<Size> sizes, int widthThreshold) {
            Size bestSize = null;

            for (Size currentSize : sizes) {
                boolean isDesiredRatio = (currentSize.width / 4) == (currentSize.height / 3);
                boolean isBetterSize = (bestSize == null || currentSize.width > bestSize.width);
                boolean isInBounds = currentSize.width <= PICTURE_SIZE_MAX_WIDTH;

                if (isDesiredRatio && isInBounds && isBetterSize) {
                    bestSize = currentSize;
                }
            }

            if (bestSize == null) {


                return sizes.get(0);
            }

            return bestSize;
        }





     AutoFocusCallback autoFocusCallback = new AutoFocusCallback() {
          @Override
          public void onAutoFocus(boolean success, Camera camera) {
            Log.i("tag","this ran sdfgfhgjkldxbvnm,jhgfdkmn" ); 

          }
        };









}

主要 Activity

 public class MainActivity extends Activity implements OnClickListener {

    private Camera cameraObject;
    private showCamera showCamera;
    int h;
    int w = 1080;
    LinearLayout Top, Buttom;
    Button b;

    public static Camera isCameraAvailiable() {
        Camera object = null;
        try {

            object = Camera.open();
            object.getParameters();

        } catch (Exception e) {
        }
        return object;
    }

    AutoFocusCallback autoFocusCallback = new AutoFocusCallback() {
        @Override
        public void onAutoFocus(boolean success, Camera camera) {
            Log.i("tag", "this ran sdfgfhgjkldxbvnm,jhgfdkmn");

        }
    };

    private PictureCallback capturedIt = new PictureCallback() {

        @Override
        public void onPictureTaken(byte[] data, Camera camera) {

            Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
            if (bitmap == null) {
                Toast.makeText(getApplicationContext(), "not taken",
                        Toast.LENGTH_SHORT).show();
            } else {
                File pictureFile = MediaOutput();
                if (pictureFile == null) {
                    Log.d("",
                            "Error creating media file, check storage permissions: ");
                    return;
                }

                try {
                    FileOutputStream fos = new FileOutputStream(pictureFile);
                    fos.write(data);
                    MediaStore.Images.Media.insertImage(getContentResolver(),
                            bitmap, "testing ", "");
                    Toast.makeText(getApplicationContext(), "taken",
                            Toast.LENGTH_SHORT).show();
                    fos.close();
                } catch (FileNotFoundException e) {
                    Log.d("", "File not found: " + e.getMessage());
                } catch (IOException e) {
                    Log.d("", "Error accessing file: " + e.getMessage());
                }

            }

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camlay);
        Top = (LinearLayout) findViewById(R.id.top_bar);
        Buttom = (LinearLayout) findViewById(R.id.but_bar);
        b = (Button) findViewById(R.id.but_pic);
        b.setOnClickListener(this);
        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int width = size.x;
        int height = size.y;

        h = (int) Math.round(0.8 * height);

        Log.d(" ", "  height " + h);
        Log.d(" ", "  width " + width);
        Top.setLayoutParams(new LinearLayout.LayoutParams(width, (int) Math
                .round(0.10 * height)));
        Buttom.setLayoutParams(new LinearLayout.LayoutParams(width, (int) Math
                .round(0.10 * height)));

        cameraObject = isCameraAvailiable();
        showCamera = new showCamera(this, cameraObject, width, h);
        FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);

        preview.addView(showCamera, new FrameLayout.LayoutParams(width, h));
        // preview.addView(showCamera);

    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        switch (v.getId()) {
        case R.id.but_pic:
            // cameraObject.takePicture(null, null,capturedIt);

            // parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
            Camera.Parameters parameters = cameraObject.getParameters();

            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
            cameraObject.setParameters(parameters);

            cameraObject.autoFocus(autoFocusCallback);
            // cameraObject.stopPreview();

            break;
        }

    }

    private static File MediaOutput() {
        File mediaStorageDir = new File(
                Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                "MyCameraApp");

        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                Log.d("MyCameraApp", "failed to create directory");
                return null;
            }
        }

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
                .format(new Date());
        File mediaFile;
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "IMG_" + timeStamp + ".jpg");

        return mediaFile;

    }

}

如果您能为我指出正确的方向,那就太好了。

最佳答案

您是否曾尝试在 showCamera 类中增加这些值:

    private static final int PICTURE_SIZE_MAX_WIDTH = 640;
    private static final int PREVIEW_SIZE_MAX_WIDTH = 640;

关于java - Android:相机表面 View 模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25146987/

相关文章:

java - 如何在android中制作文件的副本?

Java Http POST 未按预期工作?

java - 当带有相机预览的 fragment 可见时,setcurrentItem 不起作用

android - 如何使用 OpenCV 在 Android 相机上禁用/修改 AutoFocus 和 AutoWhiteBalance

java - Android相机预览回调缓冲区未填充: is always full of zeros

java - 从 Java 应用程序调用时 Powershell 进程挂起

java - 使用带有 xml.xsd 导入 : "Failed to read schema document ' xml. xsd 的 XJC 时出错”

android - 如何在 flutter android 插件包中处理 android 生命周期

android - LG手机无法访问SqLite数据库

java - 使用 AppCompatActivity 和 Swipper 使用多个类扩展 java