0

我开发了一个基本的 Android 应用程序,它只是在一个VideoView元素中显示手机的相机视图。我在 Manifest 中添加了相机访问权限

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

并且该应用程序仅包含主要活动MainActivity.java。在接下来的几行中将提供代码的快照。但是,在实际设备上运行 apk 文件时,我遇到了一个问题:显示一个错误,说明应用程序已意外停止,我不知道为什么。

这是主要活动的代码

public class MainActivity extends Activity implements SurfaceHolder.Callback {

    private Button StartButton = null;
    private VideoView videoView = null;
    private SurfaceHolder holder = null;
    private Camera camera = null;
    private static final String TAG = "Video";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        StartButton = (Button) findViewById(R.id.StartButton);
        videoView = (VideoView) this.findViewById(R.id.videoView);

        StartButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                try{
                    camera = Camera.open();
                    Camera.Parameters camParams = camera.getParameters();
                    camera.lock();

                } catch(RuntimeException re){
                    Log.v(TAG, "Could not initialize the Camera");
                    re.printStackTrace();
                }
            }
        });

        holder = videoView.getHolder();
        holder.addCallback(this);
    }


    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub

    }


    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        Log.v(TAG, "in surfaceCreated");

        try {
            camera.setPreviewDisplay(holder);
            camera.startPreview();
        } catch(IOException e) {
            Log.v(TAG, "Could not start the preview");
            e.printStackTrace();
        }
    }

xml 文件基本上包含两个元素:VideoView 和开始按钮。知道是什么意外停止了应用程序吗?有没有更好的方法来实现这个概念?在我的情况下,不需要“开始”按钮。事实上,最好在没有“开始”按钮的情况下执行此操作。

我对 Android 开发和 Java 编码非常陌生。我正在使用 Eclipse adt-bundle 进行 Android 开发。

4

1 回答 1

0

问题是您只在camera单击按钮时为成员设置一个值,但camera在创建 VideoView 的持有人表面时尝试更早地使用。因此,会引发 NullPointerException,并且您的应用程序会崩溃。

重要的是要意识到 VideoView 及其表面是作为 Activity 布局的一部分与按钮一起创建的,因此这显然发生在用户有机会单击任何内容之前。

如果确实需要该按钮,您可以通过稍后在单击该按钮后以编程方式构建 VideoView 来解决此问题。但是,由于您提到您并不特别想要该按钮,因此还有一个更简单的解决方案:摆脱它,并将相机初始化移动到 onCreate 本身。

结果可能如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    try {
        camera = Camera.open();
        camera.lock();
    } catch(RuntimeException re) {
        Log.v(TAG, "Could not initialize the Camera");
        re.printStackTrace();
    }

    videoView = (VideoView) this.findViewById(R.id.videoView);
    holder = videoView.getHolder();
    holder.addCallback(this);
}

您提交的代码还有一些其他问题(例如,没有调用camera.release()意味着任何尝试旋转设备都会导致应用程序崩溃),但具有此修复程序的代码至少可以启动预览。

但是,我建议研究 Android代码约定(对于您展示的几行,您似乎甚至不遵守任何一套约定),以及如何使用真实设备进行调试,这可以帮助您找到原因对于像这样的崩溃自己。

祝你好运!

于 2014-04-13T13:11:42.003 回答