¿Cómo puedo utilizar el código BitmapRegionDecoder en android 2.2.2 (Froyo)?
Estaba leyendo una respuesta a una pregunta diferente sobre SO, en la que @RomainGuy comentó que uno podría (por favor, corrija si estoy parafraseando incorrectamente) el código de back-port de versiones posteriores de android a versiones anteriores. En concreto, estoy interesado en el código de back-porting para BitmapRegionDecoder de Android versión 2.3.3 (Gingerbread) a la versión 2.2.2 (Froyo).
Preferiría preguntar más en general cuál es la mejor práctica / qué se debe evitar al volver a portar el código de versiones más recientes de Android a versiones anteriores, pero stackoverflow sugirió que mi pregunta podría ser cerrada como demasiado subjetiva.
- Dos animaciones con 1 segundo de retraso entre
- Android AudioRecord clase - proceso de mic audio en vivo rápidamente, configurar la función de devolución de llamada
- ¿Cómo puedo obtener el nombre del paquete del lanzador actual en android 2.3 y superior?
- Publicar el parámetro en el archivo PHP
- Obtener la latitud y la longitud basadas en ciudad, zip o nombre de calle
Tal vez si hay suficiente interés en el tema, esta pregunta podría ser "morphed" en una más general .. posiblemente un wiki de la comunidad?
En cualquier caso, agradecería cualquier penetración en cómo esto se hace … si es específico a mi caso de uso, o consejo más general. ¿Las llamadas a los métodos nativos dentro de la clase java complican el asunto (implicando necesariamente el NDK)?
Si de hecho es posible (y razonable) a cereza-escoger y back-port código de esta manera, creo que muchos encontrarían muy útil saber cómo.
- Runtime.exec no funciona
- Cargar archivos de android (java) a un servidor mediante PHP
- RxAndroid y Retrofit: No se puede crear el adaptador de llamada para io.reactivex.Observable <retrofit2.Response <okhttp3.ResponseBody >>
- Código de ejemplo de Android ToneGenerator
- Método startManagingCursor (cursor) obsoleto
- Convertir mm-dd-aaaa a aaaa-mm-dd
- Mostrar un snackbar en un evento de clic de menú en Android
- Obtención de resultados de año y mes resultantes extraños
Como @hackbod mencionado BitmapRegionDecoder
se basa en la biblioteca skia
externa. Sin embargo, puede ser un beneficio.
Examinemos la fuente original:
-
BitmapRegionDecoder.java
. Principalmente define envolturas alrededor de métodos nativos:private static native Bitmap nativeDecodeRegion(int lbm, int start_x, int start_y, int width, int height, BitmapFactory.Options options); private static native int nativeGetWidth(int lbm); private static native int nativeGetHeight(int lbm); private static native void nativeClean(int lbm); // ...multiply nativeNewInstance overloads follow
Class no utiliza ninguna API nueva de Java que necesitemos para backport.
-
BitmapRegionDecoder.cpp
. Los archivos de cabecera que incluye constan de los que están presentes enFroyo
excepto estos dos:-
AutoDecodeCancel.h
. La única línea que se utiliza en:AutoDecoderCancel adc(options, decoder);
Esta clase maneja el ciclo de vida de las instancias de
SkDecoder
. Es un pedazo pequeño de código y puede ser bien back-portado. -
SkBitmapRegionDecoder.h
Como el nombre de archivo indica que este es un componente central. De hecho, todos los anteriores eran una especie de envoltorios alrededor de él. La buena noticia es que tal vez no necesitemos volver a
Gingerbeard
ya que debería ser posible tomar una biblioteca deskia
delGingerbeard
y compilarla bajoFroyo
ya que es externa y no contiene nuevas dependencias.
-
PD En realidad no me sumerge profundamente en el código, así que por favor, corrija si hay algo que pasé por alto.
Actualizar:
El código fuente que necesitamos se encuentra en los repositorios siguientes en las ramas froyo-release
y gingerbread-mr4-release
:
- Repositorio externo de la biblioteca skia
- Los archivos de encabezado están en
include/core
einclude/images
- Los archivos de encabezado están en
- Base de framework de Android
- Código Java:
graphics/java/android/graphics/BitmapRegionDecoder.java
- Código nativo:
core/jni/android/graphics/...
- Código Java:
Puede volver a portar algún código, si puede existir en la parte superior del SDK al que va a portar.
No se puede back-port nada. Por ejemplo, no es posible realizar el back-port de una característica del kernel. 🙂
En este caso, no hay una solución fácil para volver a portar. La implementación de esto se encuentra en la parte superior de Skia y el decodificador jpeg, que son código nativo. Usted tendrá que hacer su propia aplicación de ese código. Usted podría intentar copiar / pegar el código de la plataforma, pegándolo con su código con JNI, pero ésta será una cantidad significativa de trabajo y le dejará con código nativo que usted necesita para continuar manteniendo.
Lo sentimos, no hay una solución fácil para esto.
Debe considerar BitmapRegionDecoderCompat , una versión de API 8+ del estándar BitmapRegionDecoder (API 10+).
Caracteristicas
- Funciona en modo "compat" en dispositivos que ejecutan API <10 usando un fallback básico de Java / Android (lo que significa que no será tan eficiente / rápido como la implementación de JNI nativa de API 10+, sino que evitará boilerplates feos y manual Fallbacks).
- Utiliza la implementación nativa de JNI cuando se ejecuta en la API 10+ .
- Agrega métodos adicionales como
decodeBestRegion()
, que extrae la "mejor" subregión de imagen dados sus parámetros (gravedad, tamaño). Este método también funciona en API <10.
Descargar
Para usarlo en su proyecto, puede descargarlo manualmente y agregar la biblioteca como un archivo AAR :
O puede agregar el dependecy en su build.gradle (requiere el repositorio jCenter ):
dependencies { //...your dependecies compile 'org.bonnyfone:brdcompat:0.1' }
Uso
Como se indica en los documentos, para poder migrar a BRDCompat basta con cambiar el nombre de la clase base de BitmapRegionDecoder
a BitmapRegionDecoderCompat
:
//BitmapRegionDecoder brd = BitmapRegionDecoder.newInstance(...); BitmapRegionDecoderCompat brd = BitmapRegionDecoderCompat.newInstance(...);
- ¿Cómo reinicio las tablas de clasificación de Google Play Games antes de publicarlas?
- Advertencia: la petición sin sesión necesita un token pero falta el ID de la aplicación o el token del cliente