Programmation de composant mobiles aka Android Wies law Zielonka December 10, 2015
La taille et densité de l écran
Taille et densité Les tailles de l écran : small normal large xlarge Les densités : low(ldpi) medium(mdpi) high(hdpi) extra high(xhdpi) extra-extra-high (xxhdpi) extra-extra-extra-high (xxxhdpi) L orientation (landscape ou portrait) de l écran est considérée comme une variation de la taille de l écran.
Placer layouts pour les tailles différentes dans les répertoires différents : par exemple res/layout-taille res/layout-large res/layout sans suffixe contient les fichiers layout utilisés par défaut. Exemples: Le répertoire res/layout-land contient un layout pour l écran orienté dans le sens landscape. Le répertoire res/layout-port contient un layout pour l écran orienté dans le sens portrait. res/layout-sw600dp - smallestwidth - la taille minimale de l écran (peu importe si 600 est perceptible comme largeur ou hauteur).
Exemples de configurations 320dp téléphone, 600dp tablette taille 7, 720dp tablette taille 10. res/layout/main_activity.xml res/layout-sw600dp/main_activity.xml le premier fichier layout pour un téléphone, le deuxième pour une tablette. res/layout-xlarge-land/my_layout.xml //extra-large landsca res/layout/my_layout.xml //par defaut res/layout-large/my_layout.xml //large screen res/layout-xlarge/my_layout.xml //extra-large screen
Alias de fichiers layout Si le même layout utilisé pour les différentes configurations on peut utiliser un alias. 1 <?xml version= 1.0 encoding= utf 8?> 2 <merge> 3 <include lyout= @layout/main ltr. xml /> 4 </ merge> N oubliez pas de faire un layout par défaut.
Les fichiers bitmap Les fichiers bitmap doivent être adaptés à la taille de l écran. Générer la ressource en format vecteur et ensuite les bitmaps pour chaque densité avec l échelle correspondante : xhdpi 2.0 hdpi 1.5 mdpi 1.0 ldpi 0.75 Placer ces fichiers dans les répertoires ressources appropriés : res/drawable-xhdpi res/drawable-hdpi res/drawable-mdpi res/drawable-ldpi
Trouver la configuration Si on a une référence vers la classe Context : 1 Configuration configuration = 2 context. getresources (). getconfiguration (); Les attributs de Configuration : qui prend les valeurs : In Activity : orientation Configuration.ORIENTATION LANDSCAPE Configuration.ORIENTATION PORTRAIT 1 if ( configuration. orientation 2 == Configuration.ORIENTATION LANDSCAPE) { 3 }else{ //PORTRAIT 4 5 }
int screenlayout 1 switch( configuration. screenlyout & 2 Configuration.SCREENLAYOUT SIZE MASK){ 3 case Configuration.SCREENLAYOUT SIZE SMALL : 4 5 case Configuration.SCREENLAYOUT SIZE NORMAL : 6 7 case Configuration.SCREENLAYOUT SIZE LARGE : 8 10 9 case Configuration.SCREENLAYOUT SIZE XLARGE : 11 case Configuration.SCREENLAYOUT SIZE UNDEFINED : 12 13 }
Configuration D autres attributs de Configuration : int densitydpi int screenheightdp int screenwidthtdp
Détecter le changement de la configuration Si nous voulons que notre programme détecte le changement de la configuration (par exemple le changement d orientation) pour une activité donnée if faut spécifier les changement traité dans le code java dans le manifeste : 1 <activity android:name=. MyActivity 2 android:configchanges= 3 orientation screensize keyboardhidden 4 android:name= @string /app name /> Si la configuration (orientation/keyboard/screensize) changent l activité reçoit l appel à la méthode 1 void onconfigurationchanged( Configuration conf) où le paramètre conf est la nouvelle configuration. (A partir de Android 3.2 si l orientation change screensize change aussi).
Téléphonie
Téléphone exigé Si l application n est peut pas être utilisée sans téléphone alors indiquer que le téléphone est nécessaire dans AndroidManifest : 1 <uses feature android:name= android. hardware. telephony 2 android:required= true />
Vérification si le matériel téléphonique accessible 1 PackageManager pm = getpack ageman ager(); 2 boolean telephonysupported = 3 pm. hassystemfeature (PackageManager.FEATURE TELEPHONY);
Initier l appel téléphonique 1 Intent who = new Intent ( Intent.ACTION DIAL, 2 Uri. parse( tel :555 2368 )); 3 startactivity (who); démarre l activité qui permet d initier l appel. L utilisateur peut changer encore le numéro appelé (l appel ne démarre pas encore). Aucune permission nécessaire.
Lancer directement l appel téléphonique 1 Intent who = new Intent ( Intent.ACTION CALL, 2 Uri. parse( tel :555 2368 )); 3 startactivity (who); demarre directement l appel téléphonique. Permission nécessaire : 1 <uses permission 2 android:name= android. permission.call PHONE />
Accéder aux propriétés du téléphone et son état Récupérer telephonymanager : 1 TelephonyManager tm = 2 (TelephonyManager ) getsystemservice( 3 Context.TELEPHONY SERVICE);
Lire les détails de l appareil 1 String phonetypestr = unknown ; 2 int phonetype = telephonymanager. getphonetype (); 3 switch (phonetype) { 4 case (TelephonyManager.PHONE TYPE CDMA): 5 phonetypestr = CDMA ; 6 break ; 7 case (TelephonyManager.PHONE TYPE GSM) : 8 phonetypestr = GSM ; 9 break ; 10 case (TelephonyManager.PHONE TYPE SIP): 11 phonetypestr = SIP ; 12 break ; 13 case (TelephonyManager.PHONE TYPE NONE): 14 phonetypestr = None ; 15 break ; 16 default : break ; 17 }
Lire les détails de l appareil suite 1 // These require READ PHONE STATE uses permission 2 3 // Read the IMEI for GSM or MEID for CDMA 4 String deviceid = telephonymanager. getdeviceid (); 5 6 // Read the software version on the phone 7 // (note not the SDK version ) 8 String softwareversion = telephonymanager 9. getdevicesoftwareversion (); 10 11 // Get the phone s number ( if available ) 12 String phonenumber = telephonymanager 13. getline1number (); Sauf pour le type du téléphone il faut la permission : 1 <uses permission 2 android:name= android. permission.read PHONE STATE />
Les détails du réseau Quand l appareil connecté au réseau en utilisant TelephonyManager on peut lire : Mobile Country Code (MC), Mobile Network Code (MNC), le code ISO du pays, le nom du opérateur : 1 // Get connected network country ISO code 2 String networkcountry = telephonymanager 3. getnetworkcountryiso (); 4 // Get the connected network operator ID (MCC + MNC) 5 String networkoperatorid = telephonymanager 6. getnetworkoperator (); 7 // Get the connected network operator name 8 String networkname = telephonymanager 9. getnetworkoperatorname ();
Lire des détails de la carte SIM 1 int simstate = telephonymanager. getsimstate (); 2 switch (simstate ) { 3 case (TelephonyManager.SIM STATE ABSENT): break ; 4 case (TelephonyManager.SIM STATE NETWORK LOCKED): break ; 5 case (TelephonyManager.SIM STATE PIN REQUIRED): break ; 6 case (TelephonyManager.SIM STATE PUK REQUIRED): break ; 7 case (TelephonyManager.SIM STATE UNKNOWN): break ;
Lire des détails de la carte SIM (suite) 1 case (TelephonyManager.SIM STATE READY): { 2 // Get the SIM country ISO code 3 String simcountry = telephonymanager. getsimcountryiso (); 4 // Get the operator code of the active SIM (MCC + MNC) 5 String simoperatorcode = telephonymanager 6. getsimoperator (); 7 // Get the name of the SIM operator 8 String simoperatorname = telephonymanager 9. getsimoperatorname (); 10 // Requires READ PHONE STATE uses permission 11 // Get the SIM s serial number 12 String simserial = telephonymanager 13. getsimserialnumber (); 14 break ; 15 } 16 default : break ; 17 }
Surveiller les changements de l état du téléphone Permission READ PHONE STATE. Créer PhoneStateListener et enregistrer avec TelephonyManager en indiquant les évènements à surveiller. 1 telephonymanager. listen ( phonestatelistener, 2 PhoneStateListener.LISTEN CALL FORWARDING INDICATOR 3 PhoneStateListener.LISTEN CALL STATE 4 PhoneStateListener.LISTEN CELL LOCATION 5 PhoneStateListener.LISTEN DATA ACTIVITY 6 PhoneStateListener.LISTEN DATA CONNECTION STATE 7 PhoneStateListener.LISTEN MESSAGE WAITING INDICATOR 8 PhoneStateListener.LISTEN SERVICE STATE 9 PhoneStateListener.LISTEN SIGNAL STRENGTHS);
Supprimer le listener 1 telephonymanager. listen ( phonestatelistener, 2 PhoneStateListener.LISTEN NONE);
Surveiller les appels entrants Implémenter la méthode oncallstatechanged du PhoneStateListener : 1 PhoneStateListener callstatelistener = 2 new PhoneStateListener () { 3 public void oncallstatechanged( int state, 4 String numeroappelant) { 5 String callstatestr = Unknown ; 6 switch ( state ) { 7 case TelephonyManager.CALL STATE IDLE : 8 callstatestr = idle ; break ; 9 case TelephonyManager.CALL STATE OFFHOOK : 10 callstatestr = offhook ; break ; 11 case TelephonyManager.CALL STATE RINGING : 12 callstatestr = ringing. Incoming number is : 13 + incomingnumber; 14 break ; 15 default : break ; 16 } 17 Toast.makeText(MyActivity. this, 18 callstatestr, Toast.LENGTH LONG). show (); 19 }
Surveiller les appels entrants (suite) 1 telephonymanager. listen ( callstatelistener, 2 PhoneStateListener.LISTEN CALL STATE);
Le paramètre state une de constante de TelephonyManager : CALL_STATE_IDLE en repos, CALL_STATE_RINGING sonne, CALL_STATE_OFFHOOK en appel. L application doit être active pour intercepter les appels. (Sinon il faudra créer Intent Receiver.)
Utiliser IntentReceiver pour surveiller les appels entrants Si l état du téléphone change (appel entre, est accepté, terminé) TelephonyManager diffuse un intent ACTION_PHONE_STATE_CHANGED Enregistrer le receiver dans AndroidManifest : 1 <receiver android:name= PhoneStateChangedReceiver > 2 <intent filter> 3 <action android:name= 4 android. intent. action.phone STATE /> 5 </intent filter> 6 </receiver>
Utiliser IntentReceiver suite Intent diffusé contient deux extras : TelephonyManager.EXTRA_STATE avec une des valeurs TelephonyManager.CALL_STATE_* TelephonyManager.EXTRA_INCOMING_NUMBER dont la valeur est le numéro appelant (seulement si l état CALL_STATE_RINGING).
IntentReceiver exemple 1 public class PhoneStateChangedReceiver extends 2 BroadcastReceiver { 3 @Override 4 public void onreceive(context context, Intent intent ) { 5 String phonestate = intent 6. getstringextra (TelephonyManager 7.EXTRA STATE); 8 if (phonestate. equals (TelephonyManager 9.EXTRA STATE RINGING)) { 10 String phonenumber = intent 11. getstringextra (TelephonyManager 12.EXTRA INCOMING NUMBER); 13 Toast.makeText(context, 14 Incoming Call From: + phonenumber, 15 Toast.LENGTH LONG).show (); 16 } 17 } 18 }