FileNotFoundException при загрузке только что захваченного изображения - PullRequest
0 голосов
/ 26 февраля 2019

Я создаю приложение, которое позволяет пользователю делать снимки и изображения, а затем использовать это изображение в головоломке.Я могу успешно использовать камеру, но после захвата изображения, когда я должен быть выведен на экран головоломки, где изображение загружается из локального хранилища, я получаю исключение FNF.(У меня есть раздел в приложении, в котором показаны изображения, которые пользователь может использовать для головоломки, и вновь захваченное изображение отображается там - после перезапуска приложения, поскольку оно упало).

Мой код выглядит следующим образом

 public static Bitmap decodeSampledBitmapFromPath(String filepath, int reqWidth, int reqHeight) throws FileNotFoundException {


    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filepath);

    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    options.inJustDecodeBounds = false;
    return Bitmap.createScaledBitmap(BitmapFactory.decodeFile(filepath),
            reqWidth, reqHeight, false);
}

Исключение выдается в строке return.Пожалуйста, помогите мне решить это.Спасибо.Редактировать: завернутая попытка поймать вокруг return строки и теперь Logcat отображает

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
    at apps.mine.puzzle.Board.countTileSize(Board.java:60)
    at apps.mine.puzzle.PlayPuzzleActivity.onCreate(PlayPuzzleActivity.java:138)

1 Ответ

0 голосов
/ 26 февраля 2019

У меня была похожая проблема, это будет исправлено:

if(BitmapFactory.decodeFile(Image[position])!=null)
{
    Bitmap bitmap=Bitmap.createScaledBitmap(BitmapFactory.decodeFile(Image[position]), 32, 32, true);
    imageView.setImageBitmap(bitmap);
}
else
{
    Log.d("TAG", "unable to decode");
}

Основная причина проблемы в том, что decodeResource возвращает вам ноль по одной из следующих причин:

  1. Файл изображения поврежден
  2. Нет разрешения на чтение
  3. Недостаточно памяти для декодирования файла
  4. Ресурс не существует
  5. Недопустимые параметры, указанные в переменной options.

UPADTE

, если вы не хотите декодировать файл дважды, как указано @Zoe, вы можете изменитькод decodeResource, поэтому он будет проверяться нулем без необходимости делать это дважды, например:

public class BitmapScalingHelper
{
    public static Bitmap decodeResource(Resources res, int resId, int dstWidth, int dstHeight)
    {
        Options options = new Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options);
        options.inJustDecodeBounds = false;
        options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, dstWidth,
                dstHeight);
        options = new Options();
        Bitmap unscaledBitmap = BitmapFactory.decodeResource(res, resId, options);
        if(unscaledBitmap == null)
        {
            Log.e("ERR","Failed to decode resource" + resId + " " + res.toString());
            return null;
        }
        return unscaledBitmap;
    }
}
...