¿Cómo puedo comprobar la versión de Open Mobile API en Android?

Por lo que entiendo, Open Mobile API se incluye con las ROMs de Android creadas por los fabricantes. Estamos usando un SDK que está utilizando fuertemente la API de Open Mobile, y descubrimos que algunos proveedores crean ROMs, donde la versión de la API de Open Mobile es incompatible con la versión de Android. Esto resulta en un desastre, que cuando intentamos utilizar el SDK mencionado, la aplicación se bloquea. Porque el SDK inicia un nuevo subproceso y se bloquea en él. Ni siquiera podemos poner toda la lógica en un bloque try-catch debido a todo esto se está ejecutando en un hilo separado.

Decidimos comprobar la versión de Android y la API de Open Mobile, y ver si son incompatibles, y si están, desactivar completamente la funcionalidad que lo requiere.

¿Existe una manera de determinar la versión de la API de Open Mobile preinstalada? Si lo hay, ¿cómo puedo hacerlo?

Eso depende de la versión que realmente quieras averiguar: la versión del componente del sistema SmartcardService o la versión del framework Open Mobile API.

Encontrar la versión de la aplicación del sistema SmartcardService

  1. La forma más obvia sería comprobar la información de versión del paquete de aplicación SmartcardService:

    final String SMARTCARD_SERVICE_PACKAGE = "org.simalliance.openmobileapi.service"; PackageInfo pi = getPackageManager().getPackageInfo(SMARTCARD_SERVICE_PACKAGE, 0); String versionName = pi.versionName; String versionCode = pi.versionCode; 

    Los valores típicos para versionName son "2.3.0" (versionCode = 1), "2.4.0" (versionCode = 3), "3.0.0" (versionCode = 4), "3.1.0" (versionCode = 5) y "4.0.0" (versionCode = 8). Por lo tanto, puede determinar la versión exacta de SEEK que el SmartcardService se bifurca de.

    Desafortunadamente, varios OEM (por ejemplo, Samsung) decidieron eliminar la información de la versión del paquete de aplicación. En consecuencia, esto no es tan fiable como uno podría esperar.

  2. Otro método que le permite distinguir entre las implementaciones basadas en las versiones SEEK <4.0.0 y las versiones SEEK> = 4.0.0 es comprobar el filtro de intenciones del componente SmartcardService:

     final String SMARTCARD_SERVICE_PACKAGE = "org.simalliance.openmobileapi.service"; final String SMARTCARD_SERVICE_CLASS = "org.simalliance.openmobileapi.service.SmartcardService"; final String SMARTCARD_SERVICE_ACTION_V4 = "org.simalliance.openmobileapi.BIND_SERVICE"; final String SMARTCARD_SERVICE_ACTION_PRE4 = "org.simalliance.openmobileapi.service.ISmartcardService"; Intent intent = new Intent(); intent.setClassName(SMARTCARD_SERVICE_PACKAGE, SMARTCARD_SERVICE_CLASS); intent.setAction(SMARTCARD_SERVICE_ACTION_V4); ResolveInfo ri = getPackageManager().resolveService(intent, 0); if (ri != null) { // is version >= 4.0.0 } else { intent.setAction(SMARTCARD_SERVICE_ACTION_PRE4); ResolveInfo ri = getPackageManager().resolveService(intent, 0); if (ri != null) { // is version < 4.0.0 } else { // is unknown version } } 
  3. Sin embargo, otro método que le permite distinguir entre SEEK <4.0.0 y SEEK> = 4.0.0 es comprobar si el SmartcardService tiene el permiso BIND_TERMINAL, un permiso introducido en SEEK 4.0.0:

     final String SMARTCARD_SERVICE_PACKAGE = "org.simalliance.openmobileapi.service"; final String PERMISSION_BIND_TERMINAL = "org.simalliance.openmobileapi.BIND_TERMINAL"; if (PackageManager.PERMISSION_GRANTED == getPackageManager().checkPermission(PERMISSION_BIND_TERMINAL, SMARTCARD_SERVICE_PACKAGE)) { // is version >= 4.0.0 } else { // is version < 4.0.0 } 

Cómo encontrar la versión del marco de API de Open Mobile

A partir de SEEK versión 4.0.0, la clase SEService del SEService Open Mobile API expone un método getVersion() que devuelve la cadena de versión de la especificación Open Mobile API implementada ("3.0" para SEEK 4.0.0). Por lo tanto, podría consultar ese método para encontrar la versión implementada de Open Mobile API:

 Class cls = org.simalliance.openmobileapi.SEService.class; Method getVersion = null; try { getVersion = cls.getDeclaredMethod("getVersion"); } catch (NoSuchMethodException e) {} if (getVersion != null) { // probably SEEK >= 4.0.0 } else { // probably SEEK < 4.0.0 } 

Además, si tiene una instancia del objeto SEService , puede invocar el método getVersion() para encontrar la versión implementada de la API de Open Mobile:

  1. Si su aplicación se compiló contra SEEK <4.0.0:

     if (getVersion != null) { String version = (String)getVersion.invoke(seService); } 
  2. Si su aplicación se compiló contra SEEK> = 4.0.0:

     if (getVersion != null) { String version = seService.getVersion(); } 

Tenga en cuenta que al intentar obtener una instancia de la clase SEService puede resultar exactamente el comportamiento no deseado que encontró en primer lugar, ya que el constructor de la clase SEService iniciará automáticamente la conexión al SmartcardService.

Similar a descubrir el método getVersion() , también podría intentar descubrir métodos en la API que son específicos de una determinada versión de la especificación Open Mobile API. Por ejemplo, se puede probar la existencia del método

 public Channel openBasicChannel(byte[] aid, byte p2); 

en la clase Session ( org.simalliance.openmobileapi.Session ). Este método se introdujo en la versión 3.0 de la especificación.

Sin embargo, debe saber que la detección basada en las clases de framework funcionará sólo si su aplicación utiliza las clases de framework API de Open Mobile que se envían con el dispositivo de destino y no empaqueta su propia versión de las clases de framework relevantes. De lo contrario, sólo detecta lo que ha incluido en su aplicación y no lo que está disponible en el sistema.

El marco de la API de Open Mobile que se preinstala en un dispositivo normalmente sería compatible con su backend (SMartcardService) en el mismo dispositivo. Dado que parece tener conflictos de versiones, es probable que su aplicación empaqueta su propia versión del framework Open Mobile API que es incompatible con la versión de Android de destino y el servicio de sistema de tarjeta inteligente instalado en el dispositivo de destino. Esto es algo que simplemente no debes hacer.

  • Compatibilidad de Open GL 2.0 vs 1.1 en Android
  • ¿Cómo se relaciona la versión Java de Android con una versión de Java SE?
  • ¿Para qué versión de Android debo desarrollar?
  • Nombre de la versión del kernel de Android
  • ¿Cómo puedo comprobar la versión del sistema de Android?
  • Qué versión de Eclipse usar con Android
  • Cambiar el número de versión de la base de datos SQLite
  • ¿Qué significa la versión MR?
  • Distribución histórica de las versiones de la plataforma Android
  • VersionCode vs versionName en el manifiesto de Android
  • Versión errónea keystore al hacer llamadas https
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.