【问题标题】:How to detect an android device whether it supports google maps API如何检测安卓设备是否支持谷歌地图API
【发布时间】:2010-08-04 22:47:43
【问题描述】:

我目前正在开发一个使用 Google 地图 API 的 android 应用程序。

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

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

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

因为使用地图功能只是我的应用程序的功能之一,我想让那些不支持地图 api 的设备仍然可以下载和运行我的应用程序,而不会影响我的应用程序的其他功能。

欢迎提出意见或建议

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

    【讨论】:

    • 这似乎在带有 android 3.2 的三星银河选项卡和带有 android x86 2.2 的 virtualbox 上失败
    • 这怎么会失败???它是否存在类......如果类为空,则可以添加空检查,然后抛出异常以防它为空。这根本不能失败,否则,Java 将是一门非常蹩脚的语言。 ;)
    • 也许他的意思是:“它没有检测到谷歌地图的存在,什么时候应该,因为它存在”??
    • @max4ever 我已经在运行 Android 4.0.3 的三星 Galaxy Tab 10.1" 和三星 Galaxy Tab 2 7" 上进行了测试,并且上面的代码有效。我有一个用户报告了三星 Galaxy S II 的问题,但我无法在运行 4.0.3 的设备上重现它。也许这是三星修复的错误?
    【解决方案2】:

    我需要在尝试任何调用之前查看该库是否存在,以便我可以事先填写相关首选项。这是我想出的要检查的代码。

    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 Market 等...

      这是我的代码。 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,那么它是必不可少的。
      • 你是对的!非常感谢您提供的信息,这对我很有帮助!
      • 非常感谢。你的代码对我有用。但我需要捕获 NoClassDefFoundError 。
      • 我喜欢这个解决方案只是因为它让我有机会用谷歌地图 (maps.google.com) 的 url 打开一个 web 视图。
      【解决方案4】:

      感谢大家的帮助!你所有的建议对我都有用!!

      我编写了一个简单的应用程序,它能够部署在 None-Google-Map API 模拟器上,并且可以检测到 Google API 是否存在。

      我所做的是指定&lt;uses-library android:name="com.google.android.maps" android:required="false" /&gt;

      (但android“必需”属性仅适用于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(); 
      }
      

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

      【讨论】:

        【解决方案5】:

        这对我有用:

        在清单中使用(未记录?)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),而不仅仅是对问题做出反应。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 没有。例如,Archos 5IT(或其他一些平板电脑)没有 Google 地图(也没有 Android Matket)。
          • 是的。有些平板电脑没有谷歌地图。我在一个真正的平板设备上进行了测试,当我安装我的地图活动时,它给了我安装失败的错误消息。
          • Casio G'Zone Command 没有预装谷歌地图,它安装了 B#$#%##ing 地图(我无法卸载它!)。
          • 并非所有设备都有谷歌地图,例如Kindle Fire。
          【解决方案7】:

          如果您在应用程序中使用 googlemaps,则应在应用程序标签内的 manifest.xml 中包含以下内容

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

          这将阻止用户安装您的应用程序或在市场上看到它,不确定是哪一个,可能两者兼而有之。

          【讨论】:

          • 是的,你是对的。 Android 市场会为用户过滤掉该应用程序。但是,我希望用户不仅可以从市场下载我的应用程序,还可以从我的网站下载我的应用程序。因为,使用地图功能只是我的应用程序的功能之一,我想让那些不支持地图 api 的设备仍然能够下载和运行我的应用程序,而不会影响我的应用程序的其他功能。
          • android :required = "false" 帮助我将我的地图应用程序安装到了一个不支持谷歌 api 的模拟器(2.1)上,至少我没有收到“缺少共享库”错误消息。但是,此属性不适用于 1.6,我无法编译,我在编译项目时收到“No resouce identifier found for 'required' 错误消息
          • 要绕过编译错误,您可以将目标版本提升到 2.1,然后将 minsdkversion 设置为 4。这将使其编译,但 1.6 及以下版本将忽略 required=false(我认为)
          • 是的!如果我这样做,它允许我编译,但 1.6 仍然忽略 required = false,并给我“缺少共享库”错误消息。查看我的另一篇帖子stackoverflow.com/questions/3436674/…
          【解决方案8】:

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

          adb shell cmd package list libraries
          

          如果您的设备支持 Google 地图,您会看到这一行:

          library:com.google.android.maps
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-04
            • 1970-01-01
            • 2014-09-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多