Android–cam.setPreviewDisplay(holder)运行IOError

Android–cam.setPreviewDisplay(holder)运行IOError,第1张

概述我试图将相机的图像用作动态壁纸的一部分.在我声明的引擎中,我有这个代码:publicclassClassextendsWallpaperService{Cameracam;@OverridepublicvoidonCreate(){super.onCreate();cam=Camera.open();}//...@O

我试图将相机的图像用作动态壁纸的一部分.

在我声明的引擎中,我有这个代码:

public class Class extends WallpaperService{    Camera cam;    @OverrIDe    public voID onCreate()    {        super.onCreate();        cam = Camera.open();    }    //...    @OverrIDe    public Engine onCreateEngine()    {        return new CubeEngine(cam);    }    class CubeEngine extends Engine    {        Camera cam;        CubeEngine(Camera cam)        {            this.cam=cam;        }        //...        @OverrIDe        public voID onDestroy()        {            if (cam != null)            {                cam.stopPrevIEw();                cam.setPrevIEwCallback(null);                cam.release();                cam = null;            }            super.onDestroy();        }        @OverrIDe        public voID onSurfaceChanged(SurfaceHolder holder, int format,                int wIDth, int height)        {            try            {                cam.setPrevIEwdisplay(holder);                cam.startPrevIEw();            }            catch (IOException e)            {                e.printstacktrace();            }            super.onSurfaceChanged(holder, format, wIDth, height);        }        @OverrIDe        public voID onSurfaceCreated(SurfaceHolder holder)        {            super.onSurfaceCreated(holder);        }        @OverrIDe        public voID onSurfaceDestroyed(SurfaceHolder holder)        {            if (cam != null)            {                cam.stopPrevIEw();                cam.setPrevIEwCallback(null);                cam.release();                cam = null;            }            super.onSurfaceDestroyed(holder);        }        //...    }}

cam是一个声明为Camera.open()的Camera;

当我运行这个时,我得到:java.io.IOException:setPrevIEwdisplay失败

我现在得到这个例外:

    07-26 00:12:18.399: WARN/CameraService(1357): Overlay create Failed - retrying07-26 00:12:18.419: WARN/CameraService(1357): Overlay create Failed - retrying07-26 00:12:18.439: WARN/CameraService(1357): Overlay create Failed - retrying07-26 00:12:18.459: WARN/CameraService(1357): Overlay create Failed - retrying07-26 00:12:18.479: WARN/CameraService(1357): Overlay create Failed - retrying07-26 00:12:18.509: WARN/CameraService(1357): Overlay create Failed - retrying07-26 00:12:18.529: WARN/CameraService(1357): Overlay create Failed - retrying07-26 00:12:18.549: WARN/CameraService(1357): Overlay create Failed - retrying07-26 00:12:18.569: ERROR/CameraService(1357): Overlay Creation Failed!07-26 00:12:18.609: WARN/System.err(4104): java.lang.RuntimeException: startPrevIEw Failed07-26 00:12:18.609: WARN/System.err(4104):     at androID.harDWare.Camera.startPrevIEw(Native Method)07-26 00:12:18.609: WARN/System.err(4104):     at com.petrifiednightmares.transparentphone.main.GenericaCamera.surfaceChanged(GenericaCamera.java:29)07-26 00:12:18.609: WARN/System.err(4104):     at androID.service.wallpaper.WallpaperService$Engine.updateSurface(WallpaperService.java:687)07-26 00:12:18.609: WARN/System.err(4104):     at androID.service.wallpaper.WallpaperService$Engine.attach(WallpaperService.java:749)07-26 00:12:18.619: WARN/System.err(4104):     at androID.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:984)07-26 00:12:18.619: WARN/System.err(4104):     at com.androID.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:61)07-26 00:12:18.619: WARN/System.err(4104):     at androID.os.Handler.dispatchMessage(Handler.java:99)07-26 00:12:18.619: WARN/System.err(4104):     at androID.os.Looper.loop(Looper.java:143)07-26 00:12:18.619: WARN/System.err(4104):     at androID.app.ActivityThread.main(ActivityThread.java:4293)07-26 00:12:18.629: WARN/System.err(4104):     at java.lang.reflect.Method.invokeNative(Native Method)07-26 00:12:18.629: WARN/System.err(4104):     at java.lang.reflect.Method.invoke(Method.java:507)07-26 00:12:18.629: WARN/System.err(4104):     at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)07-26 00:12:18.629: WARN/System.err(4104):     at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:597)07-26 00:12:18.629: WARN/System.err(4104):     at dalvik.system.NativeStart.main(Native Method)

解决方法:

它或多或少地跟随您的代码进行一些更改.

import java.io.IOException;import androID.harDWare.Camera;import androID.vIEw.SurfaceHolder;public class GenericaCamera implements SurfaceHolder.Callback {    private Camera         cameraDevice        = null;    private SurfaceHolder  cameraSurfaceHolder = null;     // MODIFIED FROM ORIGINAL SEE UPDATE AT BottOM    public GenericaCamera(SurfaceHolder holder)    {        cameraSurfaceHolder = holder;        cameraSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        cameraSurfaceHolder.addCallback(this);    }     // required camera surface holder interface Callback's     public voID surfaceChanged(SurfaceHolder holder, int format, int w, int h)     {         Camera.Parameters params = cameraDevice.getParameters();         Camera.Size       size   = getBestPrevIEwSize(params,w,h);         if (size != null)            params.setPrevIEwSize(size.wIDth, size.height);         cameraDevice.startPrevIEw();     }     // When the surface is ready then we can build the camera and attach      // the camera prevIEw output to the UI holder      public voID surfaceCreated(SurfaceHolder holder)     {        try {            cameraDevice = Camera.open();              cameraDevice.setPrevIEwdisplay(cameraSurfaceHolder);        } catch (IOException e) { }    }    // Stop the camera prevIEw and dispose of the camera object     public voID surfaceDestroyed(SurfaceHolder holder)    {        if (null == cameraDevice)            return;         cameraDevice.stopPrevIEw();         cameraDevice.release();         cameraDevice = null;     }    public Camera.Size getBestPrevIEwSize(Camera.Parameters parameters, int w, int h)    {        Camera.Size result = null;         for (Camera.Size size : parameters.getSupportedPrevIEwSizes())        {            if (size.wIDth <= w && size.height <= h)            {                if (null == result)                result = size;             else            {                int resultDelta = w - result.wIDth + h - result.height;                int newDelta    = w - size.wIDth   + h - size.height;                    if (newDelta < resultDelta)                result = size;             }            }         }        return result;     }

}

更新

进入壁纸代码并想出来,仍然存在问题,但至少我得到它基本上工作,时间的顺序是重要的,因为推缓冲设置

问题

>不在横向模式下,这会导致预览失真的图像,相机的已知问题尚未尝试锁定到景观中
>在预览中,如果你使用后退键,一切都被正确销毁(相机被释放)但是如果设置壁纸,那么类不会调用onDestroy方法,这意味着你无法获得相机,因为类的预览实例没有发布了它
>它也显示为锁定屏幕图像,不知道如何覆盖它,可能通过意图接收和响应并在您进入警卫/锁定屏幕时将其关闭
>没有处理能见度事件,因此其他摄像机类不起作用,潜在的不必要的电池消耗等.

无论如何,所有这些都表示修改如下,以便至少开始工作

在引擎类中,在onCreate中从上面的类创建摄像机,以后任何时候都会因推送缓冲区设置而出现问题,即使在以后的版本2.3中不推荐使用它,在旧版本中仍然需要它.事实上还没有测试过2.2以上.

@OverrIDe    public voID onCreate(SurfaceHolder holder) {        Log.d("CameraWallpaper","onCreate(SurfaceHolder holder)");        if (null == GC)        GC = new GenericaCamera(holder);    super.onCreate(holder);}

然后在GenericCamera类中更改为以下构造函数模式

public GenericaCamera(SurfaceHolder holder){     cameraSurfaceHolder = holder;     cameraSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);     cameraSurfaceHolder.addCallback(this);}

基本上就是这样,至少这应该让你开始,如果你找到1-4的任何解决方案让社区知道!

更新2

似乎AndroID 3打破了这一点,不确定为什么因为这些平台的源仍然关闭.

因此,对于高达2.3的最终答案是上述工作,但在3上它不会.

总结

以上是内存溢出为你收集整理的Android – cam.setPreviewDisplay(holder)运行IOError全部内容,希望文章能够帮你解决Android – cam.setPreviewDisplay(holder)运行IOError所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1097759.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存