2015-04-26 59 views
0

SurfaceView上的摄像头预览被拉伸我试图使相机预览正确显示在SurfaceView上。但是,尽管尝试getSupportedPictureSizes()并将pictureSizepreviewSize设置为列表中的其中一个值,但预览仍然非常非常紧张。虽然设置大小

我决定我想要的大小通过720个像素是1280,我已经无处不在设置这个值(并再次,它是在getSupportedPictureSizes(),以及getSupportedPreviewSizes()

我已经浏览所有的#1的在这个问题上的帖子,我似乎无法解决。任何帮助表示赞赏。

surfaceCreated()我SurfaceHolder:

public void surfaceCreated(SurfaceHolder holder) 
{ 
    Camera.Parameters parameters = camera.getParameters(); 

    parameters.setPictureSize(1280, 720); 
    parameters.setPreviewSize(1280, 720); 

    Log.d("SurfaceView", surfaceView.getWidth() + ", " + surfaceView.getHeight()); 

    camera.setParameters(parameters); 
    camera.setDisplayOrientation(90); 

    previewCamera(); 
} 

SurfaceView设计XML:

<SurfaceView 
    android:layout_width="1280px" 
    android:layout_height="720px" 
    android:layout_gravity="center_horizontal" 
    android:id="@+id/surfaceViewCamera" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true"/> 

整个活动类:

package org.ownzone.security_droid; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.hardware.Camera; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.WindowManager; 
import android.widget.CompoundButton; 
import android.widget.Switch; 
import android.widget.TextView; 

public class AuthenticatedActivity extends ActionBarActivity 
{ 
    private ServerConnection sc = ServerConnection.getServerConnectionInstance(); 
    private boolean active; 

    private Camera camera; 
    private SurfaceView surfaceView; 
    private SurfaceHolder surfaceHolder; 
    private boolean isPreviewRunning; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_authenticated); 

     active = false; 
     isPreviewRunning = false; 

     TextView headline = (TextView) findViewById(R.id.textViewHeadLine); 
     headline.setText(getIntent().getStringExtra("cardholder") + " authenticated"); 

     Switch activeSwitch = (Switch) findViewById(R.id.switchActive); 
     activeSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
     { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
      { 
       active = isChecked; 
      } 
     }); 

     surfaceView = (SurfaceView) findViewById(R.id.surfaceViewCamera); 

     camera = Camera.open(); 

     for (Camera.Size size : camera.getParameters().getSupportedPictureSizes()) 
     { 
      Log.d("Size", size.width + ", " + size.height); 
     } 

     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(surfaceHolderCallback); 
     //camera.setPreviewDisplay(surfaceView.getHolder()); 
     //camera.startPreview(); 

     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    } 

    private void takePhoto() 
    { 
     camera.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback); 
    } 

    SurfaceHolder.Callback surfaceHolderCallback = new SurfaceHolder.Callback() 
    { 
     @Override 
     public void surfaceCreated(SurfaceHolder holder) 
     { 
      Camera.Parameters parameters = camera.getParameters(); 

      parameters.setPictureSize(1280, 720); 
      parameters.setPreviewSize(1280, 720); 

      Log.d("SurfaceView", surfaceView.getWidth() + ", " + surfaceView.getHeight()); 

      camera.setParameters(parameters); 
      camera.setDisplayOrientation(90); 

      previewCamera(); 
     } 

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

     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) 
     { 

     } 
    }; 

    public void previewCamera() 
    { 
     try 
     { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
      isPreviewRunning = true; 
     } 
     catch (Exception e) 
     { 
      Log.d("AuthenticatedActivity", "Cannot start preview", e); 
     } 
    } 


    Camera.ShutterCallback shutterCallback = new Camera.ShutterCallback() 
    { 
     public void onShutter() 
     { 

     } 
    }; 

    Camera.PictureCallback rawPictureCallback = new Camera.PictureCallback() 
    { 
     public void onPictureTaken(byte[] data, Camera camera) 
     { 

     } 
    }; 

    Camera.PictureCallback jpegPictureCallback = new Camera.PictureCallback() 
    { 
     public void onPictureTaken(byte[] data, Camera camera) 
     { 
      Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0, data.length); 
      Bitmap correctBmp = Bitmap.createBitmap(bitmapPicture, 0, 0, bitmapPicture.getWidth(), bitmapPicture.getHeight(), null, true); 

     } 
    }; 
} 
+0

这是哪种设备?你是陛下它支持1280x720预览吗?什么是拉伸?捕获的静态JPEG图片,或者在屏幕上实时预览,或者在ImageView上渲染的位图?如果您可以发布带有示例JPEG和屏幕截图的更新,则会更容易。 –

回答

0

没有截图,这是一个猜测,但我会怀疑你的电话setDisplayOrientation。

硬编码的值有可能适用于单个设备或一组设备,但在一般情况下,你需要考虑以下几个因素 - 在这里看到的文档:http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)

而且在一般情况下,大多数设备上都(但不是全部!),如果您在手机上安装了横向应用程序,则最终将调用setDisplayOrientation(0)而不是90.

您的应用是面向横幅还是纵向(或灵活)? ?截图将有助于排除各种问题。

相关问题