Android中new BufferedReader(new FileReader)触发捕获错误问题排查
触发异常的常见原因
- 运行时权限未申请:Android 6.0(API 23)及以上版本,仅在AndroidManifest中声明存储权限无效,需要在代码中主动触发动态权限申请,待用户同意授权后才能读取外部存储文件。
- 分区存储规则限制:如果第二款App的
targetSdkVersion>= 29(Android 10),系统默认开启分区存储,Environment.getExternalStorageDirectory()访问公共目录的能力被限制,需要在Manifest的<application>节点添加android:requestLegacyExternalStorage="true"临时适配;如果targetSdkVersion>=30(Android 11),读取公共目录下其他应用生成的文件需要额外申请MANAGE_EXTERNAL_STORAGE权限。 - 文件本身问题:目标路径对应的文件不存在、文件被其他应用独占锁定、文件所属目录的读写权限未开放给当前App,都会触发IO异常。
查看具体错误信息的方法
- 查看Logcat日志:你在catch块中已经写了
e.printStackTrace(),将手机连接Android Studio,在Logcat面板过滤你的App包名,就能看到完整的异常堆栈信息,可直接区分是权限拒绝、文件不存在还是其他IO错误。 - 弹窗打印错误:在catch块中添加代码
myFun.ShowToast(getApplicationContext(), "错误原因:"+e.getMessage());,可直接在手机上看到精简的错误提示。 - 前置校验判断:在初始化
FileReader前增加判断逻辑,分别校验gpxfile.exists()(文件是否存在)、gpxfile.canRead()(是否有读权限),根据校验结果弹对应提示,可快速定位问题。
适配建议
- 优先使用App私有目录存储文件,通过
getExternalFilesDir(null)获取私有目录路径,读写该路径下的文件不需要申请任何存储权限,兼容性最好。 - 如果必须访问公共存储目录,按照对应Android版本的权限规则申请动态权限和分区存储适配权限。
内容的提问来源于stack exchange,提问作者Mr Chan
相关产品推荐
相关产品推荐

