Изображение намерения нулевой длины изображения

Что я здесь не так делаю? Я пытаюсь назвать намерение получить картинку в полном размере:

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). Не могли бы вы оказать помощь? Я на 6.0 на Nexus 5X.

2 ответа

Я бы начал с избавления от File.createTempFile(), Вам это не нужно, это напрасная трата времени, и это может привести к тому, что некоторые приложения камеры захотят не сохранять фотографию в этом файле (так как файл уже существует). Просто создайте уникальное имя файла самостоятельно. Это постепенно поможет с вашей совместимостью.

Кроме того, вы должны убедиться, что вы держитесь за fileProduct в сохраненном состоянии экземпляра Bundle, поскольку процесс вашего приложения может быть прерван, пока приложение камеры находится на переднем плане.

Однако в целом ACTION_IMAGE_CAPTURE не очень надежный Вы делегируете работу одному из сотен возможных приложений камеры, и в некоторых из этих приложений есть ошибки. Один такой баг игнорирует EXTRA_OUTPUT, Итак, в onActivityResult(), если вы решите, что у вас есть действительный fileProduct значение, но там нет файла, позвоните data.getData() и посмотреть, есть ли у вас Uri там. В этом случае приложение камеры могло сохранить фотографию в месте, указанном этим Uriи вы можете использовать ContentResolver а также DocumentFile пытаться работать с этим Uri,

Используя это:

final String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
file = new File(storageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");

вместо

File.createTempFile()

волшебным образом, кажется, чтобы решить проблему. Спасибо CommonsWare за (как-то) указание мне в правильном направлении.

Другие вопросы по тегам