mardi 25 juin 2013

Créer un pseudo timer sous Android

Pour exécuter un petit traitement à intervalles de temps régulier :


static final int TIMING = 1000; // durée en ms

TextView tv = (TextView)findViewById(R.id.textview1);

Handler h = new Handler();
final Runnable r = new Runnable()
{
   public void run()
   {
      // traitement ici
      // code
      tv.append("Salut !\n");

      // Relance l'opération
      h.postDelayed(this, TIMING);
   }
}

// On lance une première fois :
h.postDelayed(r, TIMING);

Handler et Runnable vs AsyncTask

Afin de ne pas pénaliser le thread de l'interface utilisateur (UI Thread), il est impératif de créer un thread séparé pour tous les traitements longs.
C'est a tel point important qu'une tentative de lancement d'un socket sur le thread principal provoquera l'exception NetworkOnMainThreadException.

Handler et Runnable

Il faut savoir que l'utilisation de la méthode Handler.post() ne crée pas de nouveau thread en arrière plan. Ce qui signifie qu'on ne peut pas utiliser de Handler pour lancer un service d'écoute réseau par exemple.  

  Handler handler = new Handler();
  final Runnable r = new Runnable()
  {
   public void run()
   {
          tv.append("Serveur d'écoute activé");
          // ... Lancement du socket d'écoute ici...
   }
  };
  handler.post(r);
Avec ce code, donc, point de salut. Même si c'est beau et facile, ça ne marchera pas. Le lancement du socket provoquera une exception NetworkOnMainThreadException. Car si vous utilisez un Handler, votre Runnable sera juste placé dans la file des messages et sera exécuté dès que possible sur le thread dans lequel il se trouve (probablement le thread principal).

Classe AsyncTask

La solution la plus généralement encouragée est celle de l'emploi de la classe AsyncTask, qui est vraiment lancée dans un nouveau thread. Elle permet également de suivre l'évolution de la tâche ainsi que de récupérer facilement le résultat de l'opération. Il faudra simplement créer une nouvelle classe qui héritera de AsyncTask (extends). Quelques règles doivent toutefois être respectées :

  • La classe AsyncTask doit impérativement être chargée sur le UI Thread
  • L'instance de la tâche doit être créée sur le UI Thread
  • la méthode execute(Params...) doit être invoquée sur le UI Thread
  • Ne pas exécuter manuellement onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)
  • La tâche ne peut être exécutée qu'une seule fois. Si on tente de l'exécuter une seconde fois, une exception sera lancée.

Ce qu'on peut retenir

  • La classe Runnable permet juste de préparer un bout de programme qu'on souhaite exécuter plus tard. 
  • Si on lance un Runnable avec un Handler, le Runnable sera exécuté sur le thread en court. On pourra utiliser cette méthode pour réaliser un 'timer', mais attention que le traitement ne soit pas trop long si vous êtes sur le UI Thread !
  • Si on lance un Runnable avec un Thread... le Runnable sera exécuté sur le nouveau thread.
  • La classe AsyncTask permet de réaliser un traitement en arrière-plan, dans un nouveau thread. 

dimanche 16 juin 2013

Désimlocker réellement gratuitement un téléphone mobile

Cet article est écrit d'après mon expérience sur le 'désimlockage' d'un BlackBerry Curve 8520 mais les principes généraux et les concepts sont certainement transposables à d'autres modèles. Il m'a permis de faire économiser les frais de désimlockage en boutique à une amie. J'espère qu'il vous permettra de faire quelques économies sans vous faire arnaquer. 
Agissez toutefois avec prudence, car vos actions sont sous votre entière responsabilité, y compris si vous détériorez votre téléphone par une manipulation hasardeuse.


Introduction

Il arrive parfois que votre opérateur se montre indélicat lorsque vous passez à la concurrence et qu'après avoir résilié votre ligne, il vous indique qu'il ne pourra pas désimlocker votre téléphone (rendre le téléphone compatible avec les autres opérateurs) avant que ne vous lui ayez envoyé une demande écrite avec votre code IMEI, ce qui peut prendre jusqu'à une quinzaine de jours ! (Citons quand même SFR, adepte de cette pratique méprisable, pour leur faire une publicité méritée).

Vous voilà donc injoignable, alors que vous aviez certainement l'espoir que cette opération serait rapide...

Vous avez donc quelques solutions :

  • Envoyer le courrier à votre opérateur et attendre son bon vouloir.
    • C'est gratuit, mais c'est contraignant et long
  • Vous rendre dans une boutique spécialisée qui fera le travail contre paiement
    • C'est sûr, cette méthode fonctionne. Si vous êtes le genre de pigeon qui aime payer pour un service qui devrait être gratuit, cette solution est pour vous ! Il faut juste savoir qu'ils utilisent souvent des outils obtenus gratuitement sur le net pour faire ça.
  • Aller sur le net français pour trouver une solution ... contre paiement
    • Toujours pareil. Le service est payant. Je ne suis d'ailleurs pas parvenu à trouver une information claire sur ce sujet. Les sites francophones qui proposent ce service fonctionnent très bien en raison du fait que le français de base est mauvais en anglais et le revendique. Donc il paye, parce qu'il croit que c'est la seule solution.
  • Aller sur le net anglophone pour trouver une solution gratuite 
    • C'est de cette manière que les sites et boutiques payants obtiennent souvent leurs informations. J'ai pu trouver quelques outils et informations. Cela a fonctionné (c'était assez simple, mais on passe pour un super-héro très facilement)

Théorie

Comprendre le principe de desimlockage

Le principal inconvénient du desimlockage, c'est qu'il nécessite un code MEP de desimlockage. Ce code est calculé selon un obscur algorithme qui se base sur le code IMEI du téléphone et la signature  'MEP de l'opérateur' (que j'appellerai parfois MEP-Opérateur pour la distinguer du code MEP de désimlockage). 
Cela veut donc dire que le code de désimlockage est différent pour chaque téléphone. C'est ce qui rend d'ailleurs le service de désimlockage très lucratif pour les boutiques spécialisées.

Théoriquement il suffit donc d'avoir en sa possession son code IMEI, la signature MEP-Opérateur et le programme de calcul approprié.

Obtenir le code IMEI

Le code IMEI s'obtient d'une des manières suivantes :
  • Consulter la boite du téléphone
  • Consulter l'autocollant figurant souvent sous le cache de la batterie
  • Taper le numéro de téléphone *#06# sur l'écran d'appel
  • Consulter le menu 'A propos du téléphone' sur les smartphones Android

Obtenir la signature MEP de l'opérateur

Il semble, d'après ma maigre expérience que les signatures MEP des opérateurs soient différentes en fonction du fabricant du téléphone. 
J'ai pu trouver sur un forum une liste assez détaillée des signatures MEP des opérateurs valable pour les blackberry ici. En voici une petite liste extraite avec quelques opérateurs français :
MEP-05277-005 SFR FRANCE
MEP-05277-004 SFR Vodafone
MEP-07723-001 ORANGE FRANCE
MEP-07723-005 orange francia
MEP-08918-001 BOUYGUES FRANCE

Trouver le programme de calcul de clé MEP

Google est votre ami : "MEP code calculator" (paramétrer la recherche pour obtenir les résultats de recherche ANGLAIS)

Exemple pratique - Blackberry Curve 8520 chez SFR

Le calculateur que j'ai utilisé est le "BlackBerry Codes Calculator by y3kt v1.7.1 - Free version"
J'en ai trouvé une version ici.

Il faut lancer le programme, aller dans l'onglet Code calculator. On saisit le code IMEI du téléphone, le code MEP-05277-005 de SFR France. On clique "Calculate code" et on obtient le code MEP2 attendu.

Seul le code MEP2 est utile, mais le programme propose plus d'options

Ensuite aller dans Options, Options avancées, Carte SIM.
Lorsque vous êtes sur l'écran carte SIM, tapez sur votre clavier le code secret "MEP2" (sans les guillemets, en veillant bien aux majuscules). Si vous vous y êtes bien pris, vous devez voir apparaître une zone de saisie. Il ne vous reste qu'à taper le code MEP2 obtenu avec le calculator. Un message "code accepté" doit confirmer la réussite de l'opération.

Conclusion

Voilà donc un moyen d'éviter les démarches longues ou coûteuses. Les voleurs de téléphones connaissent évidemment ces techniques depuis longtemps, donc pourquoi pas nous, qui avons payé honnêtement nos téléphones et qui sommes toujours pris pour de bonnes vaches à lait. J'espère que ça vous servira.

vendredi 24 mai 2013

Périphérique android non reconnu par ADB sous Windows 8

Alors que tout fonctionne bien sous Windows 7, il est difficile de développer des applications Android en environnement Eclipse. En cause : Le pilote USB ADB ne s'installe pas lors de l'installation du SDK Android.

Pour remédier à ce problème, il faut installer manuellement le pilote ADB disponible à l'adresse suivante :

Branchez ensuite votre périphérique. Le programme d'installation doit détecter votre matériel. Il ne vous reste qu'à le sélectionner et à cliquer sur "install". Vous devez théoriquement recevoir une alerte de la part de Windows 8 relative à la non reconnaissance du driver. Vous pouvez toutefois installer ce pilote.

mercredi 3 avril 2013

Virtualbox : Ubuntu 64 bits sur un hôte Windows 8

Introduction

J'ai eu pas mal de difficultés ces derniers temps à faire fonctionner une machine virtuelle Ubuntu 64 bits sur mon ordinateur portable Windows 8 Pro.

Lors de la tentative d'installation d'un Ubuntu 64 bits, j'obtenais systématiquement l'erreur suivante :
"This kernel requires an x86-64 cpu but only detected an i686 cpu". Je m'étais donc rabattu par défaut sur des Ubuntu 32 bits sans prendre vraiment le temps de chercher la cause du problème.

Investigations

Pourtant j'aurais pu comprendre en cherchant un peu : je n'avais aucun problème à installer mes VM 64 bits lorsque je tournais sur ce portable avec Windows 7. Cela ne provenait donc pas d'une erreur de paramétrage du BIOS, sur lequel il faut vérifier que la fonction VT-x est activée (elle l'était).

C'était donc bien un problème avec Windows 8. Et plus particulièrement avec une nouvelle fonctionnalité de ce système : Hyper-V. Pour les plus impatients, il faut simplement désactiver la fonctionnalité Hyper-V pour que la détection des fonctions VT-x se fassent correctement.

Hyper-V est la technologie phare de Microsoft pour la virtualisation. Elle succède techniquement à VirtualPC, mais repose maintenant sur une architecture server plus semblable à ce que propose VMWare avec ESX.

Comment désactiver Hyper-v :

Il faut aller dans le panneau de configuration -> Programmes -> Activer ou désactiver des fonctionnalités Windows. Il suffit alors de décocher Hyper-V et de redémarrer l'ordinateur.

Conclusion

Même si cette solution permet de résoudre le problème de l'installation d'une VM 64 bits sur Virtualbox, cela pose toutefois la question de la cohabitation d'Hyper-V avec Virtualbox... Je n'ai pas de réponse à cette question pour le moment...

Au passage, la solution était disponible sur Google en faisant une recherche sur les termes "VT-x Windows 8", mais la seule réponse pertinente selon moi était en anglais : http://superuser.com/questions/500166/intel-vt-x-disappeared-after-upgrading-to-windows-8. Une raison de plus pour se mettre à l'anglais ;) ...


dimanche 7 août 2011

Prendre la main sur mon iPhone en SSH

Quelques informations rapides.

Il est possible de prendre la main en SSH sur un iPhone jailbraké.

Dans cydia, choisir l'installation d'OpenSSH.

Pour prendre la main sur le téléphone, j'ai récupéré son adresse MAC (dans configuration>général>informations>adresse Wifi)

Sur mon routeur freebox, j'ai associé cette mac adress à une adresse IP fixe.

Ensuite aucun problème pour accéder à l'iPhone en SSH en utilisant le logiciel Putty.

Login : root
Password : alpine

C'est la première étape pour pouvoir installer des applications .app dans le répertoire application.
J'espère pouvoir y déposer mes applications sans avoir à payer 79$ par an... (Merci Apple ! :( )

... on va bien voir...

mercredi 9 mars 2011

Developpement Android - Visualiser sa base SQLite depuis son mobile

Lorsqu'on développe une application Android qui fait intervenir une base de données, on souhaite parfois visualiser ce qui est enregistré sans devoir développer immédiatement l'Activity qui permettra la consultation (en admettant qu'il soit prévu d'en faire une, ce qui est loin d'être sûr)

Je vous fait part de la solution que j'ai trouvée au fil de mes recherches :
  • - installer un client SQLite - AndSQLite, disponible sur le market m'a bien convenu. MAIS ce logiciel necessite des droits d'administrateur (root) pour fonctionner. Je ne voulais pas rooter mon téléphone, donc j'ai installé un autre logiciel qui autorise ponctuellement le passage en root :
  • - donc installer VISIONary + par exemple (sur le market gratuit aussi), qui installe également Super-Utilisateur.
  • - enfin, et ce n'est pas rien, il faut bien penser à nommer sa base avec une extension .db pour que AndSQLite la référence et en permette l'ouverture. Ce nommage se fait dans le code de l'application en principe, lors de la création de la base.

Il existe d'autres solutions, plus simples à l'usage mais qui nécessitent de Rooter le téléphone... Ce que certains hésitent à faire compte tenu des risques (parfois) de tout casser, et aussi parce que d'un point de vue sécurité, c'est pas très élégant.

Edit : Visionary ne fonctionnait plus une fois que je suis passé en 2.3.3...