IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Télécharger un fichier via une URL ?


Sujet :

Android

  1. #1
    Membre averti Avatar de Ralof_le_Roux
    Homme Profil pro
    Apprenti sorcier
    Inscrit en
    Septembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti sorcier

    Informations forums :
    Inscription : Septembre 2016
    Messages : 18
    Par défaut Télécharger un fichier via une URL ?
    Salutations à vous !

    Dans le cadre d'un projet, je dois récupérer un certificat sur mon téléphone. Celui-ci se génère en remplissant un formulaire sur un serveur. Une fois généré, l'URL du certificat est converti en QRcode et c'est mon appli qui entre en jeu.

    Elle doit lire le QRcode et lancer le téléchargement du fichier. Ce que je faisais avant c'était de rediriger l'URL lue vers un navigateur qui lançait le téléchargement mais pour des raisons de sécurité et la suite de mon projet, je veux que le fichier se télécharge dans le répertoire de mon application. Pour cela je dois bien lancer le téléchargement via mon appli une fois le QRcode décodé.



    Voici la partie intéressante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    public class MainActivity extends Activity
    {
        public void onActivityResult(int requestCode, int resultCode, Intent intent)
        {
            if (requestCode == 0) {
                if (resultCode == RESULT_OK) {
                    String contents = intent.getStringExtra("SCAN_RESULT");
                    setContentView(R.layout.activity_download);
     
                    DownloadTask mDownload = new DownloadTask();
                    mDownload.execute(contents);
                }
            }
        }
     
        class DownloadTask extends AsyncTask<String, String, String> {
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                showDialog(progress_bar_type);
            }
            @Override
            protected String doInBackground(String ...f_url) {
            int count;
                try {
                    URL url = new URL(f_url[0]);
                    URLConnection connection = url.openConnection();
                    connection.connect();
                    int fileLength = connection.getContentLength();
                    InputStream input = new BufferedInputStream(url.openStream(), 8192);
                    output = openFileOutput(url.getFile().substring(url.getFile().lastIndexOf('/') + 1), MODE_PRIVATE);
                    byte data[] = new byte[1024];
                    long total = 0;
                    while ((count = input.read(data)) != -1)
                    {
                        total += count;
                        publishProgress("" + (int)((total * 100) / fileLength));
                        output.write(data, 0, count);
                    }
                    output.flush();
                    output.close();
                    input.close();
                } catch (Exception e){
                    Log.e("Error: ", e.getMessage());
                }
                return null;
            }
     
            @Override
            protected void onProgressUpdate(String... values) {
                pDialog.setProgress(Integer.parseInt(values[0]));
            }
     
            @Override
            protected void onPostExecute(String s) {
                dismissDialog(progress_bar_type);
     
                //String filePath = Environment.getExternalStorageDirectory().toString() + "/sdcard/TESTFILE001";
                //lancer l'installation du certificat
            }
        }
    }
    Je n'ai laissé que les fonctions propres à mon problème : ma pop-up du progressdialog se lance avant de se refermer et de m'afficher mon layout de fond, sans réaliser de téléchargement.

    Pourquoi ? :c J'ai du mal à cerner le problème...

    Pour vérifier si mon fichier s'est télécharger ou non, j'aimerai l'ouvrir (lancer l'installation dans le cas de mon certificat), malheureusement mon ami google ne m'informe pas beaucoup des fonctions à utiliser.

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Si ton application crash, tu as une stacktrace dans ton LogCat, pourrais-tu nous la fournir s'il te plaît ?
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Membre averti Avatar de Ralof_le_Roux
    Homme Profil pro
    Apprenti sorcier
    Inscrit en
    Septembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti sorcier

    Informations forums :
    Inscription : Septembre 2016
    Messages : 18
    Par défaut
    Citation Envoyé par Hizin Voir le message
    Si ton application crash, tu as une stacktrace dans ton LogCat, pourrais-tu nous la fournir s'il te plaît ?
    Oui bien sûr, j'ai édité le sujet (désolé du temps de réponse).
    Ce sont mes premiers pas sur Android et je me forme en même temps que je développe pour l'entreprise, il y a donc des notions et réflexes que je ne connais pas.
    Mais je suis là pour apprendre !


    EDIT : j'ai ajouté .connect(); juste après openConnection(); (j'ai du mal à comprendre pourquoi openConnection ne fait pas de connect lui même), en esperant que cela change quelque chose, mais non c:

  4. #4
    Membre averti Avatar de Ralof_le_Roux
    Homme Profil pro
    Apprenti sorcier
    Inscrit en
    Septembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti sorcier

    Informations forums :
    Inscription : Septembre 2016
    Messages : 18
    Par défaut
    Je viens de lire qu'apparemment Android ne permettait plus de lancer de requête HTTP depuis le main UI thread, qu'il fallait passer par une Asynctask.
    Est-ce confirmé ?

  5. #5
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    C'est confirmé depuis Android HoneyComb (3.0). Depuis cette version, Android lève une exception (NetworkOnMainThread) pour lutter contre cette mauvaise pratique qui gèle l'interface utilisateur.
    Il faut donc obligatoirement passer par un thread à minima (et ce, quel que soit le langage et la plate-forme) pour ne pas empiéter sur le thread graphique dessinant l'UI

    Pour l'erreur, tu n'as pas une longue suite de lignes rouge (ou tout du moins, marquées en "error"), plutôt ? Si oui, pourrais-tu nous fournir la totalité s'il te plaît ?
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  6. #6
    Membre averti Avatar de Ralof_le_Roux
    Homme Profil pro
    Apprenti sorcier
    Inscrit en
    Septembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti sorcier

    Informations forums :
    Inscription : Septembre 2016
    Messages : 18
    Par défaut
    J'essaie actuellement d'y ajouter un thread, je te tiens informé.

    Pour les erreurs, je n'avais que celle-là avec en suite l'emplacement de celle-ci (les at ... que je ne trouvais pas forcément utile). Je test le nouveau code et je t'envoie ça

    EDIT : je vais éditer le code du sujet avec le thread. L'application ne crash plus mais se "freeze" vers environ 30% de ma progress bar.

  7. #7
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Utilise plutôt une AsyncTask. C'est une classe de "sucre syntaxique" assez utile pour les usages basiques.
    Tu as trois méthodes :
    • onPreExecute : cette méthode est exécutée sur le thread graphique et permet de préparer l'UI (mettre un diagog, griser, changer les états...)
    • doInBackground : cette méthode est exécutée dans un autre thread et sert à réaliser le gros du travail
    • onPostExecute : cette méthode est exécutée sur le thread graphique et permet de modifier l'UI suite au boulot terminé (charger les nouvelles données, enlever un dialod, changer les états...)


    Tu as aussi la méthode publishProgress qui est facultative. Elle est exécutée sur le thread graphique et permet de mettre à jour un affichage via l'utilisation de la méthode publish dans doInBackground.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  8. #8
    Membre averti Avatar de Ralof_le_Roux
    Homme Profil pro
    Apprenti sorcier
    Inscrit en
    Septembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti sorcier

    Informations forums :
    Inscription : Septembre 2016
    Messages : 18
    Par défaut
    Citation Envoyé par Hizin Voir le message
    Utilise plutôt une AsyncTask. C'est une classe de "sucre syntaxique" assez utile pour les usages basiques.
    Tu as trois méthodes :
    • onPreExecute : cette méthode est exécutée sur le thread graphique et permet de préparer l'UI (mettre un diagog, griser, changer les états...)
    • doInBackground : cette méthode est exécutée dans un autre thread et sert à réaliser le gros du travail
    • onPostExecute : cette méthode est exécutée sur le thread graphique et permet de modifier l'UI suite au boulot terminé (charger les nouvelles données, enlever un dialod, changer les états...)


    Tu as aussi la méthode publishProgress qui est facultative. Elle est exécutée sur le thread graphique et permet de mettre à jour un affichage via l'utilisation de la méthode publish dans doInBackground.
    Je vais essayé avec ça, c'est plus propre en effet. Je te tiens au courant, merci de ta patience

  9. #9
    Membre averti Avatar de Ralof_le_Roux
    Homme Profil pro
    Apprenti sorcier
    Inscrit en
    Septembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti sorcier

    Informations forums :
    Inscription : Septembre 2016
    Messages : 18
    Par défaut
    Citation Envoyé par Hizin Voir le message
    C'est confirmé depuis Android HoneyComb (3.0). Depuis cette version, Android lève une exception (NetworkOnMainThread) pour lutter contre cette mauvaise pratique qui gèle l'interface utilisateur.
    Il faut donc obligatoirement passer par un thread à minima (et ce, quel que soit le langage et la plate-forme) pour ne pas empiéter sur le thread graphique dessinant l'UI

    Pour l'erreur, tu n'as pas une longue suite de lignes rouge (ou tout du moins, marquées en "error"), plutôt ? Si oui, pourrais-tu nous fournir la totalité s'il te plaît ?
    Je suis en train de voir pour faire mon téléchargement via une AsynTask, pour l'instant je le lance simplement dans un autre thread et j'obtiens cette erreur :

    10-13 14:14:55.791 6102-6135/? E/ContactsProvider_EventLog: Flush buffer to file cnt : 21 size : 18Kb duration : 483ms lastUpdatedAfter : 32557 ms mFlush_time_threasold : 2000 mCurrentSize : 9534
    10-13 14:14:57.371 5165-6323/? E/ClipboardDataMgr: in own condtnthis Text class. Value is http://poc-android.p 1476352539494
    10-13 14:14:57.371 5165-6323/? E/ClipboardDataMgr: before return latestdatalthis Text class. Value is http://poc-android.p
    10-13 14:14:57.641 5165-5165/? E/MotionRecognitionService: support TA ~
    10-13 14:14:59.091 4918-28873/? E/ExynosCamera: [CAM_ID(0)][]-ERR(m_facedetectThreadFunc[4368]):m_facedetectQ skipped QSize(3) frame(162)
    10-13 14:14:59.221 4918-4918/? E/libcsc: csc_deinit:: unsupported csc_hw_type
    10-13 14:14:59.221 4918-4918/? E/libcsc: csc_deinit:: unsupported csc_hw_type
    10-13 14:14:59.251 4918-4918/? E/libcsc: csc_deinit:: unsupported csc_hw_type
    10-13 14:14:59.251 4918-4918/? E/libcsc: csc_deinit:: unsupported csc_hw_type
    10-13 14:14:59.251 4918-4918/? E/libcsc: csc_deinit:: unsupported csc_hw_type
    10-13 14:14:59.351 6757-6757/? E/SamsungIME: isHWKeyboardConnected() = false --> false
    10-13 14:14:59.371 6757-6757/? E/SamsungIME: resetNeedToLoadHwrLibrary : 0
    10-13 14:15:01.521 5165-5618/? E/ConnectivityService: updateNetworkInfo()
    10-13 14:15:02.081 5165-5165/? E/MotionRecognitionService: GripVal = 0
    10-13 14:15:05.681 5165-5618/? E/ConnectivityService: updateNetworkInfo()
    10-13 14:15:05.771 5165-5165/? E/MotionRecognitionService: disableGripSensor, backoffstate = 33792
    10-13 14:15:05.771 5165-5583/? E/MotionRecognitionService: handleMessage: event 200 value : 33792


    Je ne comprend pas tout, mais je vois que l'URL qu'il me renvoie (2ème et 3ème ligne : http://poc-android.p) n'est pas l'url complète que j'envoie.
    Est-ce que en effet il ne lit pas l'URL complète ? Ou ce message coupe volontairement l'URL ?

  10. #10
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    10-13 14:14:57.641 5165-5165/? E/MotionRecognitionService: support TA ~
    10-13 14:14:59.091 4918-28873/? E/ExynosCamera: [CAM_ID(0)][]-ERR(m_facedetectThreadFunc[4368]):m_facedetectQ skipped QSize(3) frame(162)
    10-13 14:14:59.221 4918-4918/? E/libcsc: csc_deinit:: unsupported csc_hw_type
    10-13 14:14:59.221 4918-4918/? E/libcsc: csc_deinit:: unsupported csc_hw_type
    10-13 14:14:59.251 4918-4918/? E/libcsc: csc_deinit:: unsupported csc_hw_type
    10-13 14:14:59.251 4918-4918/? E/libcsc: csc_deinit:: unsupported csc_hw_type
    10-13 14:14:59.251 4918-4918/? E/libcsc: csc_deinit:: unsupported csc_hw_type
    10-13 14:14:59.351 6757-6757/? E/SamsungIME: isHWKeyboardConnected() = false --> false
    10-13 14:14:59.371 6757-6757/? E/SamsungIME: resetNeedToLoadHwrLibrary : 0
    10-13 14:15:01.521 5165-5618/? E/ConnectivityService: updateNetworkInfo()
    10-13 14:15:02.081 5165-5165/? E/MotionRecognitionService: GripVal = 0
    10-13 14:15:05.681 5165-5618/? E/ConnectivityService: updateNetworkInfo()
    10-13 14:15:05.771 5165-5165/? E/MotionRecognitionService: disableGripSensor, backoffstate = 33792
    10-13 14:15:05.771 5165-5583/? E/MotionRecognitionService: handleMessage: event 200 value : 33792
    Tout ça, c'est du bruit. Filtre le LogCat uniquement sur ton application pour le retirer. Le sélecteur tout à droite du LogCat (légèrement au-dessus) te le permettra.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  11. #11
    Membre averti Avatar de Ralof_le_Roux
    Homme Profil pro
    Apprenti sorcier
    Inscrit en
    Septembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti sorcier

    Informations forums :
    Inscription : Septembre 2016
    Messages : 18
    Par défaut
    Tout ça, c'est du bruit. Filtre le LogCat uniquement sur ton application pour le retirer. Le sélecteur tout à droite du LogCat (légèrement au-dessus) te le permettra.
    Excuse moi, j'aurai du mieux regarder avant de le poster.
    J'ai modifier mon code (et édité le sujet) de façon à exécuter les requêtes HTTP dans une AsyncTask et voici mon code d'erreur, beaucoup plus compréhensible cette fois :

    10-13 16:34:07.625 23751-24483/com.example.foofoobar.qrte E/Error:: /sdcard/TESTFILE001: open failed: EACCES (Permission denied)
    10-13 16:34:07.635 23751-23751/com.example.foofoobar.qrte E/ViewRootImpl: sendUserActionEvent() mView == null
    Apparemment je n'aurai pas la permission d'écrire à cet emplacement, pourtant mon manifest me semble correct :
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    Je sais bien que depuis la 4.4 une application ne peut plus écrire ou modifier des fichiers en dehors du dossier où elle se situe, mais je ne vois pas d'autre chemin à donner pour l'écriture de mon fichier que /sdcard/

    Une idée ?

  12. #12
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Citation Envoyé par Ralof_le_Roux
    Excuse moi, j'aurai du mieux regarder avant de le poster.
    Aucun souci. Mes excuses si j'ai été trop "brut de décoffrage" ^^'


    Plutôt que de passer par un chemin par toi-même (soit /sdcard/...), passe plutôt par getExternalStorageDirectory et assimilé je pense.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  13. #13
    Membre averti Avatar de Ralof_le_Roux
    Homme Profil pro
    Apprenti sorcier
    Inscrit en
    Septembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti sorcier

    Informations forums :
    Inscription : Septembre 2016
    Messages : 18
    Par défaut
    Plutôt que de passer par un chemin par toi-même (soit /sdcard/...), passe plutôt par getExternalStorageDirectory et assimilé je pense.
    J'ai essayé ça :
    OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/ANDROID_TEST001");
    Mais
    File /storage/emulated/0/ANDROID_TEST001 contains a path separator
    En revance, si j'essaie ça :
    OutputStream output = new FileOutputStream("ANDROID_TEST001");
    J'obtiens :
    Read-Only file system
    Ce qui en soit revient presque au même :c

  14. #14
    Membre averti Avatar de Ralof_le_Roux
    Homme Profil pro
    Apprenti sorcier
    Inscrit en
    Septembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti sorcier

    Informations forums :
    Inscription : Septembre 2016
    Messages : 18
    Par défaut
    Je crois avoir trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FileOutputStream output = null;
    //je récupère mon fichier dans un FileOutputStream et non un BufferedOutputStream que je nomme pareillement à celui téléchargé
    output = openFileOutput(url.getFile().substring(url.getFile().lastIndexOf('/') + 1), MODE_PRIVATE);
    Mon ProgressDialog avance bien, et je ne vois pas de message d'erreur hormis : "E/ViewRootImpl: sendUserActionEvent() mView == null' dont je ne pense pas être importante.

    Maintenant, je ne sais pas où est stocké mon fichier ni même s'il a vraiment été téléchargé. Je ne le vois pas dans l'historique de téléchargement ou dans utilisant la barre de recherche.
    Et je ne connais pas le repo de mon appli, là où - si tout avait marché comme prévu - le fichier serait stocké

    Donc au final je vais vendre un chat de schrodinger à mon entreprise ("Il est téléchargé (ou pas) du moment que vous ne regardez pas dans le dossier de l'application, croyez moi !")

    EDIT : comme la suite des étapes du projet m'amènera à lancer le certificat que l'appli aura téléchargé, je me demande maintenant comme faire. Cela me permettrait de savoir si il s'est bien télécharger (et me ferait avancer rapidement)

  15. #15
    Membre averti Avatar de Ralof_le_Roux
    Homme Profil pro
    Apprenti sorcier
    Inscrit en
    Septembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Apprenti sorcier

    Informations forums :
    Inscription : Septembre 2016
    Messages : 18
    Par défaut
    J'ai finalement eu ce que je voulais, j'ajoute le code pour ceux qui chercheraient.
    Merci beaucoup !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
     
    public class MainActivity extends Activity
    {
        static final String ACTION_SCAN = "com.google.zxing.client.android.SCAN";
        private ProgressDialog pDialog;
        public static final int progress_bar_type = 0;
     
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
     
        //On essaie d'ouvrir un lecteur de QRcode, si oui : on lit; si non : on en télécharge un
        public void scanQR(View v)
        {
            try
            {
                Intent intent = new Intent(ACTION_SCAN);
                intent.putExtra("SCAN MODE", "QR_CODE_MODE");
                startActivityForResult(intent, 0);
     
            }
            catch (ActivityNotFoundException anfe)
            {
                showDialog(MainActivity.this, "Aucun scanner trouvé.", "En télécharger un ?", "Oui", "Non").show();
            }
        }
     
        //On demande à l'utilisateur d'installer un lecteur de QRcode
        private static AlertDialog showDialog(final Activity act, CharSequence title, CharSequence message, CharSequence buttonYes, CharSequence buttonNo)
        {
            AlertDialog.Builder downloadDialog = new AlertDialog.Builder(act);
            downloadDialog.setTitle(title);
            downloadDialog.setMessage(message);
            downloadDialog.setPositiveButton(buttonYes, new DialogInterface.OnClickListener()
            {
                public void onClick(DialogInterface dialogInterface, int i)
                {
                    Uri uri = Uri.parse("market://search?q=pname:" + "com.google.zxing.client.android");
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    try {
                        act.startActivity(intent);
                    }
                    catch (ActivityNotFoundException ignored)
                    {
                    }
                }
            });
            downloadDialog.setNegativeButton(buttonNo, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialogInterface, int i)
                {
                }
            });
            return downloadDialog.show();
        }
     
        @Override
        protected Dialog onCreateDialog(int id) {
            switch (id) {
                case progress_bar_type:
                    pDialog = new ProgressDialog(this);
                    pDialog.setMessage("Telechargement en cours...");
                    pDialog.setIndeterminate(false);
                    pDialog.setMax(100);
                    pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                    pDialog.setCancelable(true);
                    pDialog.show();
                    return pDialog;
                default:
                    return null;
            }
        }
     
        public void onActivityResult(int requestCode, int resultCode, Intent intent)
        {
            if (requestCode == 0) {
                if (resultCode == RESULT_OK) {
                    String contents = intent.getStringExtra("SCAN_RESULT");
                    setContentView(R.layout.activity_download);
     
                    DownloadTask mDownload = new DownloadTask();
                    mDownload.execute(contents);
                }
            }
        }
     
        //On télécharge le certificat, on l'installe (ce qui le déplace dans le keystore) puis, si il reste des traces, on le supprime
        class DownloadTask extends AsyncTask<String, String, String> {
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                showDialog(progress_bar_type);
            }
            @Override
            protected String doInBackground(String ...f_url) {
                try {
                    Context context = getApplicationContext();
                    URL url = new URL(f_url[0]);
                    URLConnection connection = url.openConnection();
                    connection.connect();
                    int fileLength = connection.getContentLength();
                    String fileName = url.getFile().substring(url.getFile().lastIndexOf('/') + 1);
                    File file = new File(context.getFilesDir().getAbsolutePath() + "/" + fileName);
                    if (file.exists()) {
                        file.delete();
                    }
                    InputStream input = new BufferedInputStream(url.openStream());
                    byte[] buffer = new byte[1024];
                    long total = 0;
                    FileOutputStream output = context.openFileOutput(fileName, Context.MODE_PRIVATE);
                    int count;
                    while ((count = input.read(buffer)) != -1)
                    {
                        total += count;
                        publishProgress("" + (int)((total * 100) / fileLength));
                        output.write(buffer, 0, count);
                    }
                    output.flush();
                    output.close();
     
                    if (file.exists()) {
                        Intent intent = KeyChain.createInstallIntent();
                        file = new File(context.getFilesDir().getAbsolutePath() + "/" + fileName);
                        byte[] p12 = FileUtils.readFileToByteArray(file);
                        intent.putExtra(KeyChain.EXTRA_PKCS12, p12);
                        startActivity(intent);
                        file = new File(context.getFilesDir().getAbsolutePath() + "/" + fileName);
                        if (file.exists()) {
                            file.delete();
                        }
                    }
                    else
                        return null;
                } catch (Exception e) {
                    Log.e("Error: ", e.getMessage());
                }
                return (null);
            }
     
            @Override
            protected void onProgressUpdate(String... values) {
                pDialog.setProgress(Integer.parseInt(values[0]));
            }
     
            @Override
            protected void onPostExecute(String fileName) {
                try {
                    wait(100);
                }
                catch (Exception e) {
                    Log.e("Error;", e.getMessage());
                }
                dismissDialog(progress_bar_type);
                TextView text = (TextView)findViewById(R.id.textView);
                text.setText("Téléchargement terminé, installation en cours");
            }
        }
    }
    A noter que l'utilisation des KeyChains n'ai possible qu'à partir de la version 5 d'Android (API 21 : Lollipop)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/05/2016, 15h42
  2. Télécharger un fichier distant avec une URL dynamique
    Par clement106 dans le forum Langage
    Réponses: 8
    Dernier message: 30/09/2011, 17h36
  3. Recuperer un fichier via une URL
    Par kululu dans le forum Général Java
    Réponses: 6
    Dernier message: 12/05/2010, 15h25
  4. Réponses: 9
    Dernier message: 06/01/2009, 18h39
  5. Accéder au contenu d'un fichier via une URL en mode binaire
    Par sbelli dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 11/10/2005, 10h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo