Android应用中的相机

时间:2016-01-12 10:10:58

标签: android-camera android-camera2

我正在创建一个应用程序,需要使用相机从API 15执行到API 23所以应该是实现相机的最佳方式,因为相机类在API 21中已弃用,并且android.hardware.camera2也无法实现较低版本,然后API 21。

1 个答案:

答案 0 :(得分:0)

下面的代码是我从我的一个项目中取出的东西,为了将它放在这里,已经有很多东西被撕掉了所以你必须根据自己的需要进行编辑。它使用原始相机api,后者兼容您的api需求。

public class RecordGameKam extends Fragment
        implements TextureView.SurfaceTextureListener, View.OnClickListener {

    private final static String TAG = "CameraRecordTexture";

    private Camera mCamera;
    private TextureView mTextureView;
    int numberOfCameras;
    int defaultCameraId;
    private boolean isRecording = false;
    protected MediaRecorder mediaRecorder;

    @SuppressWarnings("ConstantConditions")
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        View rootView = new RelativeLayout(getActivity());

        mTextureView = new TextureView(getActivity());
        mTextureView.setSurfaceTextureListener(this);

        //View parameters-----------------------------------------------------------------------
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);

        rootView.setLayoutParams(params);

        ((ViewGroup) rootView).addView(mTextureView);

        return rootView;
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {

        mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);

        // Find the total number of cameras available
        numberOfCameras = Camera.getNumberOfCameras();

        // Find the ID of the default camera
        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();

        for (int i = 0; i < numberOfCameras; i++) {
            Camera.getCameraInfo(i, cameraInfo);
            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
                defaultCameraId = i;
            }
        }

        try {

            if (mCamera != null) {

                //final Camera.Size previewSize = onMeasure();
                //Camera.Size recorderSize = previewSize;

                final Camera.Parameters params = mCamera.getParameters();
                params.setPreviewSize(720, 480);

                mCamera.setParameters(params);
                mCamera.setDisplayOrientation(90);
                mCamera.setPreviewTexture(surface);
                mCamera.startPreview();
                startContinuousAutoFocus();
            }

        } catch (IOException ioe) {
            // Something bad happened
            mCamera.release();
            mCamera = null;
        }
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
        // Ignored, Camera does all the work for us

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {

        try {

            if (getActivity().getActionBar() != null) {
                getActivity().getActionBar().show();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        releaseMediaRecorder();
        return true;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
        // Invoked every time there's a new Camera preview frame
    }

    private boolean setMediaRecorder() throws IllegalStateException {

        try {

            //Create a new instance of MediaRecorder.
            mediaRecorder = new MediaRecorder();

            //Unlock and set camera to Media recorder
            mCamera.unlock();
            mediaRecorder.setCamera(mCamera);

            //Configure audio/video input
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

            CamcorderProfile profile = null;

            if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_480P)) {

                profile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
            }

            if (profile != null) {

                mediaRecorder.setProfile(profile);
            }

            //Change oritentation
            mediaRecorder.setOrientationHint(90 - 180 + 360);

            mediaRecorder.setOutputFile(getFilename());

        } catch (Exception e) {

            e.printStackTrace();
        }

        //Attempt to prepare the configuration and record video.
        try {

            button.setBackgroundResource(R.drawable.camera_pressed);

            mediaRecorder.prepare();

        } catch (Exception e) {

            e.printStackTrace();
            mediaRecorder.release();
            return false;
        }

        return true;
    }

    boolean startContinuousAutoFocus() {

        Camera.Parameters params = mCamera.getParameters();
        List<String> focusModes = params.getSupportedFocusModes();

        assert focusModes != null;
        String CAF_PICTURE = Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE,
                CAF_VIDEO = Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO,
                supportedMode = focusModes
                        .contains(CAF_PICTURE) ? CAF_PICTURE : focusModes
                        .contains(CAF_VIDEO) ? CAF_VIDEO : "";

        if (!supportedMode.equals("")) {

            params.setFocusMode(supportedMode);
            mCamera.setParameters(params);

            return true;
        }

        return false;
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

enter code here