Android中的严重摄像头崩溃和运行时异常
我已经创建了几个摄像头应用程序,3周前我刚刚将这些应用程序发布到谷歌Play market。到目前为止,我收到了大量的碰撞报告,如下所示: java.lang.RuntimeException 在android.hardware.Camera.native_setParameters中Android中的严重摄像头崩溃和运行时异常,android,exception,crash,camera,nullpointerexception,Android,Exception,Crash,Camera,Nullpointerexception,我已经创建了几个摄像头应用程序,3周前我刚刚将这些应用程序发布到谷歌Play market。到目前为止,我收到了大量的碰撞报告,如下所示: java.lang.RuntimeException 在android.hardware.Camera.native_setParameters中 报告总数:2 java.lang.NullPointerException 在com.potatotree.autodistance.CameraSurfaceView.surfaceCreated中 报告总数:
报告总数:2 java.lang.NullPointerException 在com.potatotree.autodistance.CameraSurfaceView.surfaceCreated中
报告总数:21 java.lang.RuntimeException 在android.hardware.Camera.native_自动对焦中
报告总数:2 java.lang.RuntimeException 在android.hardware.Camera.native_设置中
报告总数:12 到目前为止,总下载量约为5000。 似乎所有的异常和崩溃都与摄像机有关。以下是CameraSurfaceView的源代码和方法
public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder mHolder;
private Camera mCamera;
private Context context;
public CameraSurfaceView(Context c) {
super(c);
context = c;
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public CameraSurfaceView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public CameraSurfaceView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}
public void surfaceCreated(SurfaceHolder holder) {
//once image is ready(captured or load), the surfaceCreated will not trigger camera again when user click on settings
mCamera = Camera.open();
try
{
mCamera.setPreviewDisplay(holder); //may throw exception
Parameters parameters = mCamera.getParameters();
if(this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
{
parameters.set("orientation", "portrait");
mCamera.setDisplayOrientation(90);
}
else
{
parameters.set("orientation", "landscape");
mCamera.setDisplayOrientation(0);
}
mCamera.setParameters(parameters);
mCamera.startPreview();
}
catch(Exception e)
{
mCamera.release();
mCamera = null;
e.printStackTrace();
}
}
public void surfaceDestroyed(SurfaceHolder arg0) {
if(mCamera != null)
{
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
public void startCamera() //resume camera
{
if(mCamera == null)
{
mCamera = Camera.open();
try
{
mCamera.setPreviewDisplay(mHolder);
Parameters parameters = mCamera.getParameters();
if(this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
{
parameters.set("orientation", "portrait");
mCamera.setDisplayOrientation(90);
}
else
{
parameters.set("orientation", "landscape");
mCamera.setDisplayOrientation(0);
}
mCamera.setParameters(parameters);
mCamera.startPreview();
}
catch(Exception e)
{
mCamera.release();
mCamera = null;
e.printStackTrace();
}
}
}
public void stopCamera() //pause camera
{
if(mCamera != null)
{
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
public void onFlashLight()
{
mCamera.stopPreview();
Parameters parameters = mCamera.getParameters();
parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
public void offFlashLight()
{
mCamera.stopPreview();
Parameters parameters = mCamera.getParameters();
parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
public void takePicture()
{
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS))
{
mCamera.autoFocus(new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera)
{
mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
}
});
}
else
{
mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
}
}
public void autoFocus()
{
if(mCamera != null)
mCamera.autoFocus(null);
}
ShutterCallback shutterCallback = new ShutterCallback()
{
public void onShutter(){}
};
PictureCallback rawCallback = new PictureCallback()
{
public void onPictureTaken(byte[] data, Camera camera){}
};
PictureCallback jpegCallback = new PictureCallback(){
public void onPictureTaken(byte[] data, Camera camera)
{
//something happens
}
};
}
这是我在清单文件中设置的uses特性和uses权限
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-permission android:name="android.permission.CAMERA" />
下面是“com.potatotree.autodistance.CameraSurfaceView.surfaceCreated的堆栈跟踪”
这里是“android.hardware.Camera.native_自动对焦”的堆栈跟踪
这里是“android.hardware.Camera.native\u设置”的堆栈跟踪
java.lang.RuntimeException:无法连接到相机服务
在android.hardware.Camera.native_设置中(本机方法)
在android.hardware.Camera.(Camera.java:294)
打开(Camera.java:269)
位于com.potatotree.autodistance.CameraSurfaceView.surfaceCreated(CameraSurfaceView.java:72)
在android.view.SurfaceView.updateWindow(SurfaceView.java:552)上
在android.view.SurfaceView.dispatchDraw(SurfaceView.java:350)上
位于android.view.ViewGroup.drawChild(ViewGroup.java:1644)
在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)上
位于android.view.view.draw(view.java:6994)
位于android.widget.FrameLayout.draw(FrameLayout.java:357)
位于android.view.ViewGroup.drawChild(ViewGroup.java:1646)
在android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)上
位于android.view.view.draw(view.java:6994)
位于android.widget.FrameLayout.draw(FrameLayout.java:357)
在com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1896)上
位于android.view.ViewRoot.draw(ViewRoot.java:1527)
在android.view.ViewRoot.performTraversals(ViewRoot.java:1263)
在android.view.ViewRoot.handleMessage(ViewRoot.java:1864)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:130)
位于android.app.ActivityThread.main(ActivityThread.java:3735)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:507)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:904)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:662)
在dalvik.system.NativeStart.main(本机方法)
如果我的代码有任何错误,有没有专家可以帮助我或告诉我?
真的需要你的帮助!!谢谢请发布堆栈跟踪。有这么多Android设备类型很有挑战性,但编写健壮的代码并不难,因为它不依赖于每个操作的成功。例如,
surfaceCreated()
中仍然可以引发异常的唯一代码行是第一行和catch
块中的代码行。第一行依赖于Camera.open()
才能成功。但是,文档中说,如果设备没有背向摄像头,它将返回null
。所以你应该处理这个问题,我会说?多亏了Stacker。您的意思是最好将摄像头.open()放在try catch块中吗?
是否会过滤掉用户在Google Play中下载的所有没有背面摄像头的设备?或者只是过滤掉没有前后摄像头的设备?我发现一些没有后置摄像头的平板电脑仍然可以从Google Play安装我的应用程序。我的
上有错误吗?
java.lang.RuntimeException: setParameters failed
at android.hardware.Camera.native_setParameters(Native Method)
at android.hardware.Camera.setParameters(Camera.java:1068)
at com.potatotree.autodistance.CameraSurfaceView.onFlashLight(CameraSurfaceView.java:168)
at com.potatotree.autodistance.AutoDistanceActivity.startCameraFlash(AutoDistanceActivity.java:224)
at com.potatotree.autodistance.CustomView.onTouchEvent(CustomView.java:876)
at android.view.View.dispatchTouchEvent(View.java:3885)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1779)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1130)
at android.app.Activity.dispatchTouchEvent(Activity.java:2096)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1763)
at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2196)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1880)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3703)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)
java.lang.NullPointerException
at com.potatotree.autodistance.CameraSurfaceView.surfaceCreated(CameraSurfaceView.java:97)
at android.view.SurfaceView.updateWindow(SurfaceView.java:1108)
at android.view.SurfaceView.access$000(SurfaceView.java:87)
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:183)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1621)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2446)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
java.lang.RuntimeException: autoFocus failed
at android.hardware.Camera.native_autoFocus(Native Method)
at android.hardware.Camera.autoFocus(Camera.java:832)
at com.potatotree.autodistance.CameraSurfaceView.autoFocus(CameraSurfaceView.java:212)
at com.potatotree.autodistance.AutoDistanceActivity.startCameraFocus(AutoDistanceActivity.java:235)
at com.potatotree.autodistance.CustomView.onTouchEvent(CustomView.java:880)
at android.view.View.dispatchTouchEvent(View.java:5604)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2060)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1787)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2060)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1787)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2060)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1787)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1917)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1376)
at android.app.Activity.dispatchTouchEvent(Activity.java:2364)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1865)
at android.view.View.dispatchPointerEvent(View.java:5784)
at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2890)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2466)
at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:845)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2475)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4441)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
at dalvik.system.NativeStart.main(Native Method)
java.lang.RuntimeException: Fail to connect to camera service
at android.hardware.Camera.native_setup(Native Method)
at android.hardware.Camera.<init>(Camera.java:294)
at android.hardware.Camera.open(Camera.java:269)
at com.potatotree.autodistance.CameraSurfaceView.surfaceCreated(CameraSurfaceView.java:72)
at android.view.SurfaceView.updateWindow(SurfaceView.java:552)
at android.view.SurfaceView.dispatchDraw(SurfaceView.java:350)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6994)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6994)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1896)
at android.view.ViewRoot.draw(ViewRoot.java:1527)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1263)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1864)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3735)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:662)
at dalvik.system.NativeStart.main(Native Method)