解决方案 »

  1.   

    有surfaceview这个系统定义控件么?没有吧,所以报错
    还有定义layout_width和layout_height不建议用px作为单位。
    因为像素做单位在不同的设备里显示的大小差异可能非常大。建议用dp~
      

  2.   

    我就是按下载的例子做的,改了dp也不行。
    现在先放弃preview,不用surfaceview了,只做拍照不预览,就这么简单的功能也报错:
    1)在oncreat中声明后取得相机:
     myCamera= null;  
            try {  
             myCamera = Camera.open(); 
            }  
            catch (Exception e){ 
            Log.d("TAG", "Error is "+e.getMessage()); 
            }  
    2)构造简单的拍照方法:
    capturejpeg = new PictureCallback() {    
    @Override    
      public void onPictureTaken(byte[] data, Camera camera) {                     try   {    
     Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);    
      File file = new File("/mnt/sdcard/fengyue/thisplace.jpg");    
      BufferedOutputStream bos     
      = new BufferedOutputStream(new FileOutputStream(file));    
     bm.compress(Bitmap.CompressFormat.JPEG,100,bos);    
      bos.flush();    
     bos.close();    
      }catch(Exception e)    {    
     e.printStackTrace();    
         }  }   };    
    3)在程序中调用:
    myCamera.takePicture(null,null,capturejpeg);  
    menifest.也加了权限。发现就在调用的地方出错了,error如下:
    07-22 11:44:50.658: E/AndroidRuntime(8513): FATAL EXCEPTION: main
    07-22 11:44:50.658: E/AndroidRuntime(8513): java.lang.RuntimeException: takePicture failed
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.hardware.Camera.native_takePicture(Native Method)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.hardware.Camera.takePicture(Camera.java:1095)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.hardware.Camera.takePicture(Camera.java:1040)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at com.zhutiansoft.MainActivity$2.onTouch(MainActivity.java:279)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.View.dispatchTouchEvent(View.java:5563)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2047)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1930)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1389)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.app.Activity.dispatchTouchEvent(Activity.java:2378)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1878)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.View.dispatchPointerEvent(View.java:5748)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3104)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2666)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:900)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2675)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.os.Handler.dispatchMessage(Handler.java:99)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.os.Looper.loop(Looper.java:154)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at android.app.ActivityThread.main(ActivityThread.java:4624)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at java.lang.reflect.Method.invokeNative(Native Method)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at java.lang.reflect.Method.invoke(Method.java:511)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
    07-22 11:44:50.658: E/AndroidRuntime(8513):  at dalvik.system.NativeStart.main(Native Method)
    不明白哪出了问题。请指教,谢谢!
      

  3.   

    你这几句初始化了相机,但是并没获得图像吧?
    http://developer.android.com/reference/android/hardware/Camera.html
    官网给出的步骤里,有说:Without a surface, the camera will be unable to start the preview. 
    所以你这个小例子必定失败……我用相机获取图像偷懒点是用android自带的相机方法~Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(it, 1);在onActivityResult里可以对返回值也就是照片进一步处理!
      

  4.   


    android自带的相机方法是不是就得暂时跳开,我是想不跳开这个activity,直接获取一个拍照。
    “给出的步骤里,有说:Without a surface, the camera will be unable to start the preview. “
    我现在是不预览,直接获取照片。
    有没有办法?
      

  5.   

    我怎么记得是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 方法
      

  6.   

    之前预览我也按您所讲的试过了。
    我先只取拍照不预览,象下面的代码这样还有什么问题吗?
    1)在oncreat中声明后取得相机:
     myCamera= null;  
            try {  
             myCamera = Camera.open(); 
            }  
            catch (Exception e){ 
            Log.d("TAG", "Error is "+e.getMessage()); 
            }  
    2)构造简单的拍照方法:
    capturejpeg = new PictureCallback() {    
    @Override    
      public void onPictureTaken(byte[] data, Camera camera) {                     try   {    
     Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);    
      File file = new File("/mnt/sdcard/fengyue/thisplace.jpg");    
      BufferedOutputStream bos     
      = new BufferedOutputStream(new FileOutputStream(file));    
     bm.compress(Bitmap.CompressFormat.JPEG,100,bos);    
      bos.flush();    
     bos.close();    
      }catch(Exception e)    {    
     e.printStackTrace();    
         }  }   };    
    3)在程序中调用:
    myCamera.takePicture(null,null,capturejpeg);  
    menifest.也加了权限。
      

  7.   

    借鉴下这个?不过我还没跑过。
    不过显然还是用了SurfaceView~
    应该是谷歌不希望有这样可能侵犯用户隐私的应用存在,所以要用View显示它,只是在这个应用里用户看不见。
    就像service在高版本api下要由activity启动~
    http://www.linuxidc.com/Linux/2013-01/78501.htm