android最新相机打不开,相机出错

在开发Android应用程序时,尝试实现一个简单的相机预览功能,但遇到了 InflateException 和 ClassNotFoundException。问题出在 XML 文件中 SurfaceView 的引用以及布局尺寸的设置。解决方案包括检查依赖库是否缺失,确保使用正确的 SurfaceView 类名,并且使用 dp 单位代替 px 以确保跨设备兼容性。此外,还需要正确实现 SurfaceHolder.Callback,确保相机预览的初始化和销毁操作。还要注意在 manifest 文件中添加相机使用的权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

照相机出错!

自己做了一个简单的照相机预览的功能,插在程序中,运行出错,大概提示:

Caused by: android.view.InflateException: Binary XML file line #86: Error inflating class surfaceview

还有:

Caused by: java.lang.ClassNotFoundException: android.view.surfaceview

和一大堆:

[CDS]Libcore_io_Posix-throwErrnoException, functionName: access; errno: No such file or directory

我的main.xml文件中第86行是:

android:layout_width="800px"

android:layout_height="480px"

android:layout_gravity="center">

这个surfaceview夹在一堆imageview中;

这样有问题吗?请教各位前辈!!谢谢!

------解决方案--------------------

少了包了吧,建议你去下载个例子看看

------解决方案--------------------

有surfaceview这个系统定义控件么?没有吧,所以报错

还有定义layout_width和layout_height不建议用px作为单位。

因为像素做单位在不同的设备里显示的大小差异可能非常大。建议用dp~

------解决方案--------------------

缺少库文件,如果是第三方库,请导入该库。

------解决方案--------------------

我怎么记得是SurfaceView,xml是大小写敏感的

还有如果你想一进入activity就打开摄像头开启预览, 需要重写callback。另外摄像头你需要在manifest里添加权限

需要一个SurfaceHolder对象

//example

cameraHolder = surface.getHolder();      //surface是你的SurfaceView

cameraHolder.setKeepScreenOn(true);

camera = Camera.open();

camera.setDisplayOrientation(90);

cameraHolder.addCallback(new CameraPreview(camera));

cameraHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

然后重写callback

import java.io.IOException;

import android.hardware.Camera;

import android.view.SurfaceHolder;

public class CameraPreview implements SurfaceHolder.Callback {

private Camera mCamera;

public CameraPreview(Camera camera) {

mCamera = camera;

}

public void surfaceChanged(SurfaceHolder holder, int arg1, int arg2, int arg3) {

if (holder.getSurface() == null) {

return;

}

try {

mCamera.stopPreview();

} catch (Exception e) {

}

try {

mCamera.setPreviewDisplay(holder);

mCamera.startPreview();

} catch (Exception e) {

e.printStackTrace();

}

}

public void surfaceCreated(SurfaceHolder holder) {

try {

mCamera.setPreviewDisplay(holder);

mCamera.startPreview();

} catch (IOException e) {

e.printStackTrace();

}

}

public void surfaceDestroyed(SurfaceHolder holder) {

}

}

录制视频用 mediarecorder

拍照写个 PictureCallback, 实现 onPictureTaken 方法

------解决方案--------------------

借鉴下这个?不过我还没跑过。

不过显然还是用了SurfaceView~

应该是谷歌不希望有这样可能侵犯用户隐私的应用存在,所以要用View显示它,只是在这个应用里用户看不见。

就像service在高版本api下要由activity启动~

http://www.linuxidc.com/Linux/2013-01/78501.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值