2011-02-02 9 views
7

Estoy desarrollando una aplicación que utilizaAndroid compatibilidad de código hacia atrás

android.hardware.Camera.parameters.getSupportedPictureSizes()

Esto sólo está disponible a partir de la versión 8 SDK y me gustaría para ser compatible con SDK 4, por lo que he hecho esto:

si (Build.VERSION.SDK_INT> = 8) {...}

Pero en el emulador, que las costuras que se trata de comprobar la referencia a esta función, y se produce un error:

02-02 11: 20: 10.930: ERROR/dalvikvm (1841): No se pudo encontrar método android.hardware.Camera $ Parameters.getSupportedPictureSizes, referenciado desde com.test.demo.CameraCustom.takeAPicture método

Cualquier idea acerca de cómo resolver este problema de compatibilidad hacia atrás?

He intentado utilizar inkocation con este fragmento de código dentro de surfaceChanged. Obviamente, el código funciona directamente sin invocación:

try{ 
    windowmanager_defaultdisplay_Rotation = getWindowManager().getDefaultDisplay().getClass().getMethod("getRotation"); 
    Log.v(MainMenu.TAG, "getRotation exist"); 
}catch(Exception e){ 
    Log.v(MainMenu.TAG, "getRotation dont exist"); 
} 

try{ 
    windowmanager_defaultdisplay_Rotation.invoke(null, null); 
    Log.v(MainMenu.TAG, "getRotation invoking ok, rotation "); 
}catch(Exception e){ 
    Log.v(MainMenu.TAG, "exception invoking getRotation "+e.toString()); 
} 

consigo "getRotation existe", pero luego "excepción invocando getRotation java.lang.NullPointerException

Cualquier idea

Respuesta

5

No se puede cargar el código que contiene.? llama al getSupportedPictureSizes() en API nivel 7 y anterior. Por lo tanto, debe tomar su decisión según Buildantes de cargar el código que contiene la instrucción dependiente de la versión.

Sus opciones incluyen:

  • Desactivar la opción de menú, botón, o lo que conduce a la actividad que utiliza getSupportedPictureSizes(), en base a nivel de la API
  • Uso carga de clase condicional o técnicas similares para cargar una aplicación adecuada basada a nivel de la API, donde el "implementación adecuada" utiliza getSupportedPictureSizes() sólo en el nivel API 8 o superior

Un ejemplo de la última técnica se puede ver en this sample project, donde apoyo cámaras hacia el frente en el nivel API 9, sin embargo, todavía se puede ejecutar en el viejo versiones de Android.

+0

Sí, creo que debería hacer algo como esto: http://developer.android.com/resources/articles/backward-compatibility.html, gracias! – zegnus

+0

Ok, el problema es que no puedo usar otra clase porque quiero usar getRotation() de getWindowManager(). GetDefaultDisplay(). GetRotation(), solo disponible en SDK> = 8. Así que he intentado usar invocación, pero arroja una excepción de puntero nulo, el código se muestra en mi mensaje original. – zegnus

3

Ok, la respuesta proporcionada por Commonsware es correcta, especialmente si estudias el excelente proyecto de muestra que proporcionó. Además, zegnus estaba en el camino correcto cuando señaló a http://developer.android.com/resources/articles/backward-compatibility.html

La clave para esto, sin embargo, que no es claro a partir de la otra respuesta, es que se necesita para compilar con la API que soporta las características que necesita. De lo contrario, obtienes errores. En el ejemplo de Commonsware, las cámaras orientadas hacia delante se admiten por primera vez en el nivel 9 de la API y esto es lo que debe especificar en su proyecto para que compile. Luego puede usar las otras técnicas descritas anteriormente para probar si el sistema operativo donde se ejecuta la aplicación realmente admite las clases y/o métodos que está tratando de usar.Si su aplicación se ejecuta en una versión anterior del sistema operativo, las llamadas generarán una excepción que podrá atrapar y tomar las medidas adecuadas para el sistema operativo anterior.

Para completar, aquí está el código que solía ser compatible con API 7 aunque compilé con API 8, que incluye ThumbnailUtils.

import com.Flashum.util.WrapThumbnailUtils; 

    public static Bitmap createVideoThumbnail(String filePath, int kind) { 
     try { 
     WrapThumbnailUtils.checkAvailable(); // will cause exception if ThumbnailUtils not supported 
     return WrapThumbnailUtils.createVideoThumbnail(filePath, kind); 
     } catch (Exception e) { 
     return null; 
     } 
    } 

package com.Flashum.util; 

import android.graphics.Bitmap; 
import android.media.ThumbnailUtils; 

// To be compatible with Android 2.1 need to create 
// wrapper class for WrapThumbnailUtils. 
public class WrapThumbnailUtils { 
    /* class initialization fails when this throws an exception */ 
    static { 
     try { 
     Class.forName("android.media.ThumbnailUtils"); 
     } catch (Exception ex) { 
     throw new RuntimeException(ex); 
     } 
    } 

    /* calling here forces class initialization */ 
    public static void checkAvailable() {} 

    public static Bitmap createVideoThumbnail(String filePath, int kind) { 
     return ThumbnailUtils.createVideoThumbnail(filePath, kind); 
    } 
} 
Cuestiones relacionadas