Android Studio 3.6.3 - Ошибка камеры при съемке изображения: ошибка открытия: ENOENT (Нет такого файла или каталога)

Поскольку я обновил Android Studio до версии 3.6.3, я не могу сделать снимок в функции onActivityResult(). Я использую телефон Samsung с Android 8, и разрешения Хранилище и Камера установлены как разрешенные.

Вот мой код:

   int CAMERA = 0;
   int GALLERY = 1;
   Uri imageURI;
   File file;

   public void openCamera() {
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
       file = new File(Environment.getExternalStorageDirectory(), "image.jpg");
       imageURI = FileProvider.getUriForFile(getApplicationContext(), getPackageName() + ".provider", file);
       intent.putExtra(MediaStore.EXTRA_OUTPUT, imageURI);
       startActivityForResult(intent, CAMERA);
   }


 // onActivityResult
 @Override
   public void onActivityResult(int requestCode, int resultCode, Intent data) {
       super.onActivityResult(requestCode, resultCode, data);

       if (resultCode == Activity.RESULT_OK) {
          Bitmap bmp;

           // • IMAGE FROM CAMERA
           if (requestCode == CAMERA) {
              try {
                  File f = file;
                  ExifInterface exif = new ExifInterface(f.getPath());
                  int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

                  int angle = 0;
                  if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { angle = 90;
                  } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { angle = 180;
                  } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { angle = 270; }

                  Matrix mat = new Matrix();
                  mat.postRotate(angle);

                  bmp = BitmapFactory.decodeStream(new FileInputStream(f), null, null);
                  assert bmp != null;
                  bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mat, true);
                  bmp = scaleBitmapToMaxSize(800, bmp);

                  myImgView.setImageBitmap(bmp);

               // error
               } catch (IOException | OutOfMemoryError e) { Log.i("log-", "ERROR: " + e.getMessage()); }
     }
  }// ./ If RESULT_OK
}


// Scale image
public static Bitmap scaleBitmapToMaxSize(int maxSize, Bitmap bm) {
      int outWidth;
      int outHeight;
      int inWidth = bm.getWidth();
      int inHeight = bm.getHeight();
      if (inWidth > inHeight) {
         outWidth = maxSize;
         outHeight = (inHeight * maxSize) / inWidth;
      } else {
         outHeight = maxSize;
         outWidth = (inWidth * maxSize) / inHeight;
      }
      return Bitmap.createScaledBitmap(bm, outWidth, outHeight, false);
   }

Манифест:

<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA"/>

После того, как я сделал снимок, я получаю эту ошибку в Logcat, и, конечно же, изображение не отображается в myImgView:

ERROR: /storage/emulated/0/image.jpg: open failed: ENOENT (No such file or directory)

Как я могу это исправить?


person Frank Eno    schedule 06.05.2020    source источник
comment
Где вы запрашиваете WRITE_EXTERNAL_STORAGE, включая разрешение на выполнение?   -  person CommonsWare    schedule 06.05.2020
comment
в отдельном классе приложения разрешено разрешение камеры в настройках приложения, а также запись и чтение внешнего хранилища   -  person Frank Eno    schedule 06.05.2020


Ответы (1)


Я нашел решение, используя одну строку кода, кажется, что это должно быть временно, но пока оно работает на устройствах Android 10.

Просто добавьте эту строку в тег <application в файле Manifest.xml:

android:requestLegacyExternalStorage="true" 

Это позволит приложению сохранять изображения и видео во внутреннем хранилище — в папку с именем пакета вашего проекта.

person Frank Eno    schedule 07.05.2020