Android: ¿puedo evitar que una clase Java (de una biblioteca externa) sea instanciada en tiempo de ejecución
El contexto:
Uso la mediación de AdMob para mostrar anuncios de banner en mi aplicación. Integré Millennial ad network SDK y Millennial AdMob adaptador.
- ADB no responde - Android Studio
- Desempaquetar o "liberar" un MappedByteBuffer bajo Android
- Error al resolver: Error: (23, 17) junit: junit: 4.12 en android studio 1.4
- Reconocimiento de voz a texto
- Android listviews: vistas de encabezado y pie de página
Problema: mi aplicación admite la API de Android 9+, mientras que Millennial SDK admite API 16+. Peor aún, en lugar de fallar con gracia (no devolver ningún anuncio a la capa de mediación de AdMob para que pueda continuar bajando por la cascada de mediación), el SDK se bloquea en dispositivos con Android <16 ( Fatal Exception: java.lang.NoSuchMethodError android.webkit.WebSettings.setAllowUniversalAccessFromFileURLs
)
Al parecer, los desarrolladores de Millennial no están planeando arreglar esto, recomiendan publicar 2 APKs distintos ("<16" sin su SDK y "16+" con su SDK), que es una solución problemática.
Preferiría una solución más sencilla: en los dispositivos que ejecutan la API de Android <16, me gustaría reproducir lo que sucede cuando falta un adaptador de AdMob: la mediación de AdMob sólo pasa a la siguiente red. Esto significaría descargar o borrar la clase de adaptador Millennial antes de instanciar el banner de mediación de AdMod.
La pregunta :
¿Hay alguna manera de evitar cualquier instantation futuro de una clase dada (desde una biblioteca de terceros) en tiempo de ejecución? (Por ejemplo, forzando una excepción ClassNotFound)
- Tengo que hacer clic dos veces en el botón para que funcione
- ¿Cómo inicializar firebase después del inicio de sesión de google de android?
- Oyente de ubicación en el servicio de fondo Android
- No se puede resolver el símbolo 'IOUtils'
- ¿Cómo resuelvo estos errores internos de Maven?
- Ver el almacenamiento en caché de encabezados y pies de página en una vista de lista
- La pantalla se oscurece y requiere una pulsación extra del botón de retroceso después de regresar de PreferenceActivity
- ClassNotFoundException con Parse y Facebook
Utilice dos bloques de anuncios. Puede configurar dos bloques de anuncios de banner en AdMob.com, uno con MillennialMedia en la pila de mediación y otro sin. A continuación, puede comprobar el nivel de API del dispositivo en tiempo de ejecución como sugiere Bonatti y establecer el ID de bloque de anuncios en su AdView según sea apropiado antes de solicitar anuncios.
Si MillennialMedia no está en la configuración de mediación para el bloque de anuncios que se utiliza, su adaptador no será instanciado por el SDK de anuncios para móviles de Google.
Estoy exactamente en la misma situación que tú.
Después de hacer un montón de investigación y magia negra con cargadores de clase, etc., he encontrado una solución sucia pero que funciona:
// At onCreate() or wherever it makes sense if (Build.VERSION.SDK_INT < 16) { // Must be done before requesting the first ad disableMMediaAdapter(); } m_adView.loadAd(adRequest); // ... private void disableMMediaAdapter() { try { Field fInitialized = MMSDK.class.getField("initialized"); fInitialized.setAccessible(true); fInitialized.set(null, true); } catch (Exception e) { e.printStackTrace(); } }
Engañando al SDK para que crea que se inicializará, fallará miserablemente cuando se solicite un anuncio a través de él y se llamará al próximo adaptador de mediación.
Esto funcionará siempre y cuando no cambien su clase desing demasiado.
¿Hay alguna manera de evitar cualquier instantation futuro de una clase dada en tiempo de ejecución? (Por ejemplo, forzando una excepción ClassNotFound)
Antes de cargar el adaptador, puede comprobar la versión del sistema operativo y si está por debajo de su umbral
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.THE_VERSION_I_WANT_MINIMUM) { // doStuffs() } else { throw new MyException("Stuffs have stuffened..."); }
- El cuadro de selección de dispositivos Android Wear dice "localhost offline: 4444 minSdk (API 20)> deviceSdk (API 1)"
- ¿Cuál es el tiempo de espera predeterminado de usar HttpGet y DefaultHttpClient?