¿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.
- ¿Qué es la versión de Android Bundle y el código de versión y cómo se relacionan?
- ¿Qué versiones de Android SDK admiten la codificación en qué versiones de Java?
- ¿Cómo puedo comprobar la versión del sistema de Android?
- ¿Cómo puedo comprobar la versión del sistema de Android?
- Error de minSdkVersion al cargar APK en Android Market
¿Existe una manera de determinar la versión de la API de Open Mobile preinstalada? Si lo hay, ¿cómo puedo hacerlo?
- Versión de la versión nacional / regional del Panel de control de desarrolladores de Android
- ¿Por qué android.os.Build.VERSION_CODES funciona en plataformas más antiguas
- Cómo aprender qué versión de la aplicación instalada mediante programación en android
- PhoneGap Android obtiene el código de la versión de la aplicación
- Plugin de Gradle de Android-Herramientas
- ¿Cómo saber qué versión de ADT estamos utilizando en eclipse?
- Versión para Android de IntelliJ sdk
- Proyecto conectado a SVN que no muestra información de versión en eclipse
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
-
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.
-
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 } }
-
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:
-
Si su aplicación se compiló contra SEEK <4.0.0:
if (getVersion != null) { String version = (String)getVersion.invoke(seService); }
-
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.