camera.setParameters失败的android [英] camera.setParameters failed in android

查看:200
本文介绍了camera.setParameters失败的android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经包含在我的应用程序中的拍摄功能。我曾经也推出了应用程序在市场上。我得到一个错误消息,他收到一个错误,同时打开相机的用户之一。

我已经测试设备上的应用程序在2.1。我从用户得到的是使用的Nexus One的错误,将主要运行2.2 ...以下是我已经收到了logcat的错误...

  java.lang.RuntimeException的:setParameters失败
在android.hardware.Camera.native_setParameters(本机方法)
在android.hardware.Camera.setParameters(Camera.java:647)
在com.CameraApp preview.surfaceChanged(preview.java:67)。
在android.view.SurfaceView.updateWindow(SurfaceView.java:538)
在android.view.SurfaceView.dispatchDraw(SurfaceView.java:339)
在android.view.ViewGroup.drawChild(ViewGroup.java:1638)
在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
在android.view.ViewGroup.drawChild(ViewGroup.java:1638)
在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
在android.view.ViewGroup.drawChild(ViewGroup.java:1638)
在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
在android.view.View.draw(View.java:6743)
在android.widget.FrameLayout.draw(FrameLayout.java:352)
在android.view.ViewGroup.drawChild(ViewGroup.java:1640)
在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
在android.view.View.draw(View.java:6743)
在android.widget.FrameLayout.draw(FrameLayout.java:352)
在com.android.internal.policy.impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:1842)
在android.view.ViewRoot.draw(ViewRoot.java:1407)
在android.view.ViewRoot.performTraversals(ViewRoot.java:1163)
在android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:123)
在android.app.ActivityThread.main(ActivityThread.java:4627)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:521)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
在dalvik.system.NativeStart.main(本机方法)
 

我跑了应用程序的2.2模拟器还进行检查。但它工作得很好。谁能告诉我,为什么错误发生?

下面是我在评论中提到的类:

 类preVIEW延伸SurfaceView实现SurfaceHolder.Callback
{
    私有静态最后字符串变量=preVIEW;

    SurfaceHolder mHolder;
    公共摄像头摄像头;

    preVIEW(上下文的背景下)
    {
        超(上下文);

        //安装SurfaceHolder.Callback所以我们得到通知时,该
        //下垫面创建和销毁。
        mHolder = getHolder();
        mHolder.addCallback(本);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    公共无效surfaceCreated(SurfaceHolder持有人)
    {
        //表面经创建,获取摄像机,并告诉它在哪里
        //绘制。
         相机= Camera.open();
        尝试 {
        camera.set previewDisplay(保持器);
        }赶上(IOException异常除外){
        camera.release();
        摄像头= NULL;
            // TODO:在此处添加更多的异常处理逻辑
        }
    }

    公共无效surfaceDestroyed(SurfaceHolder持有人)
    {
        //面,当我们返回将被销毁,所以停止了preVIEW。
        //因为CameraDevice对象不是共享资源,这是非常
        //重要的是要释放它当活动被暂停。
        camera.stop preVIEW();
        camera.release();
        摄像头= NULL;
    }

    公共无效surfaceChanged(SurfaceHolder持有人,INT格式,INT W,INT高)
    {
        //现在的尺寸是已知的,设置相机参数,并开始
        //在preVIEW。

        Camera.Parameters参数= camera.getParameters();
        parameters.set previewSize(W,H);
        camera.setParameters(参数);
        camera.start preVIEW();
    }

    @覆盖
    公共无效画(油画画布)
    {
        super.draw(画布);
        涂料P =新的油漆(Color.RED);
        Log.d(TAG,画);
        canvas.drawText(preVIEW,canvas.getWidth()/ 2,canvas.getHeight()/ 2,p)的;
    }
}
 

解决方案

这是失败的,因为不是所有的设备都支持任意的preVIEW大小。显然,有的做,但你不能依赖它。在您的surfaceChanged方法,你需要做的是这样的:

 公共无效surfaceChanged(SurfaceHolder持有人,INT格式,INT W,INT高){
    Camera.Parameters参数= camera.getParameters();
    名单< Camera.Size> previewSizes = parameters.getSupported previewSizes();

    //你需要选择最合适的previewSize您的应用程序
    Camera.Size previewSize = // ...的previewSizes选择一个在这里

    parameters.set previewSize(previewSize.width,previewSize.height);
    camera.setParameters(参数);
    camera.start preVIEW();
}
 

您将不得不想出一个办法来扩展这个,这样你就不会失去长宽比等。

有关参考这里是<一个href="http://developer.android.com/reference/android/hardware/Camera.Parameters.html#getSupported$p$pviewSizes%28%29">Android SDK文档。

I have included the camera functionality in my application. I have also launched the app in the market. I got an error message from one of the users that he is getting an error while opening the camera.

I have tested the app on the device on 2.1. The error I got from the user is using nexus one which will mostly run 2.2...Here's the logcat error that I've received...

java.lang.RuntimeException: setParameters failed
at android.hardware.Camera.native_setParameters(Native Method)
at android.hardware.Camera.setParameters(Camera.java:647)
at com.CameraApp.Preview.surfaceChanged(Preview.java:67)
at android.view.SurfaceView.updateWindow(SurfaceView.java:538)
at android.view.SurfaceView.dispatchDraw(SurfaceView.java:339)
at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
at android.view.View.draw(View.java:6743)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
at android.view.View.draw(View.java:6743)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842)
at android.view.ViewRoot.draw(ViewRoot.java:1407)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1163)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)

I ran the app on 2.2 emulator also to check it. But it worked fine. Can anyone please tell me why the error is occurring?

Here is the class which I mentioned in the comments:

class Preview extends SurfaceView implements SurfaceHolder.Callback 
{
    private static final String TAG = "Preview";

    SurfaceHolder mHolder;
    public Camera camera;

    Preview(Context context) 
    {
        super(context);

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) 
    {
        // The Surface has been created, acquire the camera and tell it where
        // to draw.
         camera = Camera.open();
        try {
        camera.setPreviewDisplay(holder);
        } catch (IOException exception) {
        camera.release();
        camera = null;
            // TODO: add more exception handling logic here
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) 
    {
        // Surface will be destroyed when we return, so stop the preview.
        // Because the CameraDevice object is not a shared resource, it's very
        // important to release it when the activity is paused.
        camera.stopPreview();
        camera.release();
        camera = null;
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) 
    {
        // Now that the size is known, set up the camera parameters and begin
        // the preview.

        Camera.Parameters parameters = camera.getParameters();
        parameters.setPreviewSize(w, h);
        camera.setParameters(parameters);
        camera.startPreview();
    }

    @Override
    public void draw(Canvas canvas) 
    {
        super.draw(canvas);
        Paint p= new Paint(Color.RED);
        Log.d(TAG,"draw");
        canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p );
    }
}

解决方案

It is failing because not all devices support arbitrary preview sizes. Apparently some do but you can't rely on it. In your surfaceChanged method you need to do something like this:

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    Camera.Parameters parameters = camera.getParameters();
    List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();

    // You need to choose the most appropriate previewSize for your app
    Camera.Size previewSize = // .... select one of previewSizes here

    parameters.setPreviewSize(previewSize.width, previewSize.height);
    camera.setParameters(parameters);
    camera.startPreview();
}

You'll have to figure out a way to scale this so that you don't lose the aspect ratio etc.

For reference here is the Android SDK doc.

这篇关于camera.setParameters失败的android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆