Android 创建文件时出现 java.io.IOException: Operation not permitted异常

一、android 6.0

        6.0之前是不需要动态申请权限的,直接在manifest.xml中申请即可以正常使用。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

二、安卓10,SDK=29

        安卓10开始,安卓继续加强了限制,如果需要读写SD卡,还需要额外的进行申请requestLegacyExternalStorage申明。

<application
        android:name=".common.base.BaseApplication"
        android:allowBackup="true"
        android:icon="@mipmap/logo"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:requestLegacyExternalStorage="true" //添加这一行
        android:roundIcon="@mipmap/logo"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true"
        tools:replace="android:icon,android:roundIcon">

三、安卓11,SDK=30

        安卓11的时候继续强化对SD卡读写的管理,引入了MANAGE_EXTERNAL_STORAGE权限,而之前的WRITE_EXTERNAL_STORAGE已经失效了。

        并且MANAGE_EXTERNAL_STORAGE权限只能跳转设置页面申请。

四、安卓13,SDK=33


        android 13上,取消了android.permission.WRITE_EXTERNAL_STORAGE权限,只需要申请android.permission.MANAGE_EXTERNAL_STORAGE权限。

以下是我遇到的问题分析:

        创建文件时,一直报Operation not permitted异常,没有权限。但是我在代码里把以上权限完全开启了。而且android 11虽然开启了强制分区存储,但是只针对 targetSDK>=30的情况,而我的应用targetSDK版本为29。

        后来发现是我的文件名使用当前时间来命名(2023-2-10 15:38:45),而当前时间里带有 “:”,导致文件创建权限不足。

        许多的字符都属于公共空间文件的不合法字符(如上图),但是在私有空间是没有这个问题的。可能是由于在公有空间和私有空间访问走的是两套机制。公有空间会走MediaStore,私有空间并不会。

        我们在android 11系统的手机上,手动创建文件时,文件名也不能包含这些字符。android 10 之前就没有发现这个问题。

 所以问题的解决方法有两种:

        1、把文件放到私有空间(即内存)中

        2、修改文件名,避免特殊字符

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 找不到文件或目录。 简单来说,这个异常是说程序在试图执行读取或写入文件操作,找不到指定的文件或目录。这可能是因为文件不存在、文件路径不正确、文件被占用或权限不足等原因导致的。 解决方案可能包括检查文件路径是否正确,确保具有正确的读取/写入权限,或确保文件已经正确创建。如果仍然无法解决问题,建议检查程序的错误日志以获取更多的细节信息。 ### 回答2: java.io.ioexception: could not是java程序中的一个错误提示信息,通常表示程序在运行中遇到了读取或写入数据的错误。这个错误信息可能有许多不同的具体原因,如文件权限不足、文件不存在、网络连接中断等等。因此,想要准确地解决这个问题,需要根据具体的提示信息和上下文情况来分析可能的原因。 举个例子,如果错误提示是"java.io.ioexception: could not open file",那么很有可能是因为程序试图打开一个不存在或者没有读写权限的文件。此我们需要检查程序中相应的文件操作代码是否存在问题,比如是否正确指定了文件路径,是否使用了正确的文件读写模式等等。 如果错误提示是"java.io.ioexception: connection reset",那么就说明程序在进行网络连接遇到了中断问题。此我们需要检查网络连接的健康状态,比如是否存在网络延迟、是否出现了网络故障等等。 总之,java.io.ioexception: could not错误提示信息本身并没有给出具体的解决方案,需要根据具体情况去找到问题所在,然后针对性地去解决问题。当然,在日常编程中,我们也可以使用try-catch来捕获并处理这种异常情况,以保证程序能够正常运行并正确处理异常情况。 ### 回答3: java.io.IOException是一种常见的Java异常,它通常表示在读取/写入数据遇到了某种异常情况。在处理这个异常,可能会看到一些不同的错误消息,包括“could not create file”、“could not write file”以及其他类似的错误消息。 造成java.io.IOException的原因可能很多,例如: 1. 文件系统错误:当尝试读取或写入磁盘上的文件,可能会遇到文件系统错误。这些错误可能包括硬盘故障,文件权限问题等。 2. 网络故障:如果在读取或写入数据使用了网络连接,可能会发生网络故障,例如断开连接或超等。 3. 代码错误:也可能是代码中的错误导致了IOException异常。例如,可能使用了错误的文件名,或者对不存在的文件进行了操作。除此之外,还可能是在编写读取/写入代码,忘记关闭数据流,造成了IO资源的耗尽问题。 4. 磁盘满了: 当文件系统的磁盘空间用尽,会抛出java.io.IOException异常。 解决java.io.IOException异常的方法因情况而异,当遇到此类异常,可能需要执行各种操作,如检查文件名或路径,检查网络连接状态,也可能需要定位代码错误,并进行修复。 如果是由代码错误引起的java.io.IOException,最好的解决方案是审查和修改代码,并确保对文件和网络资源的操作正确。 当然,预防IO异常的发生,建议在IO操作的候充实的进行异常处理,保证代码健壮性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老杜_d

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值