2010-08-04 21 views
19

Actualmente estoy desarrollando una aplicación de Android que utiliza Google Map API.Cómo detectar un dispositivo Android si es compatible con Google Maps API

Me pregunto si todos los dispositivos Android admiten la API de mapa, porque esta API es una API optativa y es un complemento de la plataforma.

Me preocupa que mi aplicación no pueda ejecutarse en ese dispositivo.

Lo que necesito saber es detectar mediante un programa si la API del mapa de soporte del dispositivo, y detectar la excepción y hacer algo más.

Porque, utilizando la capacidad de mapa es solo una de las funciones de mi aplicación, me gustaría dejar que aquellos dispositivos que no admitan api de mapas todavía puedan descargar y ejecutar mi aplicación sin afectar otras funciones de mi aplicación.

Cualquier comentario o sugerencia será bienvenida

Respuesta

2

Gracias por toda su ayuda chicos! ¡todas tus sugerencias son útiles para mí!

Escribí una aplicación simple que puede implementarse en el emulador de la API None-Google-Map y detectar la presencia de API de Google de forma problemática.

Lo que hice fue que especifica <uses-library android:name="com.google.android.maps" android:required="false" />

(pero Android "requerida" atribuir sólo funciona para 2.1 y no funciona para 1.6. Necesitaré para averiguar por qué. Porque cuando tuve vistazo a la documentación , dice que este atributo es compatible con 1.6)

Por lo tanto, puedo implementar la aplicación en el emulador.

En segundo lugar, he creado un mapa de la actividad que se llama HelloMaps En mi actividad

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

Esto detectar la excepción y me dicen que el dispositivo no podría ejecutar la actividad mapa.

+0

¿Logramos que funcione en la pestaña galaxy? –

+2

Esta solución no es buena suficiente, y bastante sucio! – TacB0sS

0

La API opcional solo se aplica al emulador por lo que yo sé. Las 2 versiones diferentes de los niveles API son solo para el emulador, los dispositivos reales deberían tener todos los API. Creo que

+0

No .. Por ejemplo, el Archos 5IT (u otras tabletas) no tiene Google Maps (y tampoco tiene Android Matket). –

+0

Sí. algunas tabletas no tienen Google Maps. Probé en una tableta real, cuando instalé mi actividad de mapa, me da un mensaje de error de instalación fallida. –

+0

El comando Casio G'Zone no viene con Google Maps preinstalado, tiene mapas B # $ #% ## instalados (¡y no puedo desinstalarlo!). –

2

Tienes razón, algunos dispositivos, como Archos 5IT y Some Tablet no tienen Google Maps, Android Market, etc ...

Aquí está mi Código. BelgianMap es un 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(); 
} 

Pero tal vez hay otro camino para encontrar que en la creación de su aplicación y mostrar un mensaje. Eso podría ser mejor.

+0

Esto funcionará y tiene buena redundancia. Sin embargo, si simplemente no desea que los usuarios puedan usar la aplicación, la solución que publique puede ser más adecuada, y creo que es esencial si está utilizando la API de googlemaps. – stealthcopter

+0

¡Tienes razón! ¡Muchas gracias por la información, eso me ayudará mucho! –

+1

Muchas gracias. tu código funciona para mí pero necesito atrapar NoClassDefFoundError en su lugar. –

0

Si está utilizando googlemaps en su solicitud debe incluir lo siguiente en su manifest.xml dentro de las etiquetas de aplicación

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

Esto tampoco impedir que un usuario instale la aplicación o verlo en el mercado, no estoy seguro de cuál, tal vez ambos.

+1

Sí, tienes razón. El mercado de Android filtraría la aplicación para el usuario. Sin embargo, me gustaría permitir que el usuario descargue mi aplicación no solo desde el mercado sino desde mi sitio. Debido a que el uso de la capacidad de mapas es solo una de las características de mi aplicación, me gustaría permitir que aquellos dispositivos que no admitan la API de mapas sigan pudiendo descargar y ejecutar mi aplicación sin afectar otras funciones de mi aplicación. –

+1

use android: required = "false" – hackbod

+0

android: required = "false" me ayudó a instalar mi aplicación de mapa en un emulador no compatible con google api (2.1), al menos no recibí el mensaje de error "Missing shared library" . Sin embargo, este atributo no funciona para 1.6 de alguna forma, no pude compilar, recibo "No se encontró el identificador de recursos para el mensaje de error 'requerido' cuando estoy compilando el proyecto –

1

Esto funcionó para mí:

Uso del (indocumentado?) Utiliza la biblioteca-android: name = "com.google.android.maps" androide: required = "false" en el manifiesto. Esto permitirá la instalación en un dispositivo compatible con maps-api.

Entonces mira esto: http://android-developers.blogspot.com.ar/2009/01/can-i-use-this-intent.html

Puede aún así tener todo el código mapas-api intacta en la aplicación (sin necesidad de 2 versiones), simplemente el código de su interfaz de usuario para evitar que ejecutarlo. (En mi caso, me enojé con una preferencia). Como se señaló, la técnica descrita anteriormente predice de manera efectiva algo que no funcionará, y le permite responder (sin FC), en lugar de simplemente reaccionar a un problema.

15

he utilizado siguiente solución, además de descrito

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

en otras respuestas:

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

esto parece fallar en la pestaña Samsung Galaxy con Android 3.2 y en la caja virtual con Android x86 2.2 – max4ever

+0

¿Cómo puede fallar? la clase existe, o no ... Quizás se pueda agregar una verificación nula si la clase es nula y luego arrojar una excepción en caso de que sea nula. Esto simplemente no puede fallar, de lo contrario, Java sería un lenguaje muy cojo. ;) – TacB0sS

+1

Quizás quiere decir: "no detecta la presencia de Google Maps, cuando debería, ya que está presente" ?? –

5

que necesitaba para ver si existía la biblioteca antes de realizar cualquier llamada, por lo que podría llenar el relevante preferencias de antemano. Aquí está el código que se me ocurrió para verificar.

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

Y luego verifico si com.google.android.maps está instalado.

0

Mediante el uso de adb, hasta imprime todas las bibliotecas del sistema:

adb shell cmd package list libraries 

Si su dispositivo es compatible con Google Maps, verá esta línea:

library:com.google.android.maps 
Cuestiones relacionadas