android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW cat=[android.intent.category.DEFAULT] dat=amapuri://route/plan/?dlat=30.241878&dlon=120.440527&dname=杭州萧山机场T1&dev=0&t=0 }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2114)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1757)
at android.app.Activity.startActivityForResult(Activity.java:4800)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:675)
at android.app.Activity.startActivityForResult(Activity.java:4740)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:662)
at android.app.Activity.startActivity(Activity.java:5161)
at android.app.Activity.startActivity(Activity.java:5129)
at com.geely.travel.geelytravel.utils.MapUtils.openGaodeMap(MapUtils.kt:70)
at com.geely.travel.geelytravel.ui.main.stroke.StrokeDetailAirTicketActivity$initListener$1$$special$$inlined$show$lambda$1.invoke(StrokeDetailAirTicketActivity.kt:60)
at com.geely.travel.geelytravel.ui.main.stroke.StrokeDetailAirTicketActivity$initListener$1$$special$$inlined$show$lambda$1.invoke(StrokeDetailAirTicketActivity.kt:36)
at com.afollestad.materialdialogs.internal.list.PlainListDialogAdapter.itemClicked(PlainListDialogAdapter.kt:64)
at com.afollestad.materialdialogs.internal.list.PlainListViewHolder.onClick(PlainListDialogAdapter.kt:34)
at android.view.View.performClick(View.java:6648)
at android.view.View.performClickInternal(View.java:6620)
at android.view.View.access$3100(View.java:787)
at android.view.View$PerformClick.run(View.java:26167)
at android.os.Handler.handleCallback(Handler.java:891)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:7539)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)
报错地方的代码
/**
* 打开高德地图
* @param context 上下文
* @param destination 经纬度
* @param destinationAddress 目标地址
* 高德地图:http://lbs.amap.com/api/amap-mobile/guide/android/route
*/
fun openGaodeMap(context: Context, destination: LatLng,
destinationAddress: String) {
val intent = Intent()
intent.action = "android.intent.action.VIEW"
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("amapuri://route/plan/?" +
"dlat=" + destination.latitude +
"&dlon=" + destination.longitude +
"&dname=" + destinationAddress +
"&dev=0" +
"&t=0")
context.startActivity(intent)
}
原因:低版本的高德地图导致,手机中的高德地图版本是2016年之前的版本,就会报这个错误,2016-01-28的版本已经修复这个carsh,可以在豌豆荚下载历史版本进行测试,获得修复版本的版本号,versionCode558是2015-12-30这个版本的版本号。
解决方法:获取手机的高德地图的版本,低于修复版本的就提示安装最新版本
private fun getMapVersionCode(context: Context, packageName: String): Int {
val packageManager = context.packageManager
val packageInfos = packageManager.getInstalledPackages(0)
if (packageInfos != null) {
for (i in packageInfos.indices) {
val packName = packageInfos[i].packageName
if (packName == packageName) {
return packageInfos[i].versionCode
}
}
}
return 0
}
fun openGaodeMap(context: Context, destination: LatLng,
destinationAddress: String) {
try {
val versionCode = getMapVersionCode(context, GAODE_PACKAGE_NAME)
if (versionCode <= 558) {
context.toast("检测到当前高德地图版本过低无法跳转请先升级高德地图")
return
}
val intent = Intent()
intent.action = "android.intent.action.VIEW"
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("amapuri://route/plan/?" +
"dlat=" + destination.latitude +
"&dlon=" + destination.longitude +
"&dname=" + destinationAddress +
"&dev=0" +
"&t=0")
context.startActivity(intent)
} catch (e: Exception) {
CrashReport.postCatchedException(Exception(e))
}
}