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

Windows Forms Discussion :

MTP device copie de photo


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut MTP device copie de photo
    Bonjour,
    l’évolution des portables sous Android fait qu'en USB on est passé du Mass storage au MTP (Media Transfert Protocol).
    Cette évolution me cause bien des soucis avec mon application qui consiste à récupérer des photos prisent avec mon mobile pour effectuer un traitement par la suite.
    En temps normal ( Mass Storage), je récupérai l'adresse de la photo mais depuis le passage au MTP ce n'est plus possible avec la même méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string files= ""; //Adresse du fichier image
    files = (string[])e.Data.GetData(DataFormats.FileDrop);
    Merci pour votre aide !!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Faire du MTP en C# (ou dans n'importe quel autre langage d'ailleurs), c'est la croix et la bannière... En général sur les téléphones Android tu peux choisir le mode de connexion (MTP, mass storage...) ; essaie plutôt de faire comme ça, sinon tu vas t'arracher les cheveux

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Bonsoir tomlev,
    ben même après activation du Mass Storage sur le phone je n'arrive pas à récupérer l'adresse de la photo avec le code posté plus haut.
    Je n'ai aucun problème avec une clé USB ou un fichier présent dans le PC.
    Du PC il m'est possible de faire des copier/coller/déplacer entre le phone et le PC mais pas de modification, es ce là la source du problème ?.
    Merci de ton aide!!

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Est-ce que quand tu branches le téléphone au PC il apparait avec une lettre de lecteur ? Si ce n'est pas le cas, tu ne peux pas le gérer comme un disque "normal", parce que les fichiers n'ont pas un vrai chemin d'accès utilisable par ton application.

    Cela dit, j'ai un peu cherché, et j'ai réalisé que sous Windows 8 il y a une API un peu plus simple pour manipuler des devices MTP. Normalement c'est une API pour les applis "Modern UI" (Metro), mais en fait on peut l'utiliser depuis une application de bureau (WinForms, WPF, console...), moyennement une petite bidouille pas très compliquée.

    Par contre, cette API est assez différente de ce que tu as probablement l'habitude d'utiliser... elle est asynchrone, donc il faut utiliser async/await, et elle n'utilise pas les classes habituelles (Directory, File, FileStream, etc) mais des classes spécifiques (StorageFolder, StorageFile, etc)

    Par exemple pour lister les dossiers de mon Nokia Lumia dans une appli console, je fais un truc comme ça :

    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
    using System;
    using System.Linq;
    using System.Threading.Tasks;
    using Windows.Devices.Enumeration;
    using Windows.Devices.Portable;
     
    namespace TestConsoleRT
    {
        class Program
        {
            static void Main(string[] args)
            {
                PrintFolderNames().Wait();
                Console.ReadLine();
            }
     
            static async Task PrintFolderNames()
            {
                var devices = await DeviceInformation.FindAllAsync(DeviceClass.PortableStorageDevice);
                var lumia = devices.FirstOrDefault(d => d.Name == "Lumia 920");
                if (lumia == null)
                {
                    Console.WriteLine("Device not found");
                    return;
                }
                var rootFolder = StorageDevice.FromId(lumia.Id);
                var phoneFolder = await rootFolder.GetFolderAsync("Phone");
                var folders = await phoneFolder.GetFoldersAsync();
                foreach (var folder in folders)
                {
                    Console.WriteLine(folder.Name);
                }
            }
        }
    }
    Je suppose que ça marcherait aussi avec un tel Android...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Merci de ta réponse rapide,
    effectivement il n'y a pas de lettre lecteur.
    Ta méthode avec le async/await nécessite le NET 4.5 hors c'est trop élevé pour mon application qui doit fonctionner sur des PC avec XP et du NET 2.xx.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Dans ce cas je pense que tu vas devoir utiliser ça :
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    C'est une librairie COM, donc en principe c'est utilisable depuis .NET (il y a un librairie COM PortableDeviceApi dans le dialogue d'ajout de référence). Mais en pratique les méthodes ont des signatures à la con qui font que ce n'est pas directement utilisable... Il faut bricoler un peu, comme expliqué ici : http://blogs.msdn.com/b/dimeby8/arch...ices-in-c.aspx

    Perso j'ai pas réussi à le faire marcher, mais c'est en partie parce que j'utilise Visual Studio 2013 (qui cible une version plus récente du runtime). Avec VS2005 ou 2008 ça devrait marcher je pense...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Oui effectivement comme tu dis c'est pas gagné, je n'ai même pas su faire
    fonctionner l'exemple d’énumération d'appareil connecté malgré l’intégration des librairies, si j'ai bien compris ce code affiche le nombre d'appareils connectés ainsi que leurs noms.
    Bon faut dire que mon niveau n'aide pas trop !!
    Je suis déjà stoppé sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    devMgr.GetDevices(null, ref cDevices);
    le "null" ne passe pas dans le compilo, il attend un string, si j'en ajoute un
    le reste du code ne suit plus et tout reste à "null" pour l'affichage.

    Merci pour tes infos,
    bonne journée.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par lolo81 Voir le message
    Je suis déjà stoppé sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    devMgr.GetDevices(null, ref cDevices);
    le "null" ne passe pas dans le compilo, il attend un string, si j'en ajoute un
    le reste du code ne suit plus et tout reste à "null" pour l'affichage.
    Tu as fait la manip avec ildasm/ilasm comme expliqué ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Bonjour,
    non je n'ai pas fais la manip car je ne comprends pas comment on passe la commande: ildasm Interop.PortableDeviceApiLib.dll / out: pdapi.il

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Il faut ouvrir une console avec l'environnement de développement
    Normalement tu as un raccourci "Developer Command Prompt for Visual Studio" ou quelque chose comme ça dans le menu démarrer. Ouvre ça, place toi dans le répertoire où est la DLL, et exécute la commande comme indiqué dans l'article

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    je suis en VS2008,
    me placer dans le répertoire en procédant ainsi:
    >Tools.Shell "C:\Users\Laurent\Documents\Visual Studio 2008\Projects\MonProjet\obj\Debug\Interop.PortableDeviceApiLib.dll"
    ouvre la Dll dans bloc note ou les données sont inexploitable car non décompilées.
    J'ai lancé directement Ildams.exe qui se trouve dans C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin et ouvert ensuite la DLL.
    Là DLL est ouverte mais je n'arrive pas à l’éditer avec Bloc Note pour effectuer la modification et recompiler.
    Merci pour ta patience!!

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par lolo81 Voir le message
    J'ai lancé directement Ildams.exe qui se trouve dans C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin et ouvert ensuite la DLL.
    Là DLL est ouverte mais je n'arrive pas à l’éditer avec Bloc Note pour effectuer la modification et recompiler.
    Ce n'est pas la DLL qu'il faut ouvrir, c'est le fichier .il généré par ildasm

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Ok ok j'ai pigé,
    bon alors j'ai donc éditer le fichier *.il généré par islam grace à la DLL
    "PortableDeviceApi 1.0 Type Library" mais je ne trouve aucune ligne commençant par "instance void GetDevices ([in] [out] " .
    Une idée?

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Euh, là je vois pas... chez moi il y avait bien cette ligne (il y en avait même deux comme ça).

  15. #15
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2009
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Utilisation de ton code
    Bonjour,

    J'ai voulu utiliser ton code, mais j'ai un problème avec les namespaces, il doit me manquer des références. Peux-tu me dire lesquelles ajouter ?
    Merci

    Citation Envoyé par tomlev Voir le message
    Est-ce que quand tu branches le téléphone au PC il apparait avec une lettre de lecteur ? Si ce n'est pas le cas, tu ne peux pas le gérer comme un disque "normal", parce que les fichiers n'ont pas un vrai chemin d'accès utilisable par ton application.

    Cela dit, j'ai un peu cherché, et j'ai réalisé que sous Windows 8 il y a une API un peu plus simple pour manipuler des devices MTP. Normalement c'est une API pour les applis "Modern UI" (Metro), mais en fait on peut l'utiliser depuis une application de bureau (WinForms, WPF, console...), moyennement une petite bidouille pas très compliquée.

    Par contre, cette API est assez différente de ce que tu as probablement l'habitude d'utiliser... elle est asynchrone, donc il faut utiliser async/await, et elle n'utilise pas les classes habituelles (Directory, File, FileStream, etc) mais des classes spécifiques (StorageFolder, StorageFile, etc)

    Par exemple pour lister les dossiers de mon Nokia Lumia dans une appli console, je fais un truc comme ça :

    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
    using System;
    using System.Linq;
    using System.Threading.Tasks;
    using Windows.Devices.Enumeration;
    using Windows.Devices.Portable;
     
    namespace TestConsoleRT
    {
        class Program
        {
            static void Main(string[] args)
            {
                PrintFolderNames().Wait();
                Console.ReadLine();
            }
     
            static async Task PrintFolderNames()
            {
                var devices = await DeviceInformation.FindAllAsync(DeviceClass.PortableStorageDevice);
                var lumia = devices.FirstOrDefault(d => d.Name == "Lumia 920");
                if (lumia == null)
                {
                    Console.WriteLine("Device not found");
                    return;
                }
                var rootFolder = StorageDevice.FromId(lumia.Id);
                var phoneFolder = await rootFolder.GetFolderAsync("Phone");
                var folders = await phoneFolder.GetFoldersAsync();
                foreach (var folder in folders)
                {
                    Console.WriteLine(folder.Name);
                }
            }
        }
    }
    Je suppose que ça marcherait aussi avec un tel Android...

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Dusbir Voir le message
    J'ai voulu utiliser ton code, mais j'ai un problème avec les namespaces, il doit me manquer des références. Peux-tu me dire lesquelles ajouter ?
    En fait il faut bricoler un peu, parce qu'il faut référencer WinRT, ce qui n'est pas possible initialement dans un projet Desktop. Il faut modifier manuellement le fichier .csproj. Cet article explique ce qu'il faut faire :

    http://www.hanselman.com/blog/HowToC...RTDiagram.aspx

    Sinon j'ai créé des templates de projets desktop où il y a déjà la référence à WinRT : http://1drv.ms/1hry1Ts

  17. #17
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2009
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Test avec Nexus 5
    Merci pour la réponse rapide, désolé pour mon temps de réponse
    Je suis entrain de chercher à adapter le code pour que ça fonctionne avec mon Nexus 5

  18. #18
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2009
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Si ça intéresse qq'un, voila le code pour récupérer le device avec un Nexus 5 ou une Nexus 7

    DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(DeviceClass.PortableStorageDevice);
    DeviceInformation device = devices.FirstOrDefault(d => d.Name == "deviceName" || StorageDevice.FromId(d.Id).DisplayName == "deviceName");

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/01/2017, 19h48
  2. device, copy, host
    Par Aratox dans le forum OpenCL
    Réponses: 2
    Dernier message: 26/12/2012, 20h18
  3. [PHP 4] Formulaire de copie de photo
    Par runcafre91 dans le forum Langage
    Réponses: 1
    Dernier message: 13/12/2008, 17h57
  4. Copie Data File Raw Device --> File en Aix 5.3 / 9i
    Par Merilka dans le forum Administration
    Réponses: 4
    Dernier message: 12/09/2007, 11h48
  5. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

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