简体   繁体   English

在Android上使用Camera Preview时遇到问题

[英]Having Problems with Camera Preview on Android

I kow this might be an old topic and gone through certain threads on stack overflow, but couldn't get a satisfying anwser, thus asking it again. 我知道这可能是一个古老的话题,并且在堆栈溢出时经历了某些线程,但无法获得令人满意的答案,因此再次提出要求。

I created a camera preview for my application and tested on my phone, it worked well, but i tried on tablet, which either lead to crashing or just a black screen. 我为我的应用程序创建了一个摄像头预览,并在手机上进行了测试,效果很好,但是我尝试在平板电脑上使用,这可能导致崩溃或黑屏。

already checked the problem about supportedpreviewsize, but still doesn't work, here's the code for camera preview 已经检查了有关supportpreviewsize的问题,但仍然无法使用,这是相机预览的代码

import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class Bettercam extends SurfaceView implements SurfaceHolder.Callback {

SurfaceHolder sholder = null;
SurfaceView sview = null;
Camera cam = null;

public Bettercam(Context context, Camera camera) 
{
    super(context);
    sholder = sview.getHolder();
    sholder.addCallback(this);
}


//method which gets the best  size for displaying preview
public Size getBstSize(int width, int height,Camera.Parameters param)

{
    Size result= null;
    for(Size size : param.getSupportedPreviewSizes())
    {
        if(size.width <= width && size.height <= height)
        {
            if(result==null)
            {
                result=size;
            }
        }
        else
        {
            int newarea = size.width  * size.height;
            int resultarea = result.width * result.height;
            if(newarea > resultarea)
            {
                result=size;
            }
        }
    }

    return (result);

}


//Preview Intializing Method
public void Initpreview(int width, int height)
{
        cam = Camera.open();
        Camera.Parameters parameters=cam.getParameters();
        Camera.Size size=getBstSize(width, height,parameters);
        parameters.setPreviewSize(size.width, size.height);
          cam.setParameters(parameters);
        try
        {
            cam.setPreviewDisplay(sholder);
        }
        catch (Throwable ex)
        {
            cam.release();
            Log.e("Exception in setpreviewdisplay", ex.toString());

        }


}

public void startprev()
{

        cam.startPreview();

}

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

    startprev();


}

@Override
public void surfaceCreated(SurfaceHolder holder) 
{
    // TODO Auto-generated method stub

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) 
{
    cam.stopPreview();
    cam.setPreviewCallback(null);
    cam.release();


}

} }

Using camera preview in activity 在活动中使用相机预览

public class Glass extends Activity 
{
static Context cont;
//  Camera cam = accesscam();
 Camera cam = Camera.open();    
@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_glass);


    try
    {
        Bettercam campre = new Bettercam(this, cam);
        FrameLayout frm = (FrameLayout) findViewById(R.id.frameglass);
        frm.addView(campre);
    }
    catch(Exception ex)
    {



    }
}
/*static Camera accesscam()
{
    Camera c = null;
            try
            {
                c = Camera.open();
            }
            catch (Exception ex)
            {
                Log.d("Unable to open camera", ex.getMessage());
            }


        return c;


}*/
}

and Logcat... 和Logcat ...

10-27 17:58:26.640: W/dalvikvm(7380): threadid=1: thread exiting with uncaught       exception (group=0x412b02a0)
10-27 17:58:26.648: E/AndroidRuntime(7380): FATAL EXCEPTION: main
10-27 17:58:26.648: E/AndroidRuntime(7380): java.lang.RuntimeException: Unable to start    activity ComponentInfo{test.argsimulation/test.argsimulation.Glass}: java.lang.RuntimeException: setView must have been called
10-27 17:58:26.648: E/AndroidRuntime(7380):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2129)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2154)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at android.app.ActivityThread.access$700(ActivityThread.java:146)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1260)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at android.os.Looper.loop(Looper.java:137)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at android.app.ActivityThread.main(ActivityThread.java:4949)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at java.lang.reflect.Method.invokeNative(Native Method)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at java.lang.reflect.Method.invoke(Method.java:511)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1043)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:810)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at dalvik.system.NativeStart.main(Native Method)
10-27 17:58:26.648: E/AndroidRuntime(7380): Caused by: java.lang.RuntimeException: setView must have been called
10-27 17:58:26.648: E/AndroidRuntime(7380):     at android.widget.Toast.show(Toast.java:103)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at test.argsimulation.Glass.onCreate(Glass.java:28)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at android.app.Activity.performCreate(Activity.java:5185)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
10-27 17:58:26.648: E/AndroidRuntime(7380):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2093)
10-27 17:58:26.648: E/AndroidRuntime(7380):     ... 11 more

in your activity you have initialized your cam before onCereate(). 在您的活动中,您已经在onCereate()之前初始化了cam。 might be the problem 可能是问题

Have you initialized sview ? 您是否已初始化sview your code: 您的代码:

SurfaceView sview = null;
public Bettercam(Context context, Camera camera) 
{
    super(context);
    sholder = sview.getHolder(); // sview = ?
    sholder.addCallback(this);
}

Well found the answer.. I was setting incorrect parameters... here's the working code.. 很好找到答案..我设置了错误的参数...这是工作代码..

public class Bettercam extends SurfaceView implements SurfaceHolder.Callback {

SurfaceHolder sholder;
Camera cam;

public Bettercam(Context context, Camera camera) 
{
    super(context);
    cam = camera;
    sholder = getHolder();
    sholder.addCallback(this);
}


//method which gets the best  size for displaying preview
/*public Size getBstSize(int width, int height,Camera.Parameters param)

{
    Size result= null;
    for(Size size : param.getSupportedPreviewSizes())
    {
        if(size.width <= width && size.height <= height)
        {
            if(result==null)
            {
                result=size;
            }
        }
        else
        {
            int newarea = size.width  * size.height;
            int resultarea = result.width * result.height;
            if(newarea > resultarea)
            {
                result=size;
            }
        }
    }

    return (result);

}
*/

//Preview Intializing Method
public void Initpreview(int width, int height)
{
        /*Camera.Parameters parameters=cam.getParameters();
        Camera.Size size=getBstSize(width, height,parameters);
        parameters.setPreviewSize(size.width, size.height);
          cam.setParameters(parameters);*/
        try
        {
            cam.setPreviewDisplay(sholder);
            cam.startPreview();
        }
        catch (Throwable ex)
        {
            cam.stopPreview();
            cam.release();
            Log.e("Exception in setpreviewdisplay", ex.toString());

        }


}



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

    if(sholder.getSurface()==null)
    {
        return;
    }


}

@Override
public void surfaceCreated(SurfaceHolder holder) 
{
    try
    {
        cam.setPreviewDisplay(sholder);
        cam.startPreview();
    }
    catch (Throwable ex)
    {
        cam.stopPreview();
        cam.release();
        Log.e("Exception in setpreviewdisplay", ex.toString());

    }
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) 
{
    cam.stopPreview();
    cam.setPreviewCallback(null);
    cam.release();


}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM