Android:如何用Java从应用自身数据目录获取可用的FileInputStream?
解决Mapsforge从应用数据目录加载地图文件的问题
先纠正你第一种写法里的明显语法错误:new FileInputStream(File mapf);多了冗余的File关键字,正确写法应为new FileInputStream(mapf);——如果你的代码真能编译,大概率是书写笔误,先修正这个问题。
接下来排查几个核心问题:
确认文件位置与完整性
你手动放置region.map的路径必须是应用私有数据目录的files文件夹,具体路径为/data/data/[你的应用包名]/files/。打开Android Studio的Device File Explorer,找到对应包名的目录,检查文件是否存在、大小是否和原文件一致(避免复制过程中损坏)。正确初始化Mapsforge地图组件
仅仅获取FileInputStream不足以加载地图,需要将其传入Mapsforge的MapFile,再绑定到MapView才能完成加载。示例代码如下:// 写法一:通过File对象获取输入流 File mapFile = new File(getFilesDir(), "region.map"); try (FileInputStream fis = new FileInputStream(mapFile)) { MapFile mapsforgeMap = new MapFile(fis); MapView mapView = findViewById(R.id.your_map_view_id); // 设置地图初始中心点和缩放级别(根据你的地图区域调整) mapView.getModel().mapViewPosition.setCenter(new LatLong(39.9042, 116.4074)); mapView.getModel().mapViewPosition.setZoomLevel((byte) 12); mapView.setMapFile(mapsforgeMap); } catch (IOException e) { e.printStackTrace(); // 打印异常日志,快速定位问题 }或者用
openFileInput的写法:try (FileInputStream fis = openFileInput("region.map")) { MapFile mapsforgeMap = new MapFile(fis); MapView mapView = findViewById(R.id.your_map_view_id); mapView.getModel().mapViewPosition.setCenter(new LatLong(39.9042, 116.4074)); mapView.getModel().mapViewPosition.setZoomLevel((byte) 12); mapView.setMapFile(mapsforgeMap); } catch (IOException e) { e.printStackTrace(); }捕获并查看异常日志
你的代码未处理IOException,如果文件不存在、路径错误或文件损坏,错误会被吞掉。添加异常捕获后,查看Logcat的错误信息:如果是FileNotFoundException说明路径不对;如果是其他IO异常,大概率是文件损坏。后续文件复制逻辑的注意点
后续从assets复制文件到files目录时,要确保复制过程完整,用字节流完整读取assets中的文件并写入目标路径,避免复制半截导致文件损坏。
内容的提问来源于stack exchange,提问作者krontor
相关产品推荐
相关产品推荐

