versiones tengo studio saber que name minsdkversion como code cambiar anteriores java android

java - tengo - target version android



¿Cómo soportar múltiples versiones de Android en tu código? (8)

Hay muchos recursos que puede utilizar para ayudar a admitir varias versiones de Android.

  1. Lea esta publicación del blog here y luego lea esta here , lo ayudarán a resolver los problemas de soporte de la versión de nivel API.
  2. Lea this publicación de blog sobre el soporte de múltiples pantallas, especialmente cómo se analiza la jerarquía de activos en la carpeta res. Esto le ayudará a comprender y diseñar cómo hacer una estructura de carpetas de activos para admitir diferentes tamaños / densidades de pantalla y versiones de Android.
  3. Por último, escribe tus propios scripts de compilación personalizados para que puedas compilar con todas las versiones de Android.

El acceso a los contactos en android.jar de Android para las versiones 1.6 tiene People.CONTENT_URI para invocar información relacionada con los contactos, mientras que en versiones posteriores necesitamos tener soporte de api para RawContacts.CONTENT_URI.

Lo mismo es cierto para acceder al calendario, por ejemplo, ya que su URI se cambia en Android 2.2.

¿Existe una práctica recomendada para administrar todos los cambios diferentes sin agregar una aplicación adicional o compilar por separado para cada versión de cambios?


Hay un buen artículo en android.com al respecto: http://developer.android.com/resources/articles/backward-compatibility.html

Personalmente sugeriría la clase de contenedor o la solución de biblioteca de contenedor. Pero en casos pequeños, la reflexión debe estar bien (y en caso de que el rendimiento no sea un problema para usted).

Si necesitas más información, pregunta en los comentarios.


La mejor práctica (aunque no para Android, pero para J2ME), según mi conocimiento, es usar preprocesamiento de sentencias de estilo C / C ++, como:

//#if S40 ... //#else ... //#endif

Algunos IDE son compatibles con este tipo de preprocesamiento, por ejemplo, Netbeans. Que yo sepa, Eclipse tiene algunos complementos para habilitar también el preprocesamiento. Realmente no sé si son aplicables al desarrollo de Android. Intenta buscarte en google.


Para mi dinero, una muy buena respuesta es en http://android-developers.blogspot.co.uk/2010/07/how-to-have-your-cupcake-and-eat-it-too.html . Sin embargo, el ejemplo es un poco más complicado de lo necesario, por lo que, a continuación, se muestra un ejemplo de cómo afrontarlo cuando se crean notificaciones. La razón subyacente por la que esto funciona es una consecuencia de cómo los motores Java interpretan las clases: solo las mira cuando es necesario, por lo que si ajusta un código específico de la versión en una clase y lo crea cuando sabe que está usando esa versión, todo funciona. ...

Por lo que puedo decir, hay dos generaciones de enfoques para crear notificaciones y un cambio de nombre en el camino en el segundo. Así que eso da tres formas de hacerlo. Para cada forma, crea una clase con la generación de notificaciones en ella:

El primer acercamiento (usado a través de Gingerbread):

public class MyNotificationBuilderToGingerBread { Notification notification = null; MyNotificationBuilderToGingerBread(Context myContext, int icon, String ticker, String title, String info, Long timeStamp, PendingIntent pendingIntent, int flags) { notification = new Notification(R.drawable.ic_sb, ticker, timeStamp); notification.setLatestEventInfo(myContext, title, info, pendingIntent); notification.flags |= flags; } Notification get() { return notification; } }

El segundo enfoque, Honeycomb to IceCreamSandwich:

public class MyNotificationBuilderHoneyCombToIceCreamSandwich { Notification.Builder mb = null; MyNotificationBuilderHoneyCombToIceCreamSandwich(Context myContext, int icon, String ticker, String title, String info, Long timeStamp, PendingIntent pendingIntent, boolean onGoing) { mb = new Notification.Builder(myContext); mb.setSmallIcon(icon); mb.setContentIntent(pendingIntent); mb.setContentTitle(title); mb.setContentText(info); mb.setWhen(timeStamp); if (ticker != null) mb.setTicker(ticker); mb.setOngoing(onGoing); } Notification get() { return mb.getNotification(); } }

La segunda generación, con el cambio de nombre, Jellybean (en adelante, hasta ahora ...):

public class MyNotificationBuilderJellyBean { Notification.Builder mb = null; MyNotificationBuilderJellyBean(Context myContext, int icon, String ticker, String title, String info, Long timeStamp, PendingIntent pendingIntent, boolean onGoing) { mb = new Notification.Builder(myContext); mb.setSmallIcon(icon); mb.setContentIntent(pendingIntent); mb.setContentTitle(title); mb.setContentText(info); mb.setWhen(timeStamp); if (ticker != null) mb.setTicker(ticker); mb.setOngoing(onGoing); } Notification get() { return mb.build(); } }

Luego, solo tienes que elegir qué clase crear una instancia sobre la marcha:

// System information private final int sdkVersion = Build.VERSION.SDK_INT; // If you want to go really old: // (actually, there is a question about how this issue should be handled // systematically. Suggestions welcome.) // final int sdkVersion = Integer.parseInt(Build.VERSION.SDK); // This is for a permanent notification. Change the final argument (flags or boolean) if it isn''t meant ot be // For meaning of other variable, see notification documentation on the android website. if (sdkVersion < Build.VERSION_CODES.HONEYCOMB) { MyNotificationBuilderToGingerBread mnb = new MyNotificationBuilderToGingerBread(myContext, R.drawable.notification_icon, ticketText, title, infoText, timeStampMillis, pendingIntentForTapOnFullNotitifcation, Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR); notification = mnb.get(); } else if (sdkVersion < Build.VERSION_CODES.JELLY_BEAN) { MyNotificationBuilderHoneyCombToIceCreamSandwich mnb = new MyNotificationBuilderHoneyCombToIceCreamSandwich(myContext, R.drawable.notification_icon, ticketText, title, infoText, timeStampMillis, pendingIntentForTapOnFullNotitifcation, true); notification = mnb.get(); } else { MyNotificationBuilderJellyBean mnb = new MyNotificationBuilderJellyBean(myContext, R.drawable.notification_icon, ticketText, title, infoText, timeStampMillis, pendingIntentForTapOnFullNotitifcation, true); notification = mnb.get(); } // Send the notification. notificationManager.notify(idForNotificationManager, notification);

¡Espero que esto ayude!


Si en Eclipse, desde la versión 17 de ADT, puede especificar el código para ejecutar con alguna versión, simplemente como se describe en Lint API Check . La palabra clave es @TargetAPI (XX)

Espero eso ayude


Sinceramente, es un dolor.

Por lo general, solo aislo partes del código que son diferentes y accedo a ellas usando clases abstractas. Así que técnicamente creando diferentes versiones para diferentes sistemas operativos.

Pero hay otras maneras. El mejor que he visto involucra el uso de la reflexión.


Este es un gran artículo para cuando tienes que hacer una reflexión en Android (para admitir múltiples niveles de API).

Y cuando tiene que tener diferentes recursos para diferentes niveles de API, esta es la referencia a utilizar (consulte la sección "Versión de plataforma (nivel de API)").


  • Si realmente no necesita las nuevas funcionalidades, y realmente tiene que ser compatible con las versiones anteriores de Android, suéltelo. Cree su aplicación para la versión más antigua y no se moleste con este tipo de cosas.
  • En el otro caso, puede detectar la versión usando Build y usar la reflexión para cargar las clases que necesita. Se puede encontrar un ejemplo de eso en el código fuente de la aplicación K9Mail.