相机在银河系7英寸的标签上拍摄后会冻结,但不是10英寸



我正在开发一个自定义相机应用程序,并在两台galaxy平板电脑上进行测试。。一个7英寸和一个10英寸。。10英寸的效果很好,但在7英寸的相机上,当我拍照时,它会冻结相机预览,logCat会停止在camera SNAP,点击我的自定义相机类中的btn_SNAP_pic,没有错误。应用程序不会崩溃只是挂起。。如果我退出并再次打开应用程序,我会得到一个"无法连接到相机"的错误,我认为这个错误是因为当我的应用程序冻结并退出时,相机从未被释放。。无论如何,下面是我的CustomCamera类和我的CamLayer,这是我的预览。。

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);
        }
}

此线程表示不支持rawhttps://groups.google.com/forum/?fromgroups#!主题/安卓开发人员/D43DrbP9oE

我猜想,一个原始图像会消耗太多内存。除此之外,我也对它没有得到支持感到失望。

相关内容

  • 没有找到相关文章

最新更新