先定义一些东西:
Camera camera;
WindowManager wm;
SurfaceView preview;
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
File fileTest = new File(path + "/test.jpg");
然后调用:
public void onTakePhotoClicked() {
preview = new SurfaceView(this);
SurfaceHolder holder = preview.getHolder();
// deprecated setting, but required on Android versions prior to 3.0
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holder.addCallback(new SurfaceHolder.Callback() {
@Override
//The preview must happen at or after this point or takePicture fails
public void surfaceCreated(SurfaceHolder holder) {
Log.d("zcf", "Surface created");
camera = null;
try {
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
Log.d("zcf", "Opened camera");
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
throw new RuntimeException(e);
}
camera.startPreview();
Log.d("zcf", "Started preview");
Log.e("zcf","开始拍照");
camera.takePicture(null, null, TestActivity.this);
} catch (Exception e) {
if (camera != null)
camera.release();
throw new RuntimeException(e);
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
});
wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams params = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
params = new WindowManager.LayoutParams(
1, 1, //Must be at least 1x1
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
0,
//Don't know if this is a safe default
PixelFormat.UNKNOWN);
}
//Don't set the preview visibility to GONE or INVISIBLE
wm.addView(preview, params);
}
@Override
public void onPictureTaken(byte[] bytes, Camera camera) {
Log.e("zcf", "拍照结束");
try {
FileOutputStream fos = new FileOutputStream(fileAdvert);
fos.write(bytes);
fos.close();
Log.e("zcf","保存结束");
Message message = handler.obtainMessage();
message.what = 1;
handler.sendEmptyMessageDelayed(1,1500);
} catch (FileNotFoundException e) {
Log.d("zcf", "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d("zcf", "Error accessing file: " + e.getMessage());
}
}
然后在拍完照之后,要把wm给remove掉,要不还是会挡着下边的东西。
完整的是:
public class TestActivity extends AppCompatActivity implements Camera.PictureCallback{
Button button;
Camera camera;
WindowManager wm;
SurfaceView preview;
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
File fileTest = new File(path + "/test.jpg");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onTakePhotoClicked();
}
});
}
@SuppressLint("HandlerLeak")
private Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
wm.removeViewImmediate(preview);
break;
}
}
};
public void onTakePhotoClicked() {
preview = new SurfaceView(this);
SurfaceHolder holder = preview.getHolder();
// deprecated setting, but required on Android versions prior to 3.0
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holder.addCallback(new SurfaceHolder.Callback() {
@Override
//The preview must happen at or after this point or takePicture fails
public void surfaceCreated(SurfaceHolder holder) {
Log.d("zcf", "Surface created");
camera = null;
try {
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
Log.d("zcf", "Opened camera");
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
throw new RuntimeException(e);
}
camera.startPreview();
Log.d("zcf", "Started preview");
Log.e("zcf","开始拍照");
camera.takePicture(null, null, TestActivity.this);
} catch (Exception e) {
if (camera != null)
camera.release();
throw new RuntimeException(e);
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
});
wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams params = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
params = new WindowManager.LayoutParams(
1, 1, //Must be at least 1x1
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
0,
//Don't know if this is a safe default
PixelFormat.UNKNOWN);
}
//Don't set the preview visibility to GONE or INVISIBLE
wm.addView(preview, params);
}
@Override
public void onPictureTaken(byte[] bytes, Camera camera) {
Log.e("zcf", "拍照结束");
try {
FileOutputStream fos = new FileOutputStream(fileTest);
fos.write(bytes);
fos.close();
Log.e("zcf","保存结束");
Message message = handler.obtainMessage();
message.what = 1;
handler.sendEmptyMessageDelayed(1,1500);
} catch (FileNotFoundException e) {
Log.d("zcf", "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d("zcf", "Error accessing file: " + e.getMessage());
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}