En Android tengo la versión del SDK fácilmente (Build.VERSION.SDK
) pero necesito utilizar LabeledIntent sólo si la plataforma es más reciente que 1,6 (>Build.VERSION_CODES.DONUT
)Android: cómo codificar según la versión de la API?
supongo que la reflexión es necesaria (He leído this link pero es no está claro para una clase o para mí).
Este es el código pero me da una excepción porque en mi Android 1.6, el compilador verifica si existe el paquete, aun cuando la condición no se aplica:
Intent theIntent=....;
if(Integer.parseInt(Build.VERSION.SDK) > Build.VERSION_CODES.DONUT)
{
try{
Intent intentChooser = Intent.createChooser(intent,"Choose between these programs");
Parcelable[] parcelable = new Parcelable[1];
parcelable[0] = new android.content.pm.LabeledIntent(theIntent, "", "Texto plano", 0);
intentChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, parcelable);
activity.startActivity(intentChooser);
}
catch(Exception e)
{
activity.startActivity(theIntent);
}
} else
{
activity.startActivity(intentMedicamento);
}
cómo resolví, algunos NOTAS A LA RESPUESTA CORRECTA
@Commonsware muéstrame la manera de hacerlo. Creamos una clase puente para que, dependiendo del nivel de API, ejecute una clase que use un nivel API u otra clase que use otro nivel API. El único detalle que un principiante podría olvidar es que tiene que compilar su aplicación con el último SDK que está listo para hacer referencia.
public abstract class LabeledIntentBridge {
public abstract Intent BuildLabeledIntent(String URL, Intent theintent);
public static final LabeledIntentBridge INSTANCE=buildBridge();
private static LabeledIntentBridge buildBridge() {
int sdk=new Integer(Build.VERSION.SDK).intValue();
if (sdk<5) {
return(new LabeledIntentOld());
}
return(new LabeledIntentNew());
}
}
Así que en el LabeledIntentNew
, que incluía todo el código que se refiere a LabeledIntent
sólo está disponible en nivel de la API 5. En LabeledIntentOld
, puedo implementar otro tipo de control, en mi caso vuelvo la intención sí mismo sin hacer nada Más.
La llamada a esta clase se hace así:
LabeledIntentBridge.INSTANCE.BuildLabeledIntent(URLtest,theIntent);
¿Qué versión de marco está utilizando en su proyecto? – Flo
@ Flo.- Mi AndroidManifest define minSdkVersion = "4". LabeledIntent solo está incluido en el SDK de API LEVEL 5 en. – netadictos
Sí, pero ¿qué versión de framework está usando realmente en su proyecto? minSdkVersion es solo metainformación en el archivo de manifiesto. Cuando creó su proyecto, debería haber seleccionado una versión de marco en el cuadro de diálogo de creación. – Flo