2016-12-14 28 views
0

私はPortableDevice APIを使用して、MTPデバイスの検出とデバイスのプロパティを取得しています。 私は、ストレージの容量などのMTPデバイスのストレージを取得したいと利用可能storage.Hereは、私は、デバイスのストレージと自由を読みたいデバイスのフレンドリ名が取得するための私のサンプルコード、MTPデバイスの入手方法C#を使用したスト​​レージとストレージの容量

public string FriendlyName 
    { 
     get 
     { 
      if (!this._isConnected) 
      { 
       throw new InvalidOperationException("Not connected to device."); 
      } 

      // Retrieve the properties of the device 
      IPortableDeviceContent content; 
      IPortableDeviceProperties properties; 
      this._device.Content(out content); 
      content.Properties(out properties); 

      // Retrieve the values for the properties 
      IPortableDeviceValues propertyValues; 
      properties.GetValues("DEVICE", null, out propertyValues); 

      // Identify the property to retrieve 
      var property = new _tagpropertykey(); 
      property.fmtid = new Guid(0x26D4979A, 0xE643, 0x4626, 0x9E, 0x2B, 
             0x73, 0x6D, 0xC0, 0xC9, 0x2F, 0xDC); 
      property.pid = 12; 

      // Retrieve the friendly name 
      string propertyValue; 
      propertyValues.GetStringValue(ref property, out propertyValue); 

      return propertyValue; 
     } 
    } 

同様ですMTP装置からのスペース。

私はこのようにしようとしたが、私は、

IPortableDeviceKeyCollection keys; 
     properties.GetSupportedProperties(objectId, out keys); 

     IPortableDeviceValues values; 
     properties.GetValues(objectId, keys, out values); 

     // Get the name of the object 
     string name; 
     var property = new _tagpropertykey();    
     property.fmtid = new Guid(0x01A3057A, 0x74D6, 0x4E80, 0xBE, 0xA7, 0xDC, 0x4C, 0x21, 0x2C, 0xE5, 0x0A); 
     property.pid = 7; 
     values.GetStringValue(property, out name); 

     // Get the type of the object 
     Guid contentType; 
     property = new _tagpropertykey(); 

     property.fmtid = new Guid(0x01A3057A, 0x74D6, 0x4E80, 0xBE, 0xA7, 0xDC, 0x4C, 0x21, 0x2C, 0xE5, 0x0A); 

     property.pid = 5; 
     values.GetGuidValue(property, out contentType); 

     var storageType = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C); 

     var functionalType = new Guid(0x8F052D93, 0xABCA, 0x4FC5, 0xA5, 0xAC, 0xB0, 0x1D, 0xF4, 0xDB, 0xE5, 0x98); 

をいくつかのことをしないのです........................... ... ...................................

ありがとうございます。

答えて

0
//Collecting the supported keys 
IPortableDeviceKeyCollection keys; 
properties.GetSupportedProperties(objectId, out keys); 

//Init 
_tagpropertykey key = new _tagpropertykey(); 
uint count = 0; 
keys.GetCount(ref count); 

//temporarily store each key and display 
for (uint i = 0; i < count; i++) 
{ 
    keys.GetAt(i, ref key); 
    Console.WriteLine("fmtid " + key.fmtid + " pid " + key.pid); 
} 

これはサポートされているプロパティキーを表示するためのコードです。ルートフォルダのが、(例えば、内部ストレージのためのエクスプローラで)最初のフォルダのオブジェクトIDをない渡す場合は、私は非常にすべてのPropertyKeys¹を格納するためのクラスを作ることをお勧めします

WPD_STORAGE_CAPACITY _tagpropertykey 

、それは意志表示されますそれははるかによく見てください。

私はおそらくcgeersのチュートリアルを一見する必要があると思うので、私はそれをベースにします。

  1. 簡単にアクセスするために、あなたのPortableDeviceクラスにルートフォルダを追加します(例えば、内部ストレージのために前に述べたように)

    private readonly PortableDeviceFolder root = new PortableDeviceFolder("DEVICE", "DEVICE"); 
    public PortableDeviceFolder Root 
    { 
        get 
        { 
         return root; 
        } 
    } 
    
  2. はフォルダOBJECTIDのためのそのコードを使用し

    IPortableDeviceProperties properties; 
    content.Properties(out properties); 
    
    IPortableDeviceValues values; 
    properties.GetValues(objectId, keys, out values); 
    
    //capacity stored as UI8 in PropVariant as stated in ² -> ulong 
    ulong capacity = 0; 
    values.GetUnsignedLargeIntegerValue(WPD_STORAGE_CAPACITY_IN_OBJECTS, out capacity); 
    

このコードは、リフレッシュメソッド(およびサブメソッド)の部分と非常によく似ています。あなたのフォルダオブジェクトはすでに作成されています。

この情報をこのフォルダから取得できるという事実は、純知識/常識(Windowsエクスプローラにもそのフォルダの情報が表示されます)か、先頭の最初のコード行を実行することによって学習できます。

私自身 - PortableDeviceFolder構造を変更しました。この構造には、フォルダ内にあるPortableDeviceObjectのコレクションが含まれ、それぞれがその親を保存します。
の例では、あなたの私は、このコードを使用すると思いfolderId希望取得するためにフォルダのアクセスは、非常に容易であるように:

PortableDeviceCollection c = new PortableDeviceCollection(); 
c.Refresh(); 
PortableDevice device = c.First(); 
device.Root.RefreshFiles(); 
PortableDeviceFolder internalstorageFolder = (PortableDeviceFolder)device.Root.Files.First(); 

あなたはこのような構造を自分で実装しようか、完全に他の道を行くことができますが私はアクセスのための完璧な構造はないと思うので、何がベストになるかを理解する必要があります。

¹:https://github.com/gtaglang/WpdLib/blob/master/src/WpdLib/WpdProperties.cs

²:https://msdn.microsoft.com/de-de/library/ff597918(v=vs.85).aspx

関連する問題