Android Studio 3.6.3 - Ошибка камеры при фотографировании: ошибка открытия: ENOENT (нет такого файла или каталога) - PullRequest
1 голос
/ 06 мая 2020

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

Вот мой код:

   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)

Как это исправить?

1 Ответ

0 голосов
/ 07 мая 2020

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

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

android:requestLegacyExternalStorage="true" 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...