如何检测安卓设备是否支持谷歌地图API

20

我目前正在开发一款使用Google地图API的安卓应用。

我想知道所有安卓设备是否都支持地图API,因为这个API是一个可选API并且是平台的附加组件。

我担心我的应用程序无法在某些设备上运行。

我需要知道的是如何以编程方式检测设备是否支持地图API,并捕获异常并执行其他操作。

因为使用地图功能只是我的应用程序的其中一个功能,所以我希望那些不支持地图API的设备仍然能够下载和运行我的应用程序,而不影响应用程序的其他功能。

欢迎任何评论或建议。

8个回答

15

除了已描述的解决方案外,我还使用了以下解决方案

<uses-library android:name="com.google.android.maps" android:required="false"/>

在其他答案中:

public void mapClick(View view)
{
    try
    {
        // check if Google Maps is supported on given device
        Class.forName("com.google.android.maps.MapActivity");

        this.startActivity(new Intent(this, MyMapActivity.class));
    }
    catch (Exception e)
    {
        e.printStackTrace();
        UIUtils.showAlert(this, R.string.google_maps_not_found);
    }
}

这似乎在三星Galaxy Tab上的Android 3.2和在安装有Android x86 2.2的VirtualBox上失败了。 - max4ever
这怎么可能失败???它只是检查类是否存在而已... 如果类为空,可以添加一个空值检查,然后在其为空时抛出异常。否则,Java将成为一种非常糟糕的语言。 ;) - TacB0sS
1
也许他的意思是:“它没有检测到Google地图的存在,但实际上它已经存在了”? - Andrew Mackenzie
@max4ever 我已经在一台运行Android 4.0.3的三星Galaxy Tab 10.1英寸和一台三星Galaxy Tab 2 7英寸上进行了测试,以上代码都可以正常运行。但是,有用户报告在三星Galaxy S II上出现了问题,但我在一台运行4.0.3的设备上无法复现。也许这是三星已经修复的一个bug? - Paul Lammertsma

5

在尝试调用之前,我需要查看库是否存在,以便提前填写相关的偏好设置。以下是我编写的检查代码。

public static boolean hasSystemSharedLibraryInstalled(Context ctx,
        String libraryName) {
    boolean hasLibraryInstalled = false;
    if (!TextUtils.isEmpty(libraryName)) {
        String[] installedLibraries = ctx.getPackageManager()
                .getSystemSharedLibraryNames();
        if (installedLibraries != null) {
            for (String s : installedLibraries) {
                if (libraryName.equals(s)) {
                    hasLibraryInstalled = true;
                    break;
                }
            }
        }
    }
    return hasLibraryInstalled;
}

然后我检查是否安装了com.google.android.maps


3

你说得对,一些设备如Archos 5IT和某些平板电脑没有Google地图、Android市场等应用。

这是我的代码。 BelgianMap是一个MapActivity:

try {
    Intent i = new Intent(InfoGare.this, BelgianMap.class);
    startActivityForResult(i, 0);
}
catch(ActivityNotFoundException e) {
    Toast.makeText(context, "Google Map not found", Toast.LENGTH_LONG).show();
}

也许有其他方法可以在创建应用程序并显示消息时找到它。这可能更好。


这将是可行的,并且具有很好的冗余。但是,如果您只是不希望用户能够使用该应用程序,则我发布的解决方案可能更合适,并且我认为如果您正在使用GoogleMaps API,则它是必不可少的。 - stealthcopter
你说得对!非常感谢提供这些信息,这将对我很有帮助! - Waza_Be
1
非常感谢。你的代码对我有用。但是我需要捕获NoClassDefFoundError。 - TS.xy
我喜欢这个解决方案,因为它让我有机会使用URL打开一个Web视图,而不是直接跳转到Google地图(maps.google.com)。 - jj.

2
感谢各位的帮助!你们的建议对我非常有用!
我编写了一个简单的应用程序,可以在非Google地图API模拟器上部署,并通过编程方式检测Google API的存在。
我的做法是指定<uses-library android:name="com.google.android.maps" android:required="false" />,这样就能够将应用程序部署到模拟器上了。
但是,android的"required"属性只适用于2.1版本,不适用于1.6版本。我需要找出原因,因为当我查看文档时,它说这个属性被1.6版本支持。
因此,我能够将应用程序部署到模拟器上。
其次,我创建了一个名为HelloMaps的地图活动,在我的主要活动中。
try{
     mapActivity = new Intent(TestApp.this, HelloMaps.class); 
     startActivityForResult(mapActivity, 0); 
}catch(NoClassDefFoundError e){
(Toast.makeText(TestApp.this, "Google Map API not found", Toast.LENGTH_LONG)).show(); 
}

这将捕获异常并告诉我设备无法运行地图活动。


1

对我有效的方法是:

在清单文件中使用(未公开的?)uses-library android:name="com.google.android.maps"android:required="false",这将允许在不支持maps-api的设备上安装应用程序。

然后看看这个: http://android-developers.blogspot.com.ar/2009/01/can-i-use-this-intent.html

您仍然可以在应用程序中保留所有maps-api代码(无需2个版本),只需编写UI以防止其运行即可(在我的情况下,我将首选项变灰)。如上所述,上述技术有效地预测了某些不起作用的内容,并允许您做出响应(无FC),而不仅仅是对问题做出反应。


0

通过使用adb,打印所有系统库:

adb shell cmd package list libraries

如果您的设备支持谷歌地图,您将看到这行文字:
library:com.google.android.maps

0
如果您在应用程序中使用Google地图,则应在manifest.xml文件中的应用程序标签内包含以下内容。
 <uses-library android:name="com.google.android.maps" />

这将防止用户安装您的应用程序或在市场上看到它,不确定是哪一个,也许两者都有。


1
是的,你说得对。Android市场会为用户过滤应用程序。但是,我想让用户不仅可以从市场上下载我的应用程序,还可以从我的网站上下载。因为使用地图功能只是我的应用程序的一个功能之一,我希望那些不支持地图API的设备仍然能够下载和运行我的应用程序,而不影响其他功能。 - TS.xy
android:required="false" 帮助我将我的地图应用程序安装到不支持 Google API 的模拟器(2.1)上,至少我没有收到“缺少共享库”错误消息。然而,这个属性在 1.6 版本中无法工作,我无法编译,当我编译项目时出现“找不到'required'的资源标识符”错误消息。 - TS.xy
为了避免编译错误,您可以将目标版本提高到2.1,然后将minsdkversion设置为4。这样可以使其编译,但1.6及以下版本将忽略required=false(我想)。 - stealthcopter
是的!如果我这样做,它允许我编译,但1.6仍然忽略了required = false,并给我“缺少共享库”错误消息。请参见我的另一篇帖子 http://stackoverflow.com/questions/3436674/uses-library-in-androidmanifest-xml - TS.xy

0

据我所知,可选的 API 只适用于模拟器。API 级别的两个不同版本仅适用于模拟器,我认为真实设备应该都有地图 API。


例如,Archos 5IT(或其他某些平板电脑)没有Google地图(也没有Android市场)。 - Waza_Be
是的,有些平板电脑没有谷歌地图。我在真实的平板设备上进行了测试,当我安装我的地图活动时,它会给我安装失败的错误消息。 - TS.xy
Casio G'Zone Command手机没有预装Google地图,它安装了B#$#%##ing地图(而且我无法卸载它!)。 - Norman H
并非所有设备都拥有Google地图,例如Kindle Fire。 - Dan J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接