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

Google Maps Activity快速缩放崩溃,出现JNI UTF-8编码错误

解决Google Maps快速缩放时因JNI编码错误崩溃的问题

看起来你遇到的是Google Maps SDK在后台访问本地存储时,碰到了包含emoji的非标准Modified UTF-8文件名,触发了JNI层的编码异常。虽然这个文件名不在你的代码里,但Maps SDK在某些场景下(比如扫描本地媒体资源、加载缓存文件)会访问设备存储,刚好命中了这个有问题的文件。

可能的原因

JNI的NewStringUTF函数要求输入必须是Modified UTF-8编码,但emoji😀的UTF-8编码是0xF0 0x9F 0x98 0x80,其中起始字节0xF0不符合Modified UTF-8的规范(Modified UTF-8对多字节字符的起始字节范围有严格限制),所以当SDK尝试将这个文件名转换为Java字符串时直接抛出了错误。

解决方案步骤

  • 检查并调整存储权限
    如果你的应用不需要访问外部存储,直接在AndroidManifest.xml中移除READ_EXTERNAL_STORAGE权限;如果必须保留,确保只在必要时动态请求权限,避免SDK无限制扫描存储。

  • 清理应用缓存
    Google Maps SDK可能缓存了本地文件的索引,清除缓存可以重置这些数据:

    1. 打开设备「设置」→「应用」→找到你的应用
    2. 进入「存储」选项,点击「清除缓存」
  • 定位并处理问题文件
    在设备存储中搜索文件名Having fun in the studio this morning 😀 (1).mp4,找到后将其重命名(去掉emoji或替换为普通字符)或直接删除,再测试地图缩放是否正常。

  • 升级Google Maps SDK版本
    旧版本的Maps SDK可能存在特殊字符文件名的处理bug,尝试升级到最新版的依赖:
    在你的build.gradle(Module级别)中更新依赖:

    implementation 'com.google.android.gms:play-services-maps:最新版本号'
    

    可以在Google开发者文档中查看当前最新的SDK版本。

  • 调试存储访问行为
    启用StrictMode来检测应用的存储访问路径,帮助定位SDK扫描的文件位置:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectAll()
                .penaltyLog()
                .build());
        // 其他初始化代码
    }
    

    然后查看Logcat中的StrictMode日志,找到SDK访问的存储路径,进一步排查问题。

内容的提问来源于stack exchange,提问作者UndercoverCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:22:32