React Native Maps自定义Marker图片致Android应用崩溃求助
解决react-native-maps Marker自定义图片Android崩溃问题
我之前也踩过这个react-native-maps的Android兼容性坑,结合你给出的报错信息(Resources$NotFoundException: Resource ID #0x0),核心问题就是Android端没办法正确解析你通过require传入的图片资源,给你几个亲测有效的解决思路:
1. 先排查资源基础问题
- 首先确认你的图片文件名符合Android资源规则:不能有大写字母、空格或特殊字符(仅允许下划线),你的
logo-marker.png是合规的,但要检查图片是否确实在../../assets/路径下,没有被误删或路径写错。 - 尝试清理Android项目缓存并重新构建,有时候资源链接异常会导致找不到文件:
cd android && ./gradlew clean && cd .. && react-native run-android
2. 改用URI方式传入图片(替代require)
Android端对require加载本地图片的处理经常有兼容性问题,换用URI方式能规避这个问题:
- 方案一:把图片复制到Android项目的
res/drawable目录(没有的话手动创建),然后直接用文件名作为URI:<Marker key={marker.id} coordinate={{latitude: parseFloat(marker.lat), longitude: parseFloat(marker.lng)}} title={marker.name} description={marker.description} image={{ uri: 'logo-marker' }} // 直接用drawable里的文件名,不用加后缀 onCalloutPress={() => this.details(marker.id, marker.cover)} /> - 方案二:用
Image.resolveAssetSource获取正确的资源URI:import { Image } from 'react-native'; // 提前解析资源 const markerImage = Image.resolveAssetSource(require('../../assets/logo-marker.png')); // 在Marker中使用 <Marker key={marker.id} coordinate={{latitude: parseFloat(marker.lat), longitude: parseFloat(marker.lng)}} title={marker.name} description={marker.description} image={{ uri: markerImage.uri }} onCalloutPress={() => this.details(marker.id, marker.cover)} />
3. 升级react-native-maps版本
你当前使用的版本可能存在Android端image属性的已知bug,尝试升级到最新稳定版:
npm install react-native-maps@latest --save
升级完成后记得重新运行项目,旧版本RN可能需要手动执行链接命令,新版本RN会自动处理资源链接。
4. 用自定义View替代image属性
如果上面的方法都没效果,干脆放弃image属性,用自定义Marker视图实现,这种方式兼容性拉满:
<Marker key={marker.id} coordinate={{latitude: parseFloat(marker.lat), longitude: parseFloat(marker.lng)}} onCalloutPress={() => this.details(marker.id, marker.cover)} > <Image source={require('../../assets/logo-marker.png')} style={{ width: 30, height: 30 }} // 根据需求调整大小 /> </Marker>
报错原因补充
从堆栈信息能看到,AirMapMarker.setImage方法在尝试获取Android资源时,拿到的是无效的资源ID(0x0),这说明React Native没有把你通过require传入的图片正确映射为Android能识别的本地资源,所以抛出了资源找不到的异常。
内容的提问来源于stack exchange,提问作者Joss D.
相关产品推荐
相关产品推荐

