Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android上的摄像头预览有问题吗_Java_Android_Eclipse_Camera_Android Camera - Fatal编程技术网

Java Android上的摄像头预览有问题吗

Java Android上的摄像头预览有问题吗,java,android,eclipse,camera,android-camera,Java,Android,Eclipse,Camera,Android Camera,我知道这可能是一个老话题,并且在堆栈溢出上经历了某些线程,但无法获得令人满意的anwser,因此再次询问 我为我的应用程序创建了一个摄像头预览,并在手机上进行了测试,效果很好,但我在平板电脑上进行了尝试,这要么导致崩溃,要么只是一个黑屏 已经检查了supportedpreviewsize的问题,但仍然不起作用,下面是的代码 相机预览 import android.content.Context; import android.hardware.Camera; import android.har

我知道这可能是一个老话题,并且在堆栈溢出上经历了某些线程,但无法获得令人满意的anwser,因此再次询问

我为我的应用程序创建了一个摄像头预览,并在手机上进行了测试,效果很好,但我在平板电脑上进行了尝试,这要么导致崩溃,要么只是一个黑屏

已经检查了supportedpreviewsize的问题,但仍然不起作用,下面是的代码 相机预览

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();


}
还有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

在活动中,您已在OnCerate()之前初始化了cam。可能是问题

您是否初始化了
sview
?您的代码:

SurfaceView sview = null;
public Bettercam(Context context, Camera camera) 
{
    super(context);
    sholder = sview.getHolder(); // sview = ?
    sholder.addCallback(this);
}
我们找到了答案。。 我设置了错误的参数。。。 这是工作代码

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();


}
公共类Bettercam扩展SurfaceView实现SurfaceHolder.Callback{
面层支墩;
摄像机;
公共Bettercam(上下文、摄影机)
{
超级(上下文);
摄像机;
sholder=getHolder();
sholder.addCallback(this);
}
//获取显示预览的最佳大小的方法
/*公共大小getBstSize(整数宽度、整数高度、Camera.Parameters参数)
{
大小结果=空;
对于(大小:param.getSupportedPreviewSizes())
{

如果(size.width)在Glass.java的第28行显示了哪个吐司?解决了这个问题…在try块中初始化了它…但主要问题仍然存在。。。。
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();


}