Autore Topic: SDK e compatibilità  (Letto 3882 volte)

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
SDK e compatibilità
« il: 25 Gennaio 2011, 14:00:55 CET »
0
Ho letto il topic in evidenza però non ho capito bene delle cose...
Nella mia applicazione utilizzo il ContentProvider ContactsContract che come ben sapete è stato inserito dalla 2.0 in poi perchè prima c'era il contentprovider ContactsPhones. Quindi diciamo che se nel Manifest della mia applicazione metto come minSDK 5 (corrispondente alla 2.0) e come targetSDK 9 (corrispondente alla 2.3) dovrebbe significare che va bene dalla 2.0 in poi..giusto ? (correggetemi se sbaglio).

La mia domanda è : Se volessi renderla compatibile anche con gli SDK precedenti come e cosa dovrei fare ?

Perchè potrei utilizzare anche il ContentProvider ContactsPhones però se poi lo smartphoone su cui viene installata l'applicazione ha froyo che succede ???

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:SDK e compatibilità
« Risposta #1 il: 25 Gennaio 2011, 14:06:19 CET »
0
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:SDK e compatibilità
« Risposta #2 il: 25 Gennaio 2011, 14:55:09 CET »
0
No questo no....ammazza però è un casino sta reflection o sbaglio ?  :-X

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:SDK e compatibilità
« Risposta #3 il: 25 Gennaio 2011, 16:32:39 CET »
0
Potresti usare un metodo come questo per identificare l'api level (non l'ho testato ma ad occhio dovrebbe funzionare):

Codice (Java): [Seleziona]
package com.marcoduff.androidtest;

public class ApiLevel {
        public static final int getRuntimeApi() {
                try {
                        // Test API level 1
                        Class.forName("android.media.AudioManager");
                } catch (ClassNotFoundException e) {
                        return 0;
                }
                try {
                        // Test API level 3
                        Class.forName("android.widget.SlidingDrawer");
                } catch (ClassNotFoundException e) {
                        return 2;
                }
                try {
                        // Test API level 4
                        Class.forName("android.accessibilityservice.AccessibilityService");
                } catch (ClassNotFoundException e) {
                        return 3;
                }
                try {
                        // Test API level 7
                        Class.forName("android.telephony.SignalStrength");
                } catch (ClassNotFoundException e) {
                        return 4;
                }
                try {
                        // Test API level 8
                        Class.forName("android.media.CamcorderProfile");
                } catch (ClassNotFoundException e) {
                        return 7;
                }
                try {
                        // Test API level 9
                        Class.forName("android.app.DownloadManager");
                } catch (ClassNotFoundException e) {
                        return 8;
                }
                return 9;
        }
}

Una volta trovato l'api level, tramite un gioco di interfacce java instanzi la classe opportuna:
Codice (Java): [Seleziona]
package com.marcoduff.androidtest;

public class Demo {
        public void do() {
                MyInterface myInterface;
                int apiLevel = ApiLevel.getRuntimeApi();
                if(apiLevel==4) myInterface= new ConcreteClassLevel4();
                else if(apiLevel==7) myInterface= new ConcreteClassLevel7();
                else if(apiLevel==8) myInterface= new ConcreteClassLevel8();
                else if(apiLevel==9) myInterface= new ConcreteClassLevel9();
                else myInterface= null;
        }
}

Secondo il mio punto di vista questo è il modo più pulito per programmare in multi-api-mode!




...il punto è: ma ne vale la pena???

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:SDK e compatibilità
« Risposta #4 il: 25 Gennaio 2011, 17:07:46 CET »
0
...il punto è: ma ne vale la pena???

Ma infatti lo stavo per chiedere....secondo voi ne vale la pena? Come vi comportate con le vostre app???

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:SDK e compatibilità
« Risposta #5 il: 25 Gennaio 2011, 17:13:46 CET »
0
oppure si puo usare
Codice (Java): [Seleziona]
if(android.os.Build.VERSION.SDK_INT == (oppure <)  android.os.Build.VERSION_CODES.ECLAIR) (oppure CUPCAKE/DONUT/ECLAIR/FROYO ecc)
....
...il punto è: ma ne vale la pena???
infatti.. Platform Versions | Android Developers

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:SDK e compatibilità
« Risposta #6 il: 25 Gennaio 2011, 17:19:01 CET »
0
Non conoscevo la costante android.os.Build.VERSION.SDK_INT, questa racchiude (nonché annulla) la mia funzione getRuntimeApi. Il resto (la parte dell'interfaccia con le classi concrete) ovviamente resta.

Ed appoggio il link di Qlimax... partire dall'API level 5 significa buttare fuori "soltanto" il 10% degli utenti... dipende da un punto di vista soggettivo dire se sono molti o pochi!

Offline Daystrom

  • Utente junior
  • **
  • Post: 90
  • Respect: +13
    • Mostra profilo
    • Starfleet
  • Dispositivo Android:
    HTC Magic + HTC Desire HD + Nexus S
  • Play Store ID:
    Daystrom
  • Sistema operativo:
    WXP
Re:SDK e compatibilità
« Risposta #7 il: 25 Gennaio 2011, 17:26:02 CET »
0
Occhio perchè mi pare di ricordare che se android.os.Build.VERSION.SDK_INT viene usata su una versione android 1.5 manda in crash l'applicazione.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:SDK e compatibilità
« Risposta #8 il: 25 Gennaio 2011, 17:31:21 CET »
0
Occhio perchè mi pare di ricordare che se android.os.Build.VERSION.SDK_INT viene usata su una versione android 1.5 manda in crash l'applicazione.

Infatti quella costante è disponibile dalle api level 4... (quindi per le api level < 3 usate il mio metodo di sopra, altrimenti restituite questa tramite reflection).

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:SDK e compatibilità
« Risposta #9 il: 25 Gennaio 2011, 17:33:58 CET »
0
giusto
si può usare android.os.Build.VERSION.SDK  che è deprecata ma compatibile con tutte le api level.
è una stringa, quindi va convertita in intero

Edit:
Anche
Build.VERSION_CODES   è dispobibile per api level >4

Quindi bisogna mettere "hardcoded" gli interi per comparare. oppure le stringhe se non si vuole converire Build.VERSION.SDK in intero
« Ultima modifica: 25 Gennaio 2011, 17:40:24 CET da Qlimax »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:SDK e compatibilità
« Risposta #10 il: 25 Gennaio 2011, 17:45:12 CET »
0
Ed appoggio il link di Qlimax... partire dall'API level 5 significa buttare fuori "soltanto" il 10% degli utenti... dipende da un punto di vista soggettivo dire se sono molti o pochi!

Quel 10% è una percentuale in un certo senso fasulla.

Viene ricavata dagli accessi al market, che ovviamente sono pochi per i cellulari con api level <5, dato che ci sono pochissime applicazioni che li supportano. Io stesso, col Galaxy S accedo un giorno si e uno no al market, con il Tattoo saranno 6 mesi che non lo faccio, perchè ci sono sempre meno app per quel device. Mentre non si deve scordare che sono tutt'ora in vendita dispositivi con l'1.6 .

Rimane comunque più che lecito non fare la "fatica" di continuare a supportarli.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:SDK e compatibilità
« Risposta #11 il: 25 Gennaio 2011, 17:55:56 CET »
0
Questo codice risolve tutti i problemi  8-)
Codice (Java): [Seleziona]
package com.marcoduff.androidtest;

import java.lang.reflect.Field;

public class ApiLevel {
        public static final int getRuntimeApi() {
                try {
                        // Test API level 1
                        Class.forName("android.media.AudioManager");
                } catch (ClassNotFoundException e) {
                        return 0;
                }
                try {
                        // Test API level 3
                        Class.forName("android.widget.SlidingDrawer");
                } catch (ClassNotFoundException e) {
                        return 2;
                }
                try {
                        // Test API level 4
                        Class<?> buildVersionClass = Class.forName("android.os.Build$VERSION");
                        Field field = buildVersionClass.getField("SDK_INT");
                        Integer apiLevel = (Integer)field.get(null);
                        return apiLevel.intValue();
                } catch (ClassNotFoundException e) {
                        return 3;
                } catch (Exception e) {
                        return 0;
                }
        }
}

N.B. Ovviamente il risultato 0 non rientra mai tra i possibili... ma mai dire mai!  :-o

Riallacciandomi a bradipao, vorrei fondare il gruppo "Bruciamo i terminali API Level < 5", anche se secondo il mio punto di vista le case produttrici che non hanno aggiornato i terminali (caso eclatante per me sono il Tatoo, Sony Ericsson e Motorola) dovrebbero ritirarli fornendo incentivi ai possessori per l'acquisto di terminali più evoluti ed aggiornati.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:SDK e compatibilità
« Risposta #12 il: 25 Gennaio 2011, 17:59:36 CET »
0
Questo codice risolve tutti i problemi  8-)
Codice (Java): [Seleziona]
package com.marcoduff.androidtest;

import java.lang.reflect.Field;

public class ApiLevel {
        public static final int getRuntimeApi() {
                try {
                        // Test API level 1
                        Class.forName("android.media.AudioManager");
                } catch (ClassNotFoundException e) {
                        return 0;
                }
                try {
                        // Test API level 3
                        Class.forName("android.widget.SlidingDrawer");
                } catch (ClassNotFoundException e) {
                        return 2;
                }
                try {
                        // Test API level 4
                        Class<?> buildVersionClass = Class.forName("android.os.Build$VERSION");
                        Field field = buildVersionClass.getField("SDK_INT");
                        Integer apiLevel = (Integer)field.get(null);
                        return apiLevel.intValue();
                } catch (ClassNotFoundException e) {
                        return 3;
                } catch (Exception e) {
                        return 0;
                }
        }
}

N.B. Ovviamente il risultato 0 non rientra mai tra i possibili... ma mai dire mai!  :-o

Riallacciandomi a bradipao, vorrei fondare il gruppo "Bruciamo i terminali API Level < 5", anche se secondo il mio punto di vista le case produttrici che non hanno aggiornato i terminali (caso eclatante per me sono il Tatoo, Sony Ericsson e Motorola) dovrebbero ritirarli fornendo incentivi ai possessori per l'acquisto di terminali più evoluti ed aggiornati.

concordo, e lo stesso dovrebbe fare HTC con il mio hero, cacchio,fanno froyo per il legend che è UGUALE...
io ormai se programmo programmo dalla 2.1 in poi, tanto fin'ora non ho pubblicato niente, ma ritengo che tra un'anno la maggior parte delle migliori app saranno 2.2+ (vedi gmail nuovo)
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Daystrom

  • Utente junior
  • **
  • Post: 90
  • Respect: +13
    • Mostra profilo
    • Starfleet
  • Dispositivo Android:
    HTC Magic + HTC Desire HD + Nexus S
  • Play Store ID:
    Daystrom
  • Sistema operativo:
    WXP
Re:SDK e compatibilità
« Risposta #13 il: 25 Gennaio 2011, 18:12:21 CET »
0
Riallacciandomi a bradipao, vorrei fondare il gruppo "Bruciamo i terminali API Level < 5", anche se secondo il mio punto di vista le case produttrici che non hanno aggiornato i terminali (caso eclatante per me sono il Tatoo, Sony Ericsson e Motorola) dovrebbero ritirarli fornendo incentivi ai possessori per l'acquisto di terminali più evoluti ed aggiornati.

Personalmente sono contento di HTC, ho ricevuto l'aggiornamento froyo sul mio vecchio magic...  8-) 8-) 8-)

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:SDK e compatibilità
« Risposta #14 il: 25 Gennaio 2011, 18:23:48 CET »
0
concordo, e lo stesso dovrebbe fare HTC con il mio hero, cacchio,fanno froyo per il legend che è UGUALE...
io ormai se programmo programmo dalla 2.1 in poi, tanto fin'ora non ho pubblicato niente, ma ritengo che tra un'anno la maggior parte delle migliori app saranno 2.2+ (vedi gmail nuovo)
Mettici la CyanogenMod su quell'Hero, che è pure AOSP (che per sviluppare è sicuramente una scelta migliore rispetto alla Sense).
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !