【发布时间】:2021-02-19 09:01:54
【问题描述】:
我正在尝试按照https://developer.android.com/training/camerax/take-photo 实现图像捕获,我在 Temi Robot 上运行我的设备,预览似乎工作正常,但我遇到了这个错误,当我尝试执行回调时没有执行捕捉图像。
这是调用camerax代码的片段
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = new ViewModelProvider(getActivity()).get(GlobalViewModel.class);
cameraProviderFuture = ProcessCameraProvider.getInstance(getContext());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.patrol_fragment, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
previewView = view.findViewById(R.id.previewView);
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
bindPreview(cameraProvider, view);
} catch (ExecutionException | InterruptedException e) {
Log.e(TAG, "CameraProvider initialization error: " + e.toString());
}
}, ContextCompat.getMainExecutor(getContext()));
Just for testing
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
takePicture();
}
}, 10000);
}
private void bindPreview(ProcessCameraProvider cameraProvider, View view) {
Preview preview = new Preview.Builder().build();
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_FRONT)
.build();
preview.setSurfaceProvider(previewView.getSurfaceProvider());
imageCapture = new ImageCapture.Builder()
.setTargetRotation(view.getDisplay().getRotation())
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build();
Camera camera = cameraProvider.bindToLifecycle(getActivity(), cameraSelector, imageCapture,
preview);
takePicture();
}
private void takePicture() {
File mediaFile = getMediaFile();
ImageCapture.OutputFileOptions outputFileOptions =
new ImageCapture.OutputFileOptions.Builder(mediaFile).build();
imageCapture.takePicture(outputFileOptions, viewModel.getExecutorService(),
new ImageCapture.OnImageSavedCallback() {
@Override
public void onImageSaved(ImageCapture.OutputFileResults outputFileResults) {
// insert your code here.
Log.i(TAG, "Capture success!");
}
@Override
public void onError(ImageCaptureException error) {
// insert your code here.
Log.e(TAG, "Capture failed :( " + error.toString());
}
}
);
}
private File getMediaFile() {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "TemiPatrol");
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
Log.d(TAG, "failed to create directory");
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
return new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
}
private void sendImageToServer(JSONObject requestJson) {
// for testing
viewModel.getExecutorService().execute(() -> {
JsonPostman postman = new JsonPostman(getActivity());
postman.postRequest(requestJson);
});
}
}
【问题讨论】:
标签: java android android-camerax