2012-03-28 60 views
0

我正在开发自定义相机应用程序和测试两个星系片..一个7英寸和一个10英寸.. 10英寸的伟大作品,但在7英寸,当我采取一张图片,它冻结了相机预览,并且logCat在CAMERA SNAP处停止,点击登录我的btn_snap_pic,点击我的customcamera类,没有错误。该应用程序不会崩溃只是挂起..如果我退出它,并再次打开应用程序我得到一个“未能连接到相机”我假设这个错误是因为当我的应用程序冻结,我退出了,相机从来没有公布。不管怎么样,下面是我的我的CustomCamera类都和我CamLayer这是我的预览..相机冻结在银河7英寸标签拍摄的照片后,但不是10英寸

public class CustomCamera extends Activity{ 
    String camFace ="back"; 
    FrameLayout frame; 
    RelativeLayout rel; 
    CamLayer camPreview; 

    ImageView btn_snap_pic; 
    ImageView btn_switch_cam; 

    String TAG = "custom cam"; 



    public void onCreate(Bundle savedInstanceState) 
    { 
     Bitmap btnSwitch = BitmapFactory.decodeResource(this.getResources(), 
       R.drawable.btn_switch_camera); 

     Bitmap btnSnap = BitmapFactory.decodeResource(this.getResources(), 
       R.drawable.btn_take_picture); 

     super.onCreate(savedInstanceState); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

      //Set Screen Orientation 
      this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 


      RelativeLayout.LayoutParams buttonS = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT); 

      RelativeLayout.LayoutParams buttonT = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT); 

      RelativeLayout.LayoutParams cam = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT); 



      cam.addRule(RelativeLayout.BELOW); 
      buttonS.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
      buttonT.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
      buttonT.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 

      try{ 

       //Create Intance of Camera 
       camPreview = new CamLayer(this.getApplicationContext(),camFace); 
       //Relative view for everything 
       rel = new RelativeLayout(this); 
       // set as main view 
       setContentView(rel); 
       //FrameLayOut for camera 
       frame = new FrameLayout(this); 

       // add Camera to view 
       frame.setLayoutParams(cam); 
       frame.addView(camPreview); 


       rel.addView(frame); 

       btn_switch_cam = new ImageView (this); 
       btn_switch_cam.setImageBitmap(btnSwitch); 
       btn_switch_cam.setLayoutParams(buttonS); 

       buttonS.rightMargin = 25; 
       buttonS.topMargin = 25; 
       rel.addView(btn_switch_cam); 

       btn_switch_cam.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View view) { 
         Log.v("CAMERA Switch", "CLICKED"); 
         //frame.removeView(camPreview); 

         if(camFace.equals("front")){ 
          camFace = "back"; 
         }else{ 
          camFace = "front"; 
         } 
         //camPreview.stopCamera(); 
         frame.removeView(camPreview); 
         restartCam(); 
         //camPreview.switchCam(camFace); 
        } 

       }); 

       btn_snap_pic = new ImageView(this); 
       btn_snap_pic.setImageBitmap(btnSnap); 
       btn_snap_pic.setLayoutParams(buttonT); 
       buttonT.rightMargin = 25; 
       buttonT.bottomMargin = 25; 

       rel.addView(btn_snap_pic); 
       btn_snap_pic.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View view) { 
         Log.v("CAMERA Snap", "CLICKED"); 
         camPreview.camera.takePicture(shutterCallback, rawCallback, 
           jpegCallback); 
        } 

       }); 

      } catch(Exception e){} 
     } 

     public void restartCam(){ 
      camPreview = new CamLayer(this.getApplicationContext(),camFace); 
      frame.addView(camPreview); 
     } 


     ShutterCallback shutterCallback = new ShutterCallback() { 
      public void onShutter() { 
       Log.d(TAG, "onShutter'd"); 
      } 
     }; 

     /** Handles data for raw picture */ 
     PictureCallback rawCallback = new PictureCallback() { 
      public void onPictureTaken(byte[] data, android.hardware.Camera camera) { 
       Log.d(TAG, "onPictureTaken - raw"); 
      } 

     }; 

     /** Handles data for jpeg picture */ 
     PictureCallback jpegCallback = new PictureCallback() { 
      public void onPictureTaken(byte[] data, android.hardware.Camera camera) { 
       FileOutputStream outStream = null; 
       try { 

        outStream = new FileOutputStream(String.format(
          "/sdcard/LC/images/%d.jpg", System.currentTimeMillis())); 
        outStream.write(data); 
        outStream.close(); 
        Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } finally { 
       } 
       Log.d(TAG, "onPictureTaken - jpeg"); 
      } 
     }; 
    } 

及CAMLAYER:

public class CamLayer extends SurfaceView implements SurfaceHolder.Callback { 
     Camera camera; 
     SurfaceHolder previewHolder; 
     String camID; 
     private static final String TAG = "Cam Preview"; 


     public CamLayer(Context context, String facing) 
     { 
       super(context); 
       camID = facing; 
       previewHolder = this.getHolder(); 
       previewHolder.addCallback(this); 
       previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 


     } 
     public void surfaceCreated(SurfaceHolder holder) { 
      startCamera(); 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
     { 
       Parameters params = camera.getParameters(); 
       //params.setPreviewSize(width, height); 
        //params.setPictureFormat(PixelFormat.JPEG); 
        camera.setParameters(params); 
        camera.startPreview(); 


     } 

     public void surfaceDestroyed(SurfaceHolder arg0) 
     { 
       //camera.stopPreview(); 
       //camera.release(); 
      stopCamera(); 
     } 



     public void onResume() { 
       //camera.startPreview(); 
      startCamera(); 

     } 

     public void onPause() { 
      // TODO Auto-generated method stub 
      //camera.stopPreview(); 
      stopCamera(); 
     } 

     public void switchCam(String newCamId) { 
      /*camera.stopPreview(); 
      //camera.release(); 

      if(camID.equals("front")){ 
       camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); 
      }else{ 
       camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); 
      }*/ 
      //camera.startPreview(); 
      //camera=Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); 
      stopCamera(); 
      camID = newCamId; 
      startCamera(); 

     } 
     public void stopCamera(){ 
      System.out.println("stopCamera method"); 
      if (camera != null){ 
       camera.stopPreview(); 
       camera.setPreviewCallback(null); 
       camera.release(); 
       camera = null; 
       previewHolder.removeCallback(this); 
       previewHolder = null; 
      } 
     } 

     private void startCamera(){ 
      if(camID.equals("front")){ 
       camera=Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); 
      }else{ 
       camera=Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); 
      } 
      try { 
        camera.setPreviewDisplay(previewHolder); 

        camera.setPreviewCallback(new PreviewCallback() { 

        public void onPreviewFrame(byte[] data, Camera arg1) { 
         //FileOutputStream outStream = null; 
         /*try { 
          //outStream = new FileOutputStream(String.format(
            //"/sdcard/%d.jpg", System.currentTimeMillis())); 
          //outStream.write(data); 
          //outStream.close(); 
          Log.d(TAG, "onPreviewFrame - wrote bytes: " 
            + data.length); 
         } catch (FileNotFoundException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } finally { 
         }*/ 
         //CamLayer.this.invalidate(); 
        } 
       }); 

       } 
        catch (Throwable e){ Log.w("TAG,", "failed create surface !?!?"); } 
     } 

     public void draw(Canvas canvas) { 
      super.draw(canvas); 
      Paint p = new Paint(Color.RED); 
      Log.d(TAG, "draw"); 
      canvas.drawText("PREVIEW", canvas.getWidth()/2, 
       canvas.getHeight()/2, p); 
     } 
} 

回答

相关问题