public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private Camera mCamera; private SurfaceHolder surfaceHolder; public MySurfaceView(Context context){ this(context,null); } public MySurfaceView(Context context, AttributeSet attrs){ this(context,attrs,0); } public MySurfaceView(Context context, AttributeSet attrs,int defStyleAttr){ super(context,attrs,defStyleAttr); surfaceHolder = getHolder(); surfaceHolder.addCallback(this); } public void setCamera(Camera camera){ mCamera = camera; Camera.Parameters parameters = mCamera.getParameters(); parameters.setPictureFormat(PixelFormat.JPEG); //图片格式 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); //对焦模式 parameters.setRotation(90); mCamera.setParameters(parameters); } private void checkCamera(){ if(mCamera == null){ Toast.makeText(getContext(),"相机没有初始化",Toast.LENGTH_LONG).show(); return; } } private void startPreView(SurfaceHolder holder){ checkCamera(); try { mCamera.setPreviewDisplay(holder); mCamera.setDisplayOrientation(90); mCamera.startPreview(); }catch (Exception e){ e.printStackTrace(); Log.i("wanlijun",e.toString()); } } private void stopPreView(){ checkCamera(); try { mCamera.stopPreview(); }catch (Exception e){ e.printStackTrace(); Log.i("wanlijun",e.toString()); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.i("wanlijun","surfaceDestroyed"); stopPreView(); } @Override public void surfaceCreated(SurfaceHolder holder) { Log.i("wanlijun","surfaceCreated"); startPreView(holder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.i("wanlijun","surfaceChanged"); if(surfaceHolder.getSurface() == null)return; stopPreView(); startPreView(surfaceHolder); }
}
//在自定义的SurfaceView里面初始化一些东西,才能在打开camera的时候就显示预览,这个顺序很重要,不然预览窗口很可能黑屏
public class CameraActivity extends AppCompatActivity{ private MySurfaceView surfaceView; private SurfaceHolder surfaceHolder; private Camera camera; private Button takeBtn; OrientationEventListener mOrientationEventListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); surfaceView = (MySurfaceView)findViewById(R.id.surfaceView); takeBtn = (Button)findViewById(R.id.takeBtn); takeBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder builder = new AlertDialog.Builder(CameraActivity.this); builder.setMessage("让我做你的眼睛,带你去看天上星"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } }); mOrientationEventListener = new OrientationEventListener(CameraActivity.this) { @Override public void onOrientationChanged(int orientation) { if(orientation == OrientationEventListener.ORIENTATION_UNKNOWN)return; orientation = (orientation+90)%360; } }; if(mOrientationEventListener.canDetectOrientation()){ mOrientationEventListener.enable(); }else { mOrientationEventListener.disable(); } } @Override protected void onResume() { super.onResume(); Log.i("wanlijun","onResume"); if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){ if(ActivityCompat.checkSelfPermission(CameraActivity.this,Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(CameraActivity.this,new String[]{Manifest.permission.CAMERA},101); }else{ init(); } }else{ Toast.makeText(CameraActivity.this,"此设备不支持相机",Toast.LENGTH_LONG).show(); } } private void init(){ try { if(camera == null){ camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); } camera.setFaceDetectionListener(new Camera.FaceDetectionListener() { @Override public void onFaceDetection(Camera.Face[] faces, Camera camera) { } }); surfaceView.setCamera(camera); }catch (Exception e){ e.printStackTrace(); } } @Override protected void onDestroy() { super.onDestroy(); Log.i("wanlijun","onDestroy"); if(camera != null){ camera.release(); } if(mOrientationEventListener != null){ mOrientationEventListener.disable(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == 101){ if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ init(); }else{ Toast.makeText(CameraActivity.this,"请先开启相机权限",Toast.LENGTH_LONG).show(); } } } }权限:
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-feature android:name="android.hardware.camera" android:required="true"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="true"/>