8***@qq.com
8***@qq.com
  • 发布:2026-05-12 09:32
  • 更新:2026-05-12 09:33
  • 阅读:18

5.0.06Hbuilderl离线打包android app通过uni.openLocation打开地图,app闪退

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: 15.3

HBuilderX类型: 正式

HBuilderX版本号: 5.06

手机系统: Android

手机系统版本号: Android 16

手机厂商: 三星

手机机型: S25Ultra

页面类型: vue

vue版本: vue3

打包方式: 离线

项目创建方式: HBuilderX

App下载地址或H5⽹址: https://link.vvstc.com/index.html?id=com.kwrzcu.kcfsod

示例代码:

export const openLocation = (paras: any) => {
// openLocation打开的腾讯地图为火星坐标,需转换
const type = paras.type || 'wgs84'
const gcj02 = togcj02(type, paras)
uni.openLocation({
latitude: gcj02.latitude, // 纬度,浮点数,范围为90 ~ -90
longitude: gcj02.longitude, // 经度,浮点数,范围为180 ~ -180。
name: paras.name, // 位置名
address: paras.address || '', // 地址详情说明
scale: 15, // 地图缩放级别,整形值,范围从1~28。默认为最大,
fail: (err) => {
log('openLocation fail: ', err)
}
})
}
const detectKeys = (pt: any) => {
const keys = [
{ lon: 'longitude', lat: 'latitude' },
{ lon: 'lon', lat: 'lat' },
{ lon: 'lng', lat: 'lat' }
]

for (let i = 0; i < keys.length; i++) {
if (pt[keys[i].lon] !== undefined && pt[keys[i].lat] !== undefined) {
return keys[i]
}
}
throw new Error('找不到坐标相关键值')
}
export const togcj02 = (type: string, pt: any) => {
const keys = detectKeys(pt)
if (hasNoValues(pt, keys)) return pt

let gcj02 = null
switch (type) {
case 'wgs84':
gcj02 = coordtransform.wgs84togcj02(pt[keys.lon], pt[keys.lat])
break
case 'bd09':
gcj02 = coordtransform.bd09togcj02(pt[keys.lon], pt[keys.lat])
break
case 'gcj02':
gcj02 = [pt[keys.lon], pt[keys.lat]]
break
default:
throw new Error('togcj02 not implement, type:' + type)
}
const final: any = {}
final[keys.lon] = gcj02[0]
final[keys.lat] = gcj02[1]
return final
}/**

  • WGS84转GCj02
  • @param lng
  • @param lat
  • @returns {[]}
    /
    const wgs84togcj02 = (lng, lat) => {
    lat = +lat;
    lng = +lng;
    if (out_of_china(lng, lat)) {
    return [lng, lat]
    } else {
    var dlat = transformlat(lng - 105.0, lat - 35.0);
    var dlng = transformlng(lng - 105.0, lat - 35.0);
    var radlat = lat / 180.0 PI;
    var magic = Math.sin(radlat);
    magic = 1 - ee
    magic magic;
    var sqrtmagic = Math.sqrt(magic);
    dlat = (dlat
    180.0) / ((a (1 - ee)) / (magic sqrtmagic) PI);
    dlng = (dlng
    180.0) / (a / sqrtmagic Math.cos(radlat) PI);
    var mglat = lat + dlat;
    var mglng = lng + dlng;
    return [mglng, mglat]
    }
    };/**
  • 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
  • 即 百度 转 谷歌、高德
  • @param bd_lon
  • @param bd_lat
  • @returns {[]}
    /
    const bd09togcj02 = (bd_lon, bd_lat) => {
    bd_lon = +bd_lon;
    bd_lat = +bd_lat;
    var x = bd_lon - 0.0065;
    var y = bd_lat - 0.006;
    var z = Math.sqrt(x x + y y) - 0.00002 Math.sin(y x_PI);
    var theta = Math.atan2(y, x) - 0.000003 Math.cos(x x_PI);
    var gg_lng = z Math.cos(theta);
    var gg_lat = z
    Math.sin(theta);
    return [gg_lng, gg_lat]
    };

操作步骤:

信息详情界面 → 点击地址 → 进入地图页面一直未加载完成 → App 闪退

预期结果:

app 闪退,详情见附件图片

实际结果:

app 闪退,详情见附件图片

bug描述:

打开信息详情界面 → 点击地址 → 进入地图页面一直未加载完成 → App 闪退。请查看附件视频和图片
调用的代码 点击地址 调用 uni.openLocation。 参数传入没有问题,同样信息的在苹果app和微信小程序打开是正常的,苹果app也是高德地图,所有的android 都有这个现象。
项目类型是:vue,离线打包。确定manifest.json 已正确配置高德地图的 AppKey。确定已经给app 定位和存储等权限。
app 奔溃友盟后台日志:java.lang.IncompatibleClassChangeError: Found class com.facebook.imagepipeline.image.CloseableBitmap, but interface was expected (declaration of 'com.facebook.imagepipeline.image.CloseableBitmap' appears in /data/user/0/com.kwrzcu.kcfsod/files/prodexdir/00O000ll111l_0.dex) at io.dcloud.feature.weex.adapter.FrescoLoadUtil$1$2.onNewResultImpl(r8-map-id-85d9d7cb2ada512ab576f048776a9046588c0b99294a11baa838902d2d30ce5b:31) at com.facebook.datasource.BaseDataSubscriber.onNewResult(r8-map-id-85d9d7cb2ada512ab576f048776a9046588c0b99294a11baa838902d2d30ce5b:5) at com.facebook.datasource.AbstractDataSource$1.run(r8-map-id-85d9d7cb2ada512ab576f048776a9046588c0b99294a11baa838902d2d30ce5b:29) at android.os.Handler.handleCallback(Handler.java:995) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loopOnce(Looper.java:288) at android.os.Looper.loop(Looper.java:393) at android.app.ActivityThread.main(ActivityThread.java:9569) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1010)

2026-05-12 09:32 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

根据你提供的 bug 反馈,我从官方人员的视角进行了评审,具体分析如下:

一、反馈内容完整性评估

  1. BUG 描述:描述相对清晰,指出了在 Android 离线打包环境下,调用 uni.openLocation 后地图未加载完成即闪退。同时提供了关键的友盟崩溃日志,并明确指出 iOS 和微信小程序正常。这是一个非常有助于定位问题的关键信息。
  2. 代码示例:提供了调用 uni.openLocation 的封装代码及坐标转换逻辑。代码本身是合理的,参数传入也看不出问题。崩溃日志指向的是原生层面的图片加载库(Fresco),而非你的前端业务代码,因此代码示例在此次问题中不是核心。
  3. 复现步骤:步骤描述清晰、路径明确。结合崩溃日志,官方人员可以大致了解从操作到崩溃的全过程。
  4. 预期结果与实际结果:你填写的预期结果和实际结果均为“app 闪退”,这里应该是填写错误。预期结果应为“正常打开地图并展示位置信息”,实际结果为“地图未加载完成,App 闪退”。尽管描述有误,但从上下文可以理解真实意图,不影响对问题的判断。
  5. 分类信息:版本信息(HBuilderX 5.06)、运行平台(Android)、打包方式(离线)、Vue 版本(Vue3)等关键信息均已提供,非常完整。

二、Bug 是否成立分析

此 Bug 成立,且是一个已知的兼容性问题。

  1. 问题定性:根据你提供的崩溃日志 java.lang.IncompatibleClassChangeError: Found class com.facebook.imagepipeline.image.CloseableBitmap, but interface was expected,这是一个典型的 Android 原生库依赖冲突的报错。错误发生在 FrescoLoadUtil 中,Fresco 是用于图片加载的库。这通常意味着在离线打包的原生工程中,引入的 Fresco 库版本与 uni-app 的其他原生库(如高德地图等)依赖的版本不兼容。
  2. 知识库依据:我在知识库中找到了一个与你问题几乎完全一致的案例。有开发者也遇到了在 Android 离线打包时,地图相关功能因 IncompatibleClassChangeError 闪退,错误同样发生在 io.dcloud.feature.weex.adapter.FrescoLoadUtil。这印证了该问题是离线打包原生工程配置的已知坑点。
    • 相关案例:[DCloud问答_216563]【报Bug】安卓离线打包,高德地图设置自定义marker图标安卓闪退,hbuilderX基座正常 中提到了一模一样的崩溃日志。
  3. 解决方案建议
    • 检查原生工程依赖:请仔细检查你的 Android 离线打包工程中,关于 fresco 库的依赖配置。知识库中的一个案例提到了其依赖为 implementation 'com.facebook.fresco:fresco:2.5.0'。你需要确认你的工程中使用的 fresco 版本是否与 DCloud 官方要求的离线 SDK 版本一致,不要自行引入其他版本,以免产生冲突。
    • 使用最新版离线 SDK:建议重新下载与 HBuilderX 5.06 版本完全匹配的最新版 Android 离线 SDK,并严格按照官方文档配置原生工程,确保所有 .aar 和依赖库版本都是官方提供的,不要混用旧版本的库。
    • 临时替代方案:如果问题暂时无法解决,可以考虑先使用云打包。云打包环境由 DCloud 统一维护,能确保所有原生库的版本兼容性,不会出现此类依赖冲突问题。

三、基本概念问题分析

本次反馈不涉及基本的 uni-app 概念问题。问题根源在于 Android 离线打包原生工程的环境配置,属于原生开发层面的依赖管理问题。用户能提供详细的崩溃日志,表明其具备一定的排查能力。

内容为 AI 生成,仅供参考

要回复问题请先登录注册