Java tutorial
/* * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package br.gbizotto.customcamera.camera2; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.SurfaceTexture; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.RequiresApi; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.TextureView; import android.view.View; import android.view.ViewGroup; import java.io.File; import br.gbizotto.customcamera.PermissionsUtils; import br.gbizotto.customcamera.PictureTaken; import br.gbizotto.customcamera.R; import br.gbizotto.customcamera.ReviewPictureActivity; @RequiresApi(api = 21) public class Camera2BasicFragment extends Fragment implements View.OnClickListener, ActivityCompat.OnRequestPermissionsResultCallback, PictureTaken { private static final int REQUEST_CAMERA_PERMISSION = 1; /** * An {@link AutoFitTextureView} for camera preview. */ private AutoFitTextureView mTextureView; private static File mFile; public static Camera2BasicFragment newInstance() { return new Camera2BasicFragment(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_camera2_basic, container, false); } @Override public void onViewCreated(final View view, Bundle savedInstanceState) { view.findViewById(R.id.picture).setOnClickListener(this); mTextureView = (AutoFitTextureView) view.findViewById(R.id.texture); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mFile = new File(getActivity().getExternalFilesDir(null), "pic.jpg"); } @Override public void onResume() { super.onResume(); // This solution supports android 21 an up is based in: //https://github.com/googlesamples/android-Camera2Basic // Look at https://developer.android.com/guide/topics/media/camera.html#custom-camera to get solution for 20 and below. CameraUtils.startCamera(getContext(), getActivity(), mFile, mTextureView, this); // When the screen is turned off and turned back on, the SurfaceTexture is already // available, and "onSurfaceTextureAvailable" will not be called. In that case, we can open // the SurfaceTextureListener). if (mTextureView.isAvailable()) { CameraUtils.openCamera(mTextureView.getWidth(), mTextureView.getHeight()); } else { mTextureView.setSurfaceTextureListener(mSurfaceTextureListener); } } @Override public void onPause() { CameraUtils.stopCamera(); super.onPause(); } private void requestCameraPermission() { requestPermissions(new String[] { Manifest.permission.CAMERA }, REQUEST_CAMERA_PERMISSION); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_CAMERA_PERMISSION) { if (grantResults.length != 1 || grantResults[0] != PackageManager.PERMISSION_GRANTED) { ErrorDialog.newInstance(getString(R.string.request_permission)) .show(getActivity().getFragmentManager(), ErrorDialog.FRAGMENT_DIALOG); } } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } /** * Initiate a still image capture. */ private void takePicture() { if (PermissionsUtils.checkCameraPermission(this.getContext())) { CameraUtils.lockFocus(getContext(), getActivity()); } else { requestCameraPermission(); } } @Override public void onClick(View view) { switch (view.getId()) { case R.id.picture: { takePicture(); break; } } } /** * {@link TextureView.SurfaceTextureListener} handles several lifecycle events on a * {@link TextureView}. */ private final TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) { CameraUtils.openCamera(width, height); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int width, int height) { CameraUtils.configureTransform(width, height); } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) { return true; } @Override public void onSurfaceTextureUpdated(SurfaceTexture texture) { } }; @Override public void pictureSaved(String filePath) { Intent intent = new Intent(getActivity(), ReviewPictureActivity.class); intent.putExtra("filePath", filePath); intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); } }