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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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 ?

+ 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