当我拍照时,我的“错误”是toast直接显示,为什么没有创建文件?
我正在问一个新问题,如果它已经存在,请原谅我一次又一次地搜索,但我没有找到任何东西。
我的代码在 API28 模拟器上完美运行,但一旦我在 API29 模拟器及更高版本上运行它,它就不起作用......
你能帮助我吗?
CameraUtils.java
public static File getNewFile() {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyCameraApp");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d("MyCameraApp", "Failed to create directory");
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
return mediaFile;
}
CameraFragment.java 我只向您展示“btnTakePicture.setOnCLick ....
btnTakePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btnTakePicture.setEnabled(false);
AnimUtils.animateBtnTakePhoto(btnTakePicture);
File file = CameraUtils.getNewFile();
ImageCapture.OutputFileOptions outputFileOptions =
new ImageCapture.OutputFileOptions.Builder(file).build();
imageCapture.setTargetRotation(CameraUtils.getDisplayRotation(requireContext()));
imageCapture.setFlashMode(flashMode);
imageCapture.takePicture(outputFileOptions, ContextCompat.getMainExecutor(requireContext()),
new ImageCapture.OnImageSavedCallback() {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
MediaScannerConnection.scanFile(requireContext(),
new String[]{file.toString()}, null, null);
btnTakePicture.setEnabled(true);
switch (typeAction) {
case CameraFragment.ACTION_MESSAGE:
Intent intent = new Intent(requireContext(), PhotoMessageActivity.class);
intent.putExtra(PhotoMessageActivity.IMG_URI, file.getPath());
intent.putExtra(ChatActivity.UID, uidReceiver);
startActivity(intent);
break;
case CameraFragment.ACTION_STATUS:
startActivity(new Intent(requireContext(), AddNewStoryPhotoActivity.class)
.putExtra("IMG_URI", file.getPath()));
break;
case CameraFragment.ACTION_UPDATE_PICTURE:
CropImage.cropMiniatureFromFragment(Uri.fromFile(new File(file.getPath())),
requireContext(), CameraFragment.this);
break;
}
}
@Override
public void onError(@NonNull ImageCaptureException exception) {
btnTakePicture.setEnabled(true);
Toast.makeText(requireContext(), "Error taking photo", Toast.LENGTH_SHORT).show();
}
});
}
});
我的代码适用于 API 29 模拟器,但一旦我的代码在 API29 和 API30 模拟器上进行测试,它就不再适用。
I'm asking a new question, if it already exists, please excuse me I searched again and again but I didn't find anything.
My code works perfectly on the API28 emulator but as soon as I run it on the API29 emulator and above, it doesn't work...
Can you help me ?
CameraUtils.java
public static File getNewFile() {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyCameraApp");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d("MyCameraApp", "Failed to create directory");
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
return mediaFile;
}
CameraFragment.java
I only show you the "btnTakePicture.setOnCLick....
btnTakePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btnTakePicture.setEnabled(false);
AnimUtils.animateBtnTakePhoto(btnTakePicture);
File file = CameraUtils.getNewFile();
ImageCapture.OutputFileOptions outputFileOptions =
new ImageCapture.OutputFileOptions.Builder(file).build();
imageCapture.setTargetRotation(CameraUtils.getDisplayRotation(requireContext()));
imageCapture.setFlashMode(flashMode);
imageCapture.takePicture(outputFileOptions, ContextCompat.getMainExecutor(requireContext()),
new ImageCapture.OnImageSavedCallback() {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
MediaScannerConnection.scanFile(requireContext(),
new String[]{file.toString()}, null, null);
btnTakePicture.setEnabled(true);
switch (typeAction) {
case CameraFragment.ACTION_MESSAGE:
Intent intent = new Intent(requireContext(), PhotoMessageActivity.class);
intent.putExtra(PhotoMessageActivity.IMG_URI, file.getPath());
intent.putExtra(ChatActivity.UID, uidReceiver);
startActivity(intent);
break;
case CameraFragment.ACTION_STATUS:
startActivity(new Intent(requireContext(), AddNewStoryPhotoActivity.class)
.putExtra("IMG_URI", file.getPath()));
break;
case CameraFragment.ACTION_UPDATE_PICTURE:
CropImage.cropMiniatureFromFragment(Uri.fromFile(new File(file.getPath())),
requireContext(), CameraFragment.this);
break;
}
}
@Override
public void onError(@NonNull ImageCaptureException exception) {
btnTakePicture.setEnabled(true);
Toast.makeText(requireContext(), "Error taking photo", Toast.LENGTH_SHORT).show();
}
});
}
});
My code works with API 29 emulators, but as soon as my code is tested on an API29 and API30 emulator it no longer works.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论