Java Android:如何获取内置摄像头应用程序的默认摄像头设置

Java Android:如何获取内置摄像头应用程序的默认摄像头设置,java,android,camera,settings,default,Java,Android,Camera,Settings,Default,我看过很多教程和信息,但是我找不到任何一个地方如何将现有相机应用程序的默认设置应用到任何其他定制相机应用程序中。我已经看到了图像的清晰度,在内置摄像头应用程序中,它的焦距非常好。现在我正在用我的自定义功能创建我自己的应用程序,但我仍然无法使它清晰和不模糊。。。我不想使用相机的意图技术,因为我必须在之后做一些图像处理 我曾经使用过缩放,但奇怪的是,缩放并没有正常工作……就像它在内置的相机应用程序中工作一样 这是我的表面变化代码 public void surfaceChanged(Surfa

我看过很多教程和信息,但是我找不到任何一个地方如何将现有相机应用程序的默认设置应用到任何其他定制相机应用程序中。我已经看到了图像的清晰度,在内置摄像头应用程序中,它的焦距非常好。现在我正在用我的自定义功能创建我自己的应用程序,但我仍然无法使它清晰和不模糊。。。我不想使用相机的意图技术,因为我必须在之后做一些图像处理

我曾经使用过缩放,但奇怪的是,缩放并没有正常工作……就像它在内置的相机应用程序中工作一样

这是我的表面变化代码

   public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
    Log.e(TAG, "surfaceChanged");

    // XXX stopPreview() will crash if preview is not running
    if (mPreviewRunning) {
        mCamera.stopPreview();
    }


     Camera.Parameters params = mCamera.getParameters();
     List<Camera.Size> sizes = params.getSupportedPreviewSizes();
     mFrameWidth =  w;
     mFrameHeight = h;

     // selecting optimal camera preview size
     {
         double minDiff = Double.MAX_VALUE;
         for (Camera.Size size : sizes) 
         {
             if (Math.abs(size.height - h) < minDiff) 
             {
                 mFrameWidth = size.width;
                 mFrameHeight = size.height;
                 minDiff = Math.abs(size.height - h);
             }
         }
     }

    try 
    {

        //params.set("rotation", 180);
        //params.set("orientation", "landscape");
        //params.set("auto", "WHITE_BALANCE_AUTO");//WHITE_BALANCE_AUTO 




        Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

        if(display.getRotation() == Surface.ROTATION_0)
        {
            params.setPreviewSize(mFrameHeight, mFrameWidth);                           
            mCamera.setDisplayOrientation(90);
        }

        if(display.getRotation() == Surface.ROTATION_90)
        {
            params.setPreviewSize(mFrameWidth, mFrameHeight);                           
        }

        if(display.getRotation() == Surface.ROTATION_180)
        {
            params.setPreviewSize(mFrameHeight, mFrameWidth);               
        }

        if(display.getRotation() == Surface.ROTATION_270)
        {
            params.setPreviewSize(mFrameWidth, mFrameHeight);
            mCamera.setDisplayOrientation(180);
        }

        if(params.isZoomSupported())
        {

            Log.e(TAG, params.getZoom()+"surfaceChanged camer zoom"+params.getMinExposureCompensation());
            params.setZoom(params.getMaxZoom());
            params.setExposureCompensation(1);
                  //    params.setColorEffect("none");
            params.setWhiteBalance(params.WHITE_BALANCE_AUTO);
            params.setFocusMode(params.FOCUS_MODE_AUTO);
            params.setSceneMode(params.SCENE_MODE_ACTION);

        }

        params.set("auto", "FOCUS_MODE_AUTO");

        params.setPreviewSize(mFrameWidth,mFrameHeight);
        mCamera.setParameters(params);

        mCamera.setPreviewDisplay(holder);
    }
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mCamera.startPreview();
    mPreviewRunning = true;
}  
public void surfaceChanged(SurfaceHolder holder,int格式,int w,int h)
{
Log.e(标签“表面变化”);
//如果预览未运行,XXX stopReview()将崩溃
如果(mPreviewRunning){
mCamera.stopPreview();
}
Camera.Parameters params=mCamera.getParameters();
列表大小=params.getSupportedPreviewSizes();
mFrameWidth=w;
mFrameHeight=h;
//选择最佳相机预览尺寸
{
double minDiff=double.MAX_值;
用于(相机尺寸:尺寸)
{
if(数学绝对值(尺寸高度-h)

请告诉我如何使相机预览与内置应用程序完全相同。

你是说全屏相机预览

我使用以下代码:

this.requestWindowFeature(Window.FEATURE_NO_TITLE); //no title
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //no status bar, etc
这是:

setContentView(R.layout.main);
    addContentView(overlay, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
((FrameLayout) findViewById(R.id.preview)).addView(preview);
第一个代码段将应用程序设置为全屏,并隐藏标题和状态栏。 第二个snipppet将我的覆盖图(扩展视图)添加到主布局中

下面是我的xml和java代码: main.xml:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <FrameLayout
        android:id="@+id/preview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
    </LinearLayout>
我的活动:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); //no title
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //fullscreen
    overlay = new Overlay(this);
    setContentView(R.layout.main);
    addContentView(overlay, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    camera = getCameraInstance(); //camera.open();
    preview = new Preview(this, camera);
    ((FrameLayout) findViewById(R.id.preview)).addView(preview);
}

希望对你有所帮助

我遇到了与你相同的问题。阅读了内置摄像头应用程序的源代码,比较了内置摄像头和我自己的摄像头的对焦处理,我意识到问题出在自动对焦上

所以试试这个:

    mCamera.autoFocus(new Camera.AutoFocusCallback() {
        @Override
        public void onAutoFocus(boolean success, Camera camera) {
            mCamera.takePicture(null, null, mPicture);
        }
    }); 
这使得结果图像像内置相机一样清晰。
文档是。

您看过Android摄像头应用程序代码了吗。您可以将其作为支持的操作系统的最低版本,并将其用作基础。请记住,每次操作系统升级都会增加附加功能,并且您的设备制造商可能支持其他设备上可能存在或可能不存在的功能。您的代码是否考虑了条形图占用的空间?我有一个类似的解决方案,但我必须得到酒吧的高度,并添加它作为填充。
    mCamera.autoFocus(new Camera.AutoFocusCallback() {
        @Override
        public void onAutoFocus(boolean success, Camera camera) {
            mCamera.takePicture(null, null, mPicture);
        }
    });