Google 自己的 MapsActivity 如何在三星 phone 上导致 ClassNotFoundException?
How can Google's own MapsActivity result in a ClassNotFoundException on a Samsung phone?
昨天我的 Google Play 控制台出现了最奇怪的错误。
我有一个按钮可以在 Google 地图应用程序中打开路线。有好几年了。看起来像这样:
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://maps.google.com/maps?f=d&daddr=" +
lat + "," + lon));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
activity.startActivity(intent);
昨天我收到这个错误日志:
Samsung Galaxy J6+ (j6primelte), Android 8.1
android.content.ActivityNotFoundException:
我无法理解这是怎么发生的,而且我以前从未见过。还有比我更了解的吗?
编辑: 显然我知道我可以在它周围放一个 try/catch。那不是我的问题。我想知道如何在三星上获得 google 地图 API 中某物的 ActivityNotFound。我唯一能想到的就是 root phone?
此按钮浮动在 Google 地图之上,我们会在应用程序启动时检查 google 播放服务,因此除非您已经看到Google 应用中的地图。
确保输入代码,
try {
//Put your code here
} catch (Exception e) {
e.printStackTrace();
}
因为当您设置打开特定应用程序的 intent 时,该应用程序可能 未安装 在该设备中(在您的情况下是三星 phone),所以下面的 calss 不是找到了,它 抛出异常。
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
"Able to show a Google map" 和 "the Google Maps app is installed" 不是一回事。很明显,您的用户安装了 Play 服务(用于在您的应用中嵌入地图),但没有安装 Google 地图。据推测,他或她已经 root phone 并安装了一个没有 Google 地图的不同 ROM。通常(如您现在所见)假设任何有关 phone 上将安装什么应用程序的事情都不是一个好主意。
这是我用来检查它的代码:
public void showDirections(String address, FragmentActivity activity) {
address = Uri.encode(address);
Uri gmmIntentUri = Uri.parse("google.navigation:q=" + address);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
if (mapIntent.resolveActivity(activity.getPackageManager()) == null) {
DialogUtils.getInstance(activity).reportError(activity, "Google Maps is required for this feature");
return;
}
activity.startActivity(mapIntent);
}
昨天我的 Google Play 控制台出现了最奇怪的错误。
我有一个按钮可以在 Google 地图应用程序中打开路线。有好几年了。看起来像这样:
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://maps.google.com/maps?f=d&daddr=" +
lat + "," + lon));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
activity.startActivity(intent);
昨天我收到这个错误日志:
Samsung Galaxy J6+ (j6primelte), Android 8.1
android.content.ActivityNotFoundException:
我无法理解这是怎么发生的,而且我以前从未见过。还有比我更了解的吗?
编辑: 显然我知道我可以在它周围放一个 try/catch。那不是我的问题。我想知道如何在三星上获得 google 地图 API 中某物的 ActivityNotFound。我唯一能想到的就是 root phone?
此按钮浮动在 Google 地图之上,我们会在应用程序启动时检查 google 播放服务,因此除非您已经看到Google 应用中的地图。
确保输入代码,
try {
//Put your code here
} catch (Exception e) {
e.printStackTrace();
}
因为当您设置打开特定应用程序的 intent 时,该应用程序可能 未安装 在该设备中(在您的情况下是三星 phone),所以下面的 calss 不是找到了,它 抛出异常。
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
"Able to show a Google map" 和 "the Google Maps app is installed" 不是一回事。很明显,您的用户安装了 Play 服务(用于在您的应用中嵌入地图),但没有安装 Google 地图。据推测,他或她已经 root phone 并安装了一个没有 Google 地图的不同 ROM。通常(如您现在所见)假设任何有关 phone 上将安装什么应用程序的事情都不是一个好主意。
这是我用来检查它的代码:
public void showDirections(String address, FragmentActivity activity) {
address = Uri.encode(address);
Uri gmmIntentUri = Uri.parse("google.navigation:q=" + address);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
if (mapIntent.resolveActivity(activity.getPackageManager()) == null) {
DialogUtils.getInstance(activity).reportError(activity, "Google Maps is required for this feature");
return;
}
activity.startActivity(mapIntent);
}