当前位置: 首页 > news >正文

android在sd卡中可以mkdir, 但是不可以createNewFile

在 Android 中能创建目录(mkdir/mkdirs)但无法创建文件(createNewFile),通常由权限不足路径不兼容分区存储文件系统限制导致,以下是具体排查和解决方法:

1. 检查存储权限(Android 12 及以下)

创建文件需要WRITE_EXTERNAL_STORAGE权限,需确保静态声明 + 动态申请都已完成:

  • AndroidManifest.xml 声明

    xml

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
  • 动态申请(Android 6.0+)

    java

    运行

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
    }
    

2. 适配 Android 10 + 的分区存储(Scoped Storage)

Android 10(API 29)及以上引入分区存储,禁止直接在 SD 卡根目录创建自定义文件,需使用系统指定的公共目录或应用私有目录:

方案 1:使用公共目录(如 Downloads、Pictures)

系统公共目录由Environment.getExternalStoragePublicDirectory()获取,需权限:

java

运行

// 获取公共下载目录
File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File folder = new File(downloadDir, "myAppFolder");
if (!folder.exists()) {folder.mkdirs(); // 先创建目录
}
File file = new File(folder, "test.txt");
try {boolean isCreated = file.createNewFile();if (isCreated) {Log.d("File", "文件创建成功:" + file.getAbsolutePath());}
} catch (IOException e) {e.printStackTrace();
}
方案 2:使用应用私有目录(无需权限)

应用私有目录仅当前应用可访问,卸载应用时会被删除,适合存储应用专属文件:

java

运行

// 外部私有目录(SD卡中)
File externalPrivateDir = getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);
File folder = new File(externalPrivateDir, "myPrivateFolder");
if (!folder.exists()) {folder.mkdirs();
}
File file = new File(folder, "test.txt");
try {file.createNewFile();
} catch (IOException e) {e.printStackTrace();
}

3. 检查文件路径的合法性

  • 避免硬编码路径:不要直接写/sdcard/xxx,不同设备 SD 卡路径可能不同,需用Environment.getExternalStorageDirectory()获取根目录。
  • 确认父目录已创建:创建文件前,必须确保父目录存在(通过mkdirs()创建多级目录)。

4. 排查文件系统限制

部分设备的 SD 卡可能被设置为 “只读”,或因格式化方式(如 exFAT)导致权限问题。可通过以下方式验证:

java

运行

File sdCard = Environment.getExternalStorageDirectory();
Log.d("SDCard", "是否可写:" + sdCard.canWrite());

若返回false,则说明 SD 卡本身不可写,需检查设备存储设置。

5. 临时兼容(仅 Android 10)

若需暂时绕过分区存储(仅 Android 10 有效),可在AndroidManifest.xmlapplication标签中添加:

xml

<applicationandroid:requestLegacyExternalStorage="true"...>
</application>

(注:Android 11 + 此配置无效,必须适配分区存储)

总结

  • 优先适配分区存储,使用公共目录或应用私有目录创建文件。
  • 确保权限申请完整(静态 + 动态)。
  • 严格遵循 “先创建目录,再创建文件” 的流程,且路径需通过系统 API 获取。
http://www.dtcms.com/a/511160.html

相关文章:

  • 高性能小型国产铷原子钟:精准计时领域的 “定海神针​,铷钟,国产铷钟,模块原子钟,
  • 【JVM】基础概念之为什么要使用JVM
  • 【图像处理】灰度图像与二值化
  • Java常用工具类处理方法100例
  • 自己做的网页怎么上传网站吗营销型网站公司排名
  • FPGA强化-基于rom的vga图像显示
  • 越南语OCR——从图像识别到业务赋能的深度解析
  • Java 注解与反射实战:自定义注解从入门到精通
  • Ubuntu18.04 D435i RGB相机与IMU标定详细版(四)
  • 滨州网站设计wordpress集成api
  • 《3D端游世界角色技能连招的动画状态机轻量化实践》
  • 网站建动态密码是否收费wordpress 防注册
  • SDN 与 NFV:软件定义网络(SDN)与网络功能虚拟化(NFV)架构
  • PDF文档转换Markdown文档功能
  • 云手机和云游戏的不同之处
  • 嵌入式需要掌握哪些核心技能?
  • 项目开发手册-开发工具使用之Git
  • Redis实战深度剖析:高并发场景下的架构设计与性能优化
  • 通信演进路径图---从信号到服务
  • 深入解析Spring Boot热部署与性能优化实践
  • Win11微软帐号不停提示登录家庭账户、删除Win11微软账户,微软账户误输入未满14岁未成年生日,浏览器被提示需要家长授权等一个办法解决!!!
  • 前端-Git
  • Spring Cloud微服务架构深度实战:从单体到分布式的完整演进之路
  • Linux网络:TCP
  • HarmonyOS 5 鸿蒙应用性能优化与调试技巧
  • 商业网站可以选择.org域名吗勒索做钓鱼网站的人
  • 博客类网站模板网站的维护与更新
  • 【NVIDIA-H200-4】4节点all-reduce-从单节点到四节点的性能跃迁:NVIDIA H200 集群扩展的全链路分析
  • 纯干货呈现!红帽认证最全解析,您想了解的尽在其中
  • 《数据库系统》SQL语言之复杂查询 子查询(NOT)IN子查询 θ some/θ all子查询 (NOT) EXISTS子查询(理论理解分析+实例练习)