简体   繁体   English

自定义相机预览在Android 4.1中不起作用?

[英]Custom Camera Preview Not Working in Android 4.1?

I create custom camera view in android .but when i open camera fragment then not camera preview is black screen but android 2.3.0 working but android 4.1 and above not working .my code in below. 我在android中创建自定义相机视图。但是当我打开相机片段时,相机预览不是黑屏,但是android 2.3.0正常工作,但是android 4.1及更高版本在下面却没有.my代码。

在此处输入图片说明

My TakeCameraFragment code below:: 我的TakeCameraFragment代码如下:

public class TakeCameraFragment extends Fragment {
    Camera mCamera ;
     CameraPreview mCameraPreview;

    protected static final int MEDIA_TYPE_IMAGE = 0;
    static String FilePAth = "";
    Button takePicture;
    static String base64string = "";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        final View rootView = inflater.inflate(R.layout.camerafragment,
                container, false);

        mCamera = getCameraInstance();

        Log.v("log_tag", "mCamera :: " + mCamera);

        mCameraPreview = new CameraPreview(getActivity(), mCamera);
        FrameLayout preview = (FrameLayout) rootView
                .findViewById(R.id.camera_preview_fragment);

        preview.addView(mCameraPreview);

        takePicture = (Button) rootView
                .findViewById(R.id.btnTakePicturefragment);
        takePicture.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                mCamera.takePicture(null, null, mPictureframent);

            }
        });

        return rootView;

    }

    public boolean checkCameraHardware(Context context) {
        if (context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA)) {
            // this device has a camera
            return true;
        } else {
            // no camera on this device
            return false;
        }
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        releaseCamera();
    }

    private void releaseCamera() {
        if (mCamera != null) {
            mCamera.release(); // release the camera for other applications
            mCamera = null;
        }
    }

    private Camera getCameraInstance() {
        Camera mCamera = null;
        try {

            mCamera = Camera.open();

        } catch (Exception e) {
            // cannot get camera or does not exist

            releaseCamera();
        }
        return mCamera;
    }

    private static File getOutputMediaFile() {
        File mediaStorageDir = new File(
                Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                "MyCameraAppFragment");

        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {

                return null;
            }
        }
        // Create a media file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
                .format(new Date());

        FilePAth = mediaStorageDir.getPath() + File.separator + "IMG_fragment_"
                + timeStamp + ".jpg";

        File mediaFile;
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "IMG_fragment_" + timeStamp + ".jpg");

        return mediaFile;
    }

    PictureCallback mPictureframent = new PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            File pictureFile = getOutputMediaFile();
            if (pictureFile == null) {
                return;
            }
            try {

                FileOutputStream fos = new FileOutputStream(pictureFile);
                fos.write(data);
                fos.close();

                FragmentManager fm = getFragmentManager();

                FragmentTransaction fragmentTransaction = fm.beginTransaction();
                SetPictureImageFragment fm2 = new SetPictureImageFragment();
                fragmentTransaction.replace(R.id.relative_camerafragment_id,
                        fm2, "HELLO");
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
                Bundle bundle = new Bundle();
                bundle.putByteArray("position", data);
                fm2.setArguments(bundle);
                mCamera.startPreview();


            } catch (FileNotFoundException e) {

            } catch (IOException e) {
            }
        }
    };

}

Camera preview Code below :: 相机预览代码如下:

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mSurfaceHolder;
    private Camera mCamera;
     Boolean isPreviewRunning = true; 


    // Constructor that obtains context and camera
     public CameraPreview(Context context, Camera camera) {
            super(context);
            mCamera = camera;

            // Install a SurfaceHolder.Callback so we get notified when the
            // underlying surface is created and destroyed.
            mSurfaceHolder = getHolder();
            mSurfaceHolder.addCallback(this);
            // deprecated setting, but required on Android versions prior to 3.0
            mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        /*try {
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.startPreview();
            //mCamera.setDisplayOrientation(90);
        } catch (IOException e) {
            // left blank for now
        }*/
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        //mCamera.stopPreview();
    //  mCamera.release();
         if (mCamera != null)
            {
                mCamera.stopPreview();
                mCamera.release();
            }
    }

    /*@Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
            int width, int height) {
        // start preview with new settings

        try {
            mCamera.stopPreview();
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.startPreview();
            //mCamera.setDisplayOrientation(90);
        } catch (Exception e) {
            // intentionally left blank for a test
        }
    }*/

      public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
            // If your preview can change or rotate, take care of those events here.
            // Make sure to stop the preview before resizing or reformatting it.

            if (mSurfaceHolder.getSurface() == null){
              // preview surface does not exist
              return;
            }

            // stop preview before making changes
            if(isPreviewRunning)
            {
              mCamera.stopPreview();
            }

            Parameters parameters = mCamera.getParameters();

            WindowManager windo =  (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
            Display display = windo.getDefaultDisplay();

            if(display.getRotation() == Surface.ROTATION_0)
            {
                parameters.setPreviewSize(h,w);          
                mCamera.setDisplayOrientation(90);

            }

            if(display.getRotation() == Surface.ROTATION_90)
            {
                parameters.setPreviewSize(w, h);            

            }

            if(display.getRotation() == Surface.ROTATION_180)
            {
                parameters.setPreviewSize(h, w);  
             //   mCamera.setDisplayOrientation(270);

            }

            if(display.getRotation() == Surface.ROTATION_270)
            {
                parameters.setPreviewSize(w, h);
                mCamera.setDisplayOrientation(180);

            }
            // set preview size and make any resize, rotate or
            // reformatting changes here

            // start preview with new settings

//          mCamera.setParameters(parameters);
            try {
                mCamera.setPreviewDisplay(mSurfaceHolder);
                mCamera.startPreview();
                isPreviewRunning = true;

            } catch (Exception e){
                Log.d("log", "Error starting camera preview: " + e.getMessage());
            }
        }

      @Override
        protected void onMeasure(int widthSpec, int heightSpec) {
            int previewWidth = MeasureSpec.getSize(widthSpec);
            int previewHeight = MeasureSpec.getSize(heightSpec);

            //Get the padding of the border background
            int hPadding = getPaddingLeft() + getPaddingRight();
            int vPadding = getPaddingTop() + getPaddingBottom();

            //Resize the preview frame with correct aspect ratio
            previewWidth += hPadding;
            previewHeight -= vPadding;

            //Add the padding of the border.
            previewWidth += hPadding;
            previewHeight += vPadding;

            //Ask children to follow the new preview dimension
            super.onMeasure(MeasureSpec.makeMeasureSpec(previewWidth, MeasureSpec.EXACTLY),
                    MeasureSpec.makeMeasureSpec(previewHeight, MeasureSpec.EXACTLY));
        }
}

My Xml code in below:: 我的Xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relative_camerafragment_id"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@android:color/white"
    android:descendantFocusability="blocksDescendants"
     >


        <FrameLayout
            android:id="@+id/camera_preview_fragment"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/conform" >
        </FrameLayout>


    <Button
        android:id="@+id/btnTakePicturefragment"
        android:layout_width="60dip"
        android:layout_height="60dip"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="18dp"
        android:background="@drawable/camera" />

</RelativeLayout>

You should write mCamera.startPreview(); 您应该编写mCamera.startPreview();。 it will work after adding this line 添加此行后它将工作

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM