MTP in VB.NET

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Stromer.

    MTP in VB.NET

    Moin,

    ich würde gerne (um Synchronisationen zu automatisieren) auf mein Handy zugreifen.
    Jedoch kann ich nur mit "MTP" darauf zugreifen.

    Leider gibt es im Bereich VB.NET wenig Support und ich schätze mal, dass die Code-Converter den Code nicht packen.
    zZ gehe ich nach diesem Tutorial vor -> Link
    Explizit habe ich grade zwei Probleme:
    Spoiler anzeigen

    Quellcode

    1. public class PortableDeviceCollection : Collection<PortableDevice>
    2. {
    3. private readonly PortableDeviceManager _deviceManager;
    4. public PortableDeviceCollection()
    5. {
    6. this._deviceManager = new PortableDeviceManager();
    7. }
    8. public void Refresh()
    9. {
    10. //...
    11. }
    12. }
    Aus Zeile 1 macht er:

    VB.NET-Quellcode

    1. Public Class PortableDeviceCollection
    2. Inherits Collection(Of PortableDevice)
    Jedoch kann sich VB nicht mit dem "Of Portable" anfreunden. (""Microsoft.VisualBasic.Collection" hat keine Typparameter und kann daher keine Typargumente haben.")
    Spoiler anzeigen

    Quellcode

    1. foreach(var deviceId in deviceIds)
    2. {
    3. Add(new PortableDevice(deviceId));
    4. }

    VB.NET-Quellcode

    1. For Each deviceId As var In deviceIds
    2. Add(New PortableDevice(deviceId))
    3. Next
    Hier heißt es: "var ist nicht definiert"


    Achja: Und noch frohe Weihnachten.



    Mfg.
    SAR

    MTP in VB.Net

    Hallo SAR-71,

    dein Artikel hat mich motiviert den Zugriff auf die Mobile Devies zuversuchen. Mit Hilfe einer Konvertierungs Website habe ich mir das C# Projekt von www.cgeers.com übersetzt und in Visual Basic Express 2010 ein Projekt angelegt. Auslesen der DeviceID, FriendylName, Anzeigen der Dateien geht bereits.

    Nun steh ich vor eine Problem im dritten Bolog WPD: Transferring Content wird der Download erklärt und diesen bekomme ich nicht zum laufen.

    Es wird eine sub routine (DownloadFile) in der PortableDevice Class angelegt und dann in der sub routine DisplayFolderContents darauf zugriffen.

    Und genau hier ist mein Problem, die sub routine ist außerhalb der Class nicht sichtbar, hattest du das gleich Problem, hast du eventuell eine Lösung ?

    Gruß Stromer
    Ich hatte viele Probleme, was die Konvertierung anging - deswegen auch meine Threads.
    Dein Problem sagt mir nichts, aber ich kann mal meinen Sub posten:

    VB.NET-Quellcode

    1. Public Sub DownloadFile(file As PortableDeviceFile, saveToPath As String)
    2. Dim content As IPortableDeviceContent
    3. Me._device.Content(content)
    4. Dim resources As IPortableDeviceResources
    5. content.Transfer(resources)
    6. Dim wpdStream As PortableDeviceApiLib.IStream
    7. Dim optimalTransferSize As UInteger = 0
    8. Dim [property] = New _tagpropertykey()
    9. [property].fmtid = New Guid(&HE81E79BEUI, &H34F0, &H41BF, &HB5, &H3F, &HF1, _
    10. &HA0, &H6A, &HE8, &H78, &H42)
    11. [property].pid = 0
    12. resources.GetStream(file.Id, [property], 0, optimalTransferSize, wpdStream)
    13. Dim sourceStream As System.Runtime.InteropServices.ComTypes.IStream = DirectCast(wpdStream, System.Runtime.InteropServices.ComTypes.IStream)
    14. Dim filename = Path.GetFileName(file.Id)
    15. Dim targetStream As New FileStream(Path.Combine(saveToPath, filename), FileMode.Create, FileAccess.Write)
    16. Dim buffer = New Byte(1023) {}
    17. Dim bytesRead As Integer
    18. Do
    19. sourceStream.Read(buffer, 1024, New IntPtr(bytesRead))
    20. targetStream.Write(buffer, 0, 1024)
    21. Loop While bytesRead > 0
    22. targetStream.Close()
    23. End Sub



    Hast du bei dir auch den Sub auch Public gemacht?



    Mfg.
    SAR
    Guten Morgen SAR-71,

    danke für deine Rückmeldung !

    Ja, meine sub routine sieht genau so aus und ist auch als public definiert.

    Das Problem tritt auf wenn ich auf die sub zugreifen will, in Blog wird beschrieben das er es bei der DisplayFolderContents Methode einbindet mit einer Schleife.

    Das habe ich so verstanden :

    Quellcode

    1. Public Shared Sub DisplayFolderContents(ByVal folder As PortableDeviceFolder)
    2. For Each item As Object In folder.Files
    3. If TypeOf item Is PortableDeviceFile Then
    4. device.DownloadFile(DirectCast(item, PortableDeviceFile), "c:\Temp\")
    5. End If
    6. Debug.Print(item.id)
    7. If TypeOf item Is PortableDeviceFolder Then
    8. DisplayFolderContents(DirectCast(item, PortableDeviceFolder))
    9. End If
    10. Next
    11. End Sub


    In Zeile 4 ist dann der Fehler : "device" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.

    Bisher habe ich keinen Weg gefunden auf "device" zuzugreifen.

    Wenn ich die sub routine DownLoadFile die Du auch gepostet hast mit Shared freigebe dann gibt es einen Fehler in der Routine in Zeile 3 bei "Me".

    Leider verstehe ich die Class Programmierung noch nicht so richtig, bin ja auch nur Hobbyprogrammierer.

    Gruß Stromer
    Ich poste mal meine Funktion vom zum Anzeigen der Dateien in einem Ordner:

    VB.NET-Quellcode

    1. Public Function getFolderFiles(ByVal device As PortableDevice, ByVal folder As PortableDeviceFolder) As List(Of PortableDeviceFile)
    2. Dim files As New List(Of PortableDeviceFile)
    3. For Each item As PortableDeviceObject In folder.Files
    4. If TypeOf item Is PortableDeviceFile Then
    5. files.Add(item)
    6. End If
    7. Next
    8. Return files
    9. End Function


    Die Funktion liefert mir eine List (of PortableDeviceFile) mit der ich ohne Probleme weiterarbeiten kann.

    In der Anwendung sieht das etwa so aus:

    VB.NET-Quellcode

    1. 'Verbindung zum ersten Gerät herstellen
    2. Dim collection = New PortableDeviceCollection()
    3. collection.Refresh()
    4. Dim device As PortableDevice = collection(0)
    5. 'Den Ordner "Phone" auswählen
    6. Dim folder = device.GetContents()
    7. folder = getFolder(device, folder, "Phone")
    8. 'Alle Dateien aus dem Ordner "Phone" auswählen
    9. Dim files As New List(Of PortableDeviceFile)
    10. files = getFolderFiles(device, folder)



    Mfg.
    SAR
    Guten Morgen SAR-71,

    habe es gestern leider nicht mehr geschafft mich mit deiner Antwort zu beschäftigen, manchmal gibt es auch familliäre Verpflichtungen :thumbup:

    Dein Ansatz zum Lesen der Datei sieht etwas anders aus wie aus der Projekt konvertierung.

    Den Weg werde ich mir heute Abend mal in Ruhe ansehen.

    Werde mich wieder melden wie es ausgegangen ist.

    Gruß Stromer
    Hallo SAR-71,

    hatte heute den ersten Erfolg, konnte eine Datei von einem Gerät mit Windows Mobile 6.5 herunterladen. Nun werd ich es mit meinen Samsung Handy probieren.

    Der Fehler lag in der nicht vorhandenen Definition der Variable "Device" , da war dein Posting sehr hilfreich.

    Herzlichen Dank !

    Viele Grüße

    Stromer
  • 2 Benutzer haben hier geschrieben