Android Studio 3.6.3 - 拍照时相机错误:打开失败:ENOENT(没有这样的文件或目录)

Posted

技术标签:

【中文标题】Android Studio 3.6.3 - 拍照时相机错误:打开失败:ENOENT(没有这样的文件或目录)【英文标题】:Android Studio 3.6.3 - Camera error on taking a picture: open failed: ENOENT (No such file or directory) 【发布时间】:2020-08-21 14:54:41 【问题描述】:

由于我已将 Android Studio 更新到 3.6.3,我无法在 onActivityResult() 函数中拍照。我使用的是装有 Android 8 的三星手机,并且 StorageCamera 权限设置为允许。

这是我的代码:

   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)

我该如何解决这个问题?

【问题讨论】:

你在哪里请求WRITE_EXTERNAL_STORAGE,包括运行时权限? 在单独的Application类中,在应用设置中允许Camera权限,以及对外部存储的读写权限 【参考方案1】:

我通过使用一行代码找到了解决方案,它似乎必须是临时的,但到目前为止它适用于 Android 10 设备。

只需在 Manifest.xml 文件的 &lt;application 标记内添加这一行:

android:requestLegacyExternalStorage="true" 

这将允许应用将图片和视频保存在内部存储中 - 保存到带有项目包名称的文件夹中。

【讨论】:

以上是关于Android Studio 3.6.3 - 拍照时相机错误:打开失败:ENOENT(没有这样的文件或目录)的主要内容,如果未能解决你的问题,请参考以下文章

在拍照时激活背景颜色 - Android Studio

【基础笔记】Android Studio拍照、选择相册(第三方框架)

Android studio从相册里面选图片无法选中

Android Studio 调用系统相机(超清)和相册的照片并显示在ImageView

阿里否认蒋凡调任阿里大文娱集团;蘑菇街回应裁员 14%;Android Studio 3.6.3 稳定版发布| 极客头条

Android Studio 配置文件路径修改