
我试图将相机的图像用作动态壁纸的一部分.
在我声明的引擎中,我有这个代码:
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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)