java.io.FileNotFoundException: open failed: EPERM (Operation not permitted)

文章讲述了在项目中使用相机拍照后,由于AndroidSDK升级至11,导致文件无法在外部存储获取并报错。文章介绍了从Android10的沙盒机制到Android11的请求LegacyExternalStorage失效的过程,提供了在不同版本下创建文件的解决方案。

来项目相机拍照之后照片无法获取到,然后报错
java.io.FileNotFoundException: open failed: EPERM (Operation not permitted)

原因:项目sdk升级,导致文件创建失败

Android10以前图片直接可以保存在sd卡中,从10开始新增了沙盒机制,数据只能保存在app的目录下面。但是Android10做了兼容,

在AndroidManifest.xml中增加android:requestLegacyExternalStorage=“true”就可以在sd下面进行文件操作了。

但是sdk升级到Android11之后该方法失效,文件创建失败 ,然后报错

解决方案:

在app目录下面创建文件

if (Build.VERSION.SDK_INT >29){
            file = new File(context.getExternalFilesDir(null).getAbsolutePath() + "/photo.png");
        }else {
           file =  new File(Environment.getExternalStorageDirectory().getPath() + "/photo.png");
        }

### 解决Java中因权限不足导致的FileNotFoundException问题 在Android开发中,`java.io.FileNotFoundException: open failed: EPERM (Operation not permitted)` 通常与文件操作权限相关。以下是针对该问题的专业解决方案。 #### 权限声明 确保在`AndroidManifest.xml`中声明了必要的存储权限: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ``` 从Android 6.0(API级别23)开始,应用需要动态请求权限[^1]。 #### 动态权限请求 对于运行时权限,必须通过代码动态请求。以下是一个示例代码: ```java if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE); } ``` #### Scoped Storage兼容性 从Android 10(API级别29)开始,Google引入了Scoped Storage机制,限制了应用对共享存储空间的访问。为了兼容Android 10及更高版本,建议使用`getExternalFilesDir()`方法获取应用专属目录路径[^2]。 以下是一个根据SDK版本选择不同文件路径的示例: ```java File file; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { file = new File(context.getExternalFilesDir(null), "photo.png"); } else { file = new File(Environment.getExternalStorageDirectory(), "photo.png"); } ``` #### 文件写入实现 确保文件写入逻辑正确无误。以下是一个完整的文件写入示例,结合了权限检查和Scoped Storage兼容性: ```java public static void initWriteBin(byte[] data, String fileName, Context context) throws IOException { File file; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { file = new File(context.getExternalFilesDir(null), fileName); } else { file = new File(Environment.getExternalStorageDirectory(), fileName); } if (!file.exists()) { file.createNewFile(); } try (FileOutputStream fos = new FileOutputStream(file)) { fos.write(data); fos.flush(); } } ``` #### 常见问题排查 - **权限未授予**:确保用户已授予`WRITE_EXTERNAL_STORAGE`权限。 - **目标路径不可用**:检查目标路径是否有效,例如SD卡是否挂载。 - **Scoped Storage限制**:对于Android 10及以上设备,优先使用应用专属目录。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值