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 的三星手机,并且 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)
我该如何解决这个问题?
【问题讨论】:
你在哪里请求WRITE_EXTERNAL_STORAGE
,包括运行时权限?
在单独的Application类中,在应用设置中允许Camera权限,以及对外部存储的读写权限
【参考方案1】:
我通过使用一行代码找到了解决方案,它似乎必须是临时的,但到目前为止它适用于 Android 10 设备。
只需在 Manifest.xml 文件的 <application
标记内添加这一行:
android:requestLegacyExternalStorage="true"
这将允许应用将图片和视频保存在内部存储中 - 保存到带有项目包名称的文件夹中。
【讨论】:
以上是关于Android Studio 3.6.3 - 拍照时相机错误:打开失败:ENOENT(没有这样的文件或目录)的主要内容,如果未能解决你的问题,请参考以下文章
【基础笔记】Android Studio拍照、选择相册(第三方框架)
Android Studio 调用系统相机(超清)和相册的照片并显示在ImageView
阿里否认蒋凡调任阿里大文娱集团;蘑菇街回应裁员 14%;Android Studio 3.6.3 稳定版发布| 极客头条