Android Studio读取外部存储boot.txt报错:无此文件或目录且内容为空
排查Android读取外部存储boot.txt文件报错" No such file or directory"的解决方案
下面是几个针对性的排查和修复方向:
确认文件实际路径是否匹配
Environment.getExternalStorageDirectory()在Android 10(API 29)及以上已被废弃,且不同系统版本的外部存储根目录访问规则有差异。很多时候你以为文件在根目录,实际可能存放在Downloads、Documents这类子目录中。先通过文件管理器确认boot.txt的完整路径,比如如果在Downloads目录,代码应修改为:File textFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "boot.txt");另外,Android 10+启用了分区存储机制,直接访问根目录文件会被限制,建议改用
Context.getExternalFilesDir()或者MediaStore API来访问外部文件。检查存储权限是否配置到位
- 首先在
AndroidManifest.xml中声明必要权限:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 13及以上需单独申请媒体权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> - Android 6.0(API 23)及以上系统需要动态申请权限,在调用
readFile()方法前先做权限检查:if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 100); } else { readFile(); }
- 首先在
完善异常信息以便精准定位
当前代码仅打印栈轨迹,没有展示具体错误详情,建议修改catch块,把错误信息显示出来:catch (IOException e) { e.printStackTrace(); String errorMsg = "读取失败: " + e.getMessage(); Toast.makeText(this, errorMsg, Toast.LENGTH_LONG).show(); }这样能直接看到是路径不存在、权限不足还是其他问题。
验证
isExternalStorageReadable()的实现逻辑
你代码中用到的isExternalStorageReadable()如果实现有误,会导致存储状态判断错误。标准的实现逻辑应该是:public boolean isExternalStorageReadable() { String state = Environment.getExternalStorageState(); return Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state); }如果你的实现和这个不一致,可能会出现明明存储不可读却执行读取逻辑的情况。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

