You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:30:54