【问题标题】:Having Problems with Camera Preview on Android在 Android 上使用相机预览时出现问题
【发布时间】:2013-10-31 20:01:04
【问题描述】:

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

我为我的应用程序创建了一个相机预览并在我的手机上进行了测试,它运行良好,但我在平板电脑上尝试过,这会导致崩溃或只是黑屏。

已经检查过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();


}

}

在活动中使用相机预览

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;


}*/
}

和 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

【问题讨论】:

  • 您在 Glass.java 的第 28 行显示了哪个 Toast?

标签: java android eclipse camera android-camera


【解决方案1】:

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

【讨论】:

  • 解决了这个问题....在 try 块中初始化它...但主要问题仍然存在....
【解决方案2】:

你初始化sview了吗?你的代码:

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

【讨论】:

    【解决方案3】:

    找到答案了.. 我设置了错误的参数... 这是工作代码..

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

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多