камера зависает после того, как на галактике 7 дюймов, но не на 10 дюймов - PullRequest
0 голосов
/ 28 марта 2012

Я занимаюсь разработкой пользовательского приложения для камеры и тестирую на двух планшетах galaxy ... один 7-дюймовый и один 10-дюймовый ... 10-дюймовый работает отлично, но на 7-дюймовом, когда я делаю снимок, он замораживает предварительный просмотр камеры и logCat останавливаетсяв CAMERA SNAP, CLICKED войдите в мой btn_snap_pic по клику в моем классе customcamera без ошибок.приложение не падает, просто зависает ... и если я выхожу из него и снова открываю приложение, я получаю сообщение "не удается подключиться к камере", я предполагаю, что это ошибка, потому что, когда мое приложение зависло, и я отступил, камераникогда не был выпущен .. в любом случае, ниже мой класс 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);
        }
}

1 Ответ

0 голосов
/ 04 апреля 2012

Эта тема говорит, что raw не поддерживается https://groups.google.com/forum/?fromgroups#!topic/android-developers/D43AdrbP9oE

Я предполагаю, что необработанное изображение будет занимать слишком много памяти. Кроме того, я также разочарован тем, что он не поддерживается.

...