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);
}