【问题标题】:Camera Preview in android showing Runtime errorandroid中的相机预览显示运行时错误
【发布时间】:2015-06-05 13:24:04
【问题描述】:

这是我用来在我的应用程序中进行相机预览的代码,但它显示了一个 java 运行时错误,但没有指定错误所在的行。我发现https://github.com/commonsguy/cw-advandroid/tree/master/Camera/Preview/,which 上的这段代码是作为有关相机预览的问题之一的解决方案,但它显示一个空白屏幕并且应用程序终止。任何帮助将不胜感激。

package com.example.smartmeasure;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
public class CameraPreview extends Activity {
    private SurfaceView preview=null;
    private SurfaceHolder previewHolder=null;
    private Camera camera=null;
    private boolean inPreview=false;
    private boolean cameraConfigured=false;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera_preview);
    preview=(SurfaceView)findViewById(R.id.camera_preview);
    previewHolder=preview.getHolder();
    previewHolder.addCallback(surfaceCallback);
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
    @Override
    public void onResume() {
    super.onResume();
    camera=Camera.open();
    startPreview();
    }
    @Override
    public void onPause() {
    if (inPreview) {
    camera.stopPreview();
    }
    camera.release();
    camera=null;
    inPreview=false;
    super.onPause();
    }
    private Camera.Size getBestPreviewSize(int width, int height,
    Camera.Parameters parameters) {
    Camera.Size result=null;
    for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
    if (size.width<=width && size.height<=height) {
    if (result==null) {
    result=size;
    }
    else {
    int resultArea=result.width*result.height;
    int newArea=size.width*size.height;
    if (newArea>resultArea) {
    result=size;
    }
    }
    }
    }
    return(result);
    }
    private void initPreview(int width, int height) {
    if (camera!=null && previewHolder.getSurface()!=null) {
    try {
    camera.setPreviewDisplay(previewHolder);
    }
    catch (Throwable t) {
    Log.e("PreviewDemo-surfaceCallback",
    "Exception in setPreviewDisplay()", t);
    Toast
    .makeText(CameraPreview.this, t.getMessage(), Toast.LENGTH_LONG)
    .show();
    }
    if (!cameraConfigured) {
    Camera.Parameters parameters=camera.getParameters();
    Camera.Size size=getBestPreviewSize(width, height,
    parameters);
    if (size!=null) {
    parameters.setPreviewSize(size.width, size.height);
    camera.setParameters(parameters);
    cameraConfigured=true;
    }
    }
    }
    }
    private void startPreview() {
    if (cameraConfigured && camera!=null) {
    camera.startPreview();
    inPreview=true;
    }
    }
    SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
    public void surfaceCreated(SurfaceHolder holder) {
    // no-op -- wait until surfaceChanged()
    }
    public void surfaceChanged(SurfaceHolder holder,
    int format, int width,
    int height) {
    initPreview(width, height);
    startPreview();
    }
    public void surfaceDestroyed(SurfaceHolder holder) {
    // no-op
    }
    };
}

这是错误:

05-27 10:34:37.812: E/AndroidRuntime(2559): FATAL EXCEPTION: main 05-27 10:34:37.812: E/AndroidRuntime(2559): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.smartmeasure/com.example.smartmeasure.CameraPreview}: java.lang.ClassCastException: android.widget.FrameLayout 05-27 10:34:37.812: E/AndroidRuntime(2559): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 

这是xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <FrameLayout
        android:id="@+id/camera_preview"
        android:layout_width="match_parent"
        android:layout_height="241dp" />

</LinearLayout>

【问题讨论】:

  • 请发布您的堆栈跟踪。
  • 05-27 10:34:37.812:E/AndroidRuntime(2559):致命异常:主要 05-27 10:34:37.812:E/AndroidRuntime(2559):java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.smartmeasure/com.example.smartmeasure.CameraPreview}:java.lang.ClassCastException:android.widget.FrameLayout 05-27 10:34:37.812:E/AndroidRuntime(2559):在 android .app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 这是我每次尝试运行时都会遇到的 logcat 错误
  • 为 activity_camera_preview 布局文件发布 XML 代码
  • 发布异常堆栈
  • @AlokNair 和 PreethiRao 我已编辑问题以包含 xml 详细信息。江YD我能知道你所说的异常堆栈是什么意思吗?

标签: android camera


【解决方案1】:

camera_previewFrameLayout 并且您将其转换为 SurfaceView 这就是错误..将其转换为 FrameLayout

【讨论】:

  • 我猜我们不能将它转换为 FrameLayout,因为像 getHolder() 这样的所有进一步操作都是基于 SurfaceView。我也尝试在 xml 文件中以其他方式更改它,但它没有帮助
【解决方案2】:

您在 Activity onCreate 中将 FrameLayout 转换为 SurfaceView,在 XML 中放置 SurfaceView 而不是 FrameLayout,然后将其 id 命名为 camera_preview 并在 Activity 中初始化。

您的 XML 代码在编辑后将如下所示:

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

   <SurfaceView
    android:id="@+id/camera_preview"
    android:layout_width="match_parent"
    android:layout_height="241dp"/>

</LinearLayout>

【讨论】:

  • 抱歉,这没有帮助。现在它显示无法恢复活动的不同错误。
  • 05-27 12:22:12.773:E/AndroidRuntime(3197):java.lang.RuntimeException:无法恢复活动 {com.example.smartmeasure/com.example.smartmeasure.CameraPreview}: java.lang.RuntimeException: 连接相机服务失败 05-27 12:22:12.773: E/AndroidRuntime(3197): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2124)
  • 如果相机已被另一个应用程序使用,则调用 Camera.open() 会引发异常,因此我们将其包装在 try 块中。
  • 现在它在 onPause 和 Camera.open() 中显示错误,阻塞和停止。我也尝试在那里放一个 catch 语句,它在那里显示错误。
  • 05-27 12:47:59.671: E/AndroidRuntime(3820): 致命异常: main 05-27 12:47:59.671: E/AndroidRuntime(3820): android.app.SuperNotCalledException:活动 {com.example.smartmeasure/com.example.smartmeasure.CameraPreview} 没有调用 super.onPause()
【解决方案3】:

只是补充上面的建议,我们应该在 AndroidManifest.xml 文件中设置相机用户权限来访问相机。权限行是:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2018-03-10
    • 2013-07-22
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多