【问题标题】:android : camera preview using surfaceviewandroid:使用surfaceview的相机预览
【发布时间】:2013-11-28 05:23:51
【问题描述】:
package com.example.preview;

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.view.View;
import android.widget.Button;


public class MainActivity extends Activity implements SurfaceHolder.Callback
{
Button start,stop;
Camera camera;
private final String tag = "VideoServer";
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;

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

     start = (Button)findViewById(R.id.button1);
     start.setOnClickListener(new Button.OnClickListener()
     {
         public void onClick(View arg0)
         {
          start_camera();
         }
     });

     stop = (Button)findViewById(R.id.button2);
     stop.setOnClickListener(new Button.OnClickListener()
     {
        public void onClick(View arg0)
        {
         stop_camera();
        }
     });
     surfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
     surfaceHolder = surfaceView.getHolder();
     surfaceHolder.addCallback(this);
  // surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}


        private void start_camera() 
        {

            try
             {
               camera = Camera.open();
             }
             catch(RuntimeException e)
             {
               Log.e(tag, "init_camera: " + e);
               return;
             }
             Camera.Parameters param;
             param = camera.getParameters();
             //modify parameter
            //param.setPreviewFrameRate(20);
             param.setPreviewSize(176,144);
             camera.setParameters(param);
             try 
              {
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();
              } 
             catch (Exception e)
             {
                Log.e(tag, "init_camera: " + e);
                return;
              }
            }

        private void stop_camera()
        {
         camera.stopPreview();
         camera.release();
        }
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub
            }

            public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            }

            public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub

}

}

这是在点击开始按钮时预览的代码。 但是有一些错误。单击预览停止时会弹出。任何人的任何建议都将是可观的。我已经添加了所需的所有权限。还是不行

logcat 错误

11-28 11:01:49.621: E/AndroidRuntime(3558): FATAL EXCEPTION: main
11-28 11:01:49.621: E/AndroidRuntime(3558): java.lang.NullPointerException
11-28 11:01:49.621: E/AndroidRuntime(3558):     at    com.example.preview.MainActivity.start_camera(MainActivity.java:64)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at com.example.preview.MainActivity.access$0(MainActivity.java:51)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at com.example.preview.MainActivity$1.onClick(MainActivity.java:32)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at android.view.View.performClick(View.java:3511)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at android.view.View$PerformClick.run(View.java:14109)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at android.os.Handler.handleCallback(Handler.java:605)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at android.os.Looper.loop(Looper.java:137)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at android.app.ActivityThread.main(ActivityThread.java:4424)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at java.lang.reflect.Method.invokeNative(Native Method)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at java.lang.reflect.Method.invoke(Method.java:511)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-28 11:01:49.621: E/AndroidRuntime(3558):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

标签: android


【解决方案1】:

您是否在AndroidManifest.xml 中设置了权限?

// 摄像头权限

更新:在此 SO-Camera Tutorial for Android (using surfaceview) 上使用Narendra Pal 的答案

在没有后置摄像头的设备上@9​​87654325@。尝试Camera.open(0) 获取前置摄像头。如果您使用的是模拟器,请确保您已为您的模拟器设备启用摄像头。

【讨论】:

  • 我已经添加了所有这些
  • MainActivity.java:64 上有什么内容?
  • 用这个验证代码所以stackoverflow.com/questions/12273976/…
  • 即使我不知道 Main Activity 类发生了什么。我验证了它......它完美
  • 你有没有把这个添加到你的 mainfest <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />
【解决方案2】:

据我推测,您通过调用CAmera.open() 获得的Camera 实例是null。您的 catch 块中是否有任何异常?

 try
 {
 camera = Camera.open();
 }
 catch(RuntimeException e)
 {
 Log.e(tag, "init_camera: " + e);
 return;
 }

【讨论】:

  • 在运行时,屏幕出现错误“预览已关闭”这就是我能看到的全部
  • @user3040168 在camera = Camera.open(); 语句中插入一个调试点,并在调试模式下运行应用程序。当你命中断点时按 F6,然后检查调试指针进入 catch 块或 catch 块之后的语句。
  • 我明白了...这是同一行...我将 API 8 更改为 9 并给出了 id...WORKED!!!
猜你喜欢
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多