Google Maps Activity快速缩放崩溃,出现JNI UTF-8编码错误
看起来你遇到的是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可能缓存了本地文件的索引,清除缓存可以重置这些数据:- 打开设备「设置」→「应用」→找到你的应用
- 进入「存储」选项,点击「清除缓存」
定位并处理问题文件
在设备存储中搜索文件名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

