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 :

DownloadFile Manager librairy?


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Par défaut DownloadFile Manager librairy?
    Bonjour,

    Pour une application qui nécessite de télécharger énormément de document (pdf, ppt ou même txt), je suis a la recherche d'une librairie qui permettrais gérer ces téléchargement.
    En gros, j'aimerais une lib qui check en local si ce document existe et si ce n'est pas le cas, le télécharge.
    Après quelque recherche, je n'ai rien trouvé (mais j'arrive pas vraiment a affiner ma recherche, je tombe souvent sur des tuto qui permette de dl manuellement...) et je me demande du coup si cela existe... :s

    Du coup, j'ai regardé comment faire cela manuellement et je m'orienterai vers le DownloadManager, est ce qu c'est un bon choix? Vous avez des conseils? je suis preneur

    GLHF

  2. #2
    Membre expérimenté Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Par défaut
    Petit retour sur le sujet.

    J'ai trouvé des librairies qui permette de download tout type de fichier mais aucune ne permette de checker avant si ce fichier existe en local... (je suis toujours intéressé si quelqu'un en connait une)

    Du coup, j'ai commencé a créer un FileManager perso et je rencontre un bug que je ne comprend pas :s

    Voici mon code :

    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
     
     
    package com.ylly.hypred.utils;
     
    import android.app.DownloadManager;
    import android.content.ActivityNotFoundException;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Environment;
    import android.util.Log;
    import android.widget.Toast;
     
    import java.io.File;
     
    /**
     * Created by Altak on 10/08/2015.
     */
    public class FileManager {
        private static  String          filePath    = "********************";
        private static  FileManager     ourInstance = new FileManager();
        public  static  String          TAG         = "FileManager";
     
     
        public static FileManager getInstance() {
            return ourInstance;
        }
     
        private FileManager() {
        }
     
        public File     getFile(Context ctx, String url) {
            File file = new File("");
     
            if (getFileFromLocal(ctx, url))
                return null;
            else
                getFileFromNet(ctx, url);
            return null;
        }
     
        /**
         * Ouvre un fichier stocké en local
         * @param ctx le context de l'application
         * @param url l'url du fichier demandé
         * @return
         */
        private Boolean        getFileFromLocal(Context ctx, String url) {
            String name = url.substring(url.lastIndexOf("/")+1); //on sépare le nom du fichier du reste de l'url
     
            File file = new File(Environment.getExternalStoragePublicDirectory("test/doc") + File.separator + name); //on récupere le fichier
            Log.d(TAG, "test to open " + file.getAbsolutePath());
            if (file.exists()) {
                Uri path = Uri.fromFile(file);
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(path, "application/pdf");
    // optionnel a toi de voir quel flag tu souhaites
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
     
                try {
                    ctx.startActivity(intent);
                    return true;
                }
                catch (ActivityNotFoundException e) {
                    Toast.makeText(ctx,
                            "No Application Available to View PDF",
                            Toast.LENGTH_SHORT).show();
                    return false;
                }
            }
            return false;
        }
     
        /**
         * Ouvre un fichier téléchargé depuis le serveur
         * @param ctx le Context de l'application
         * @param url l'url du fihier demandé
         */
        private void        getFileFromNet(Context ctx, final String url) {
            String name = url.substring(url.lastIndexOf("/")+1); //on sépare le nom du fichier du reste de l'url
     
            Log.d(TAG, "Downloading...");
            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(filePath+url));
            request.setDescription("Some descrition");
            request.setTitle("Some title");
            // in order for this if to run, you must use the android 3.2 to compile your app
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            }
            request.setDestinationInExternalPublicDir(Environment.getExternalStoragePublicDirectory("test/doc").getPath(), File.separator + name);
     
            // get download service and enqueue file
            DownloadManager manager = (DownloadManager) ctx.getSystemService(Context.DOWNLOAD_SERVICE);
            manager.enqueue(request);
     
            BroadcastReceiver broadcast = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    getFileFromLocal(context, url);
                }
            };
     
            IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
            ctx.registerReceiver(broadcast, intentFilter);
     
     
        }
    }
    Donc je check si le fichier demandé existe en local, si oui je l'ouvre (je ne test qu'avec des pdf pour le moment), sinon je le télécharge depuis le serveur et j’essaie ensuite de l'ouvrir.
    Je dis "essayé",parce que mon probleme vient du fait qu'il ne trouve jamais le fichier en question (il ne passe jamais dans le if) alors que le fichier se télécharge et qu'il existe bien (j'ai regardé depuis mon pc, le fichier est au bon endroit...)

    Voici le l'affichage du log.d qui se trouve dans le getFileFromLocal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    4273-4273/com.ylly.hypred D/FileManager﹕ test to open /storage/emulated/0/test/doc/345ef7cd865796a2fde600d94436b8b0d1f4e5b1.pdf
    Je suis preneur de tout conseil/remarque

    GLHF!!

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Comme t'as pu t'en rendre compte y'a pas besoin de librairie pour vérifier qu'un fichier existe ... Et pour le téléchargement Android gère cela très bien avec le Download Manager.

    Pourquoi avoir un BroadCastReceiver dans ta fonction getFileFromNet() , idem pour les intent filter et l'enregistrement du receiver. Ca n'a rien à faire à cet endroit , sinon tu les rédifinis à chaque appel de la fonction.
    Déclare les une fois au niveau de ton activity.

    Pourquoi vérifier la présence du fichier en local après son téléchargement ? C'est pas le contraire que tu veux faire ?

    Pour finir si ton if (file.exists()) { renvoi false , c'est que ... le fichier n'existe pas , donc qu'il n'est pas à l'endroit que tu pense qu'i lest , ou que le nom est erroné
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre expérimenté Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Par défaut
    Re

    J'utilise un BroadCastReceiver pour pouvoir ouvrir le document la fin du téléchargement.
    En gros, dans l'application, l'utilisateur pourra clicker sur des liens (j'ai des fiches produit auxquels sont associé plusieurs documents) qui permette d'ouvrir le document voulut.
    Ce que je cherche a faire, c'est de rendre le téléchargement quasi invisible pour l'utilisateur, c'est à dire:
    -Il click sur le doc
    -Le FileManager check en local si il existe
    - Si oui, il ouvre le document
    - Si non, il télécharge le document et l'ouvre une fois qu'il a tout dl.

    Du coup, si tu regarde le code, dans le getFile(), je passe une première fois dans mon getFileFromLocal(), je télécharge ensuite et j'essai d'ouvrir mon document en repassant une deuxième fois dans mon getFileFromLocal() (avec le BroadcastReceiver).
    A noter que le getFile() est vraiment un premier jet, ne prend pas en compte les retours null de la fonction, je changerai ca avant de l’implémenter dans mon app.

    Pour le check du fichier, ce que je ne comprend pas, c'est que lorsque je regarde ma tablette avec l'explorateur de fichier windows, je retrouve bien un fichier a cette adresse:
    "\storage\emulated\0\test\doc\345ef7cd865796a2fde600d94436b8b0d1f4e5b1.pdf"
    et que le log me montre que je check si le fichier existe bien a cette adresse:
    "/storage/emulated/0/test/doc/345ef7cd865796a2fde600d94436b8b0d1f4e5b1.pdf"

    (différence entre les séparateur android et windows....)

    Et du coup, je ne comprend comment il peut me répondre que ce fichier n'existe pas alors que je le vois bien depuis windows...
    j'ai raté un truc? ^^

    GLHF

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    As tu essayer de définir le chemin de destination pour le downloadmanager , pour être certains que tout vas au bon endroit ?

    Du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objet.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "fichier.pdf");
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre expérimenté Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Par défaut
    Re

    Je definis le repertoire de destination avec cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    request.setDestinationInExternalPublicDir(Environment.getExternalStoragePublicDirectory("test/doc").getPath(), File.separator + name);
    Je viens d'essayer avec ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, name);
    Mais comme avant, le file.exist() me retourne false alors que je vois le fichier dans on répertoire... :s
    Je me demande si cela ne vient pas d'un probleme de droit, j'ai mis ceux la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    Il en faut peut-être d'autres?

    GL HF

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/08/2008, 17h34
  2. Librairie Code Managé
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 19/03/2008, 07h23
  3. Réponses: 5
    Dernier message: 09/12/2002, 22h23
  4. [GTK]PB Librairie GTK+ sous dev-c++
    Par wozzy dans le forum Dev-C++
    Réponses: 15
    Dernier message: 05/11/2002, 14h55
  5. compatibilité des librairies directX8
    Par Freakazoid dans le forum DirectX
    Réponses: 3
    Dernier message: 23/05/2002, 21h33

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