我在这里做错了什么?我试图打算用全尺寸拍照:
takePictureIntent
private void takePictureIntent(int request) {
final Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {
File file = null;
try {
file = createImageFile(request);
} catch (Exception e) {
showErrorDialog(getString(R.string.error), getString(R.string.error_saving_picture));
Log.e(TAG, "Error while creating image file.");
}
if (file != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(takePictureIntent, request);
} else {
Log.e(TAG, "Error while creating image file.");
showErrorDialog(getString(R.string.error), getString(R.string.error_saving_picture));
}
}
}
createImageFile
private File createImageFile(final int request) {
final File storageDir = new File(activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES), getString(R.string.app_name));
if (!storageDir.exists()) {
if (!storageDir.mkdirs()) {
Log.e(TAG, "Cannot create parent folders.");
return null;
}
}
File file = null;
try {
file = File.createTempFile("test_", ".jpg", storageDir);
} catch (Exception e) {
Log.e(TAG, "Error while creating temp file.");
}
fileProduct = file;
return file;
}
onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_IMAGE_PRODUCT) {
if (fileProduct == null ||!fileProduct.exists() ||fileProduct.length() == 0) {
showErrorDialog(getString(R.string.error), getString(R.string.error_taking_product_picture));
return;
}
}
有时(是的,有时)生成的文件的长度为0.我确信私有应用程序上下文中的文件夹存在,图像文件也是如此(长度> 0)。你能帮忙吗?我在Nexus 5X上的6.0版本。
答案 0 :(得分:1)
我首先要摆脱File.createTempFile()
。你不需要它,浪费时间,它可能会导致一些相机应用程序不想将照片存储在该文件中(因为文件已经存在)。只需自己生成一个唯一的文件名这将逐步增强您的兼容性。
此外,您需要确保在保存的实例状态fileProduct
中保持Bundle
,因为您的应用程序的进程可能会在相机应用程序位于前台时终止
但是,一般来说,ACTION_IMAGE_CAPTURE
不是很可靠。您将工作委托给数百个可能的相机应用程序之一,其中一些应用程序存在错误。一个这样的错误是忽略EXTRA_OUTPUT
。因此,在onActivityResult()
中,如果您确定自己拥有有效的fileProduct
值,但该文件中没有文件,请致电data.getData()
,看看您是否有Uri
。在这种情况下,相机应用可能已将照片存储在Uri
标识的位置,您可以使用ContentResolver
和DocumentFile
尝试使用该Uri
答案 1 :(得分:0)
使用此:
final String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
file = new File(storageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
而不是
File.createTempFile()
神奇地似乎解决了这个问题。感谢CommonsWare(以某种方式)指出了我正确的方向。