照相机出错!
自己做了一个简单的照相机预览的功能,插在程序中,运行出错,大概提示:
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