Windows Portable Devices - C# en je telefoon, deel 1

Ingediend door Dirk Hornstra op 09-sep-2018 22:44

In mijn vakantie nog even bij een oom en tante langs geweest, ze willen foto's van hun mobiel overzetten, maar "het werkt niet". Op zich kun je via de verkenner wel bij de bestanden komen en zou je ze kunnen kopiëren en plakken, maar hé, dat is niet de manier waarop de standaard-computeraar zijn/haar bestanden overzet. 

Die gebruikt onder Windows 10 het standaard-programma "Windows Foto's". Op zich een goed programma, maar het gaat nu niet goed. Bij het importeren zit je minuten lang te wachten. Boel disconnecten en volgende keer weer proberen, dan gaat het ineens wel snel. Wel heb je niet alleen de foto's die met de camera gemaakt zijn, maar ook afbeeldingen die via WhatsApp verzonden/ontvangen zijn. Eigenlijk zou ik dat niet willen, maar goed. We selecteren alleen de laatste foto's, klikken op "haal maar binnen" en vervolgens krijgen we een "er is een fout opgetreden. bestanden binnenhalen is mislukt". Vervolgens kun je terug en het nogmaals proberen, maar het werkt nog steeds niet. Zit ergens een bugje.

Ik wil dus kijken of ik met een simpel programmaatje dit werkend kan krijgen. Eerst op een nuget-package gezocht, daarbij kom ik uit op PortableDevices 1.0.1. (sourcecode op Github terug te vinden: https://github.com/Duke-fleed/WPDApi). Maar dat gaat niet goed. Ten eerste is het al een ouder package en moet je COM-componenten (DLL's) toevoegen. Dat zou niet zo'n probleem moeten zijn, maar het tweede euvel is erger, de boel blijft hangen op de functie ".GetContents()". 

Goed, plan 2. Kijken of Microsoft er dan zelf wat voor heeft. Ik kom daarbij uit op https://docs.microsoft.com/en-us/windows/desktop/wpd_sdk/wpd-application-programming-interface. Stap 1 geeft aan dat je de Windows Software Development Kit geïnstalleerd moet hebben. Het zou handig zijn als hier meteen een link toegevoegd zou zijn, maar die is er niet. Dan zelf maar even Googelen, ik kom daarbij uit op de Windows 10 SDK. Ik download de ISO-file maar, want misschien wil ik deze ook nog op andere computers installeren. Deze is 796 MB groot (handig om te weten als je de download wilt opstarten, maar niet zoveel tijd hebt). Dit is de link die ik gevonden heb: https://developer.microsoft.com/nl-nl/windows/downloads/windows-10-sdk

Na de download en installatie kijken of ik de code kan vinden van het WpdApiSample. Hier wordt ook de WpdServicesApiSampleApplication genoemd, de downloadlink wijst echter naar een website die niet meer online is. De bronbestanden die genoemd worden geven aan dat het geen C#, maar een C-project is. Dan gaan we die eerst nog maar eens downloaden en installeren. Na een lange tijd is de boel eindelijk gedownload, vervolgens installeren en op zoek naar die WpdApiSample. Ik kan m niet vinden... Nog maar eens Googelen op Windows Portable Devices Microsoft, ik kom daarbij uit op de Windows Driver Kit, https://msdn.microsoft.com/en-us/library/windows/hardware/ff597729(v=vs.85).aspx

Boel downloaden, eerst nog bij Visual Studio 2017 het C++ desktop developmentitem geïnstalleerd. Daarna kun je bij het doorlopen van de installatie kiezen voor "Install Windows Driver Kit Visual Studio extension". Dat is gedaan, later moet ik de stappen verder nog doorlopen die hier staan: https://docs.microsoft.com/nl-nl/windows-hardware/drivers/download-the-wdk

In Visual Studio heb ik nu inderdaad extra templates, onder Visual C++ staat nu Windows Drivers, met weer een onderverdeling. Ik ga daar naar Windows Drivers, Applications en kies voor WinUSB Application (Universal). Maar een eerste blik laat me al stoppen, hiervoor zou ik specifieke zaken voor deze applicatie moeten instellen, terwijl ik eigenlijk alleen een "algemene" connector wil hebben voor een via USB aangesloten telefoon. 

Maar weer verder gaan zoeken, kwam daarbij uit op https://docs.microsoft.com/nl-nl/windows/desktop/wpd_sdk/wpd-application-programming-interface. Na een vervolg-zoekactie hier nog even gekeken: https://cgeers.wordpress.com/2011/05/22/enumerating-windows-portable-devices/. Via StackOverflow en forum.xda-developers.com ( https://forum.xda-developers.com/showthread.php?t=1512685 ) kom ik uit bij AndroidLib, een library voor C#, op deze URL: https://github.com/regaw-leinad/AndroidLib. Ook meteen de samples gedownload op https://github.com/regaw-leinad/AndroidLib-Samples-C-. Geprobeerd, maar deze library detecteert mijn aangesloten Android Phone niet... Weer verder zoeken met wat andere zoekwoorden. Ik vind hierbij een post op codeproject: https://www.codeproject.com/Articles/1213684/External-Drives-Library-Part-Dealing-with-USB-Conn waar een linkje op staat naar https://github.com/jtorjo/external_drive_lib. Hoewel de functie example_enumerate_all_camera_pics mij de melding "No Android Drive Connected" geeft, komt ik er met debuggen achter dat de aangesloten mobiele telefoon wel degelijk wordt gevonden en ik ook kan bladeren door het bestandsysteem. Als ik stap-voor-stap het programma doorloop, zie ik ook wat deze melding veroorzaakt. Er is een is_android property in de IDrive-Interface. Deze checkt op het "drive-type". Bij mijn OnePlus-telefoon is dat geen android_phone, android_tablet of android_unknown maar "portable". Het zou ook kunnen zijn dat dit type bij een aangesloten externe schijf gedetecteerd wordt, maar dat zoek ik later wel uit. Als ik dit type toevoeg werkt het voorbeeldprogramma als een zonnetje. De twee foto's die erop staan worden netjes naar een tijdelijke map op mijn computer gekopieerd. Deze code moet gestript een aangepast worden, maar ik heb nu in ieder geval een basis waar ik wat mee kan!