¿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.

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.

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 en Froyo 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 de skia del Gingerbeard y compilarla bajo Froyo 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 e include/images
  • Base de framework de Android
    • Código Java: graphics/java/android/graphics/BitmapRegionDecoder.java
    • Código nativo: core/jni/android/graphics/...

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 :

Descargar

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 recortar un java stringbuilder?
  • Control de la intensidad de vibración en los teléfonos Android? ¿Es posible?
  • Android Bitmap / Desplazamiento de lienzos después de la escala
  • Logcat rellenado con java.io.IOException: Mensajes de rechazo de conexión
  • Establecer gravedad de una vista mediante programación
  • Android Velocidad basada en valores de acelerómetro
  • Convex Hull en Java Android Opencv 2.3
  • Importación de la biblioteca de Facebook en Android Studio: No se pudo encontrar la propiedad 'ANDROID_BUILD_SDK_VERSION'
  • Validación de esquemas XML en Android
  • Proguard Error / Dalvik Error 1 al firmar la aplicación para Android
  • Cómo reproducir archivos mp3 de la tarjeta SD interna y externa en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.