2017-10-03 2 views
0

Ich versuche, eine Datei von meiner UWP App Sandbox zu teilen.UWP DataTransferManager ShowShareUI() öffnet Sharing-Dialog mit „Diese App ist gerade nicht teilen kann“ und schließt es sofort nach

Nach MS-Dokumentation auf dieser Seite scheint die Implementierung ziemlich geradlinig zu sein; aber ich habe Probleme https://docs.microsoft.com/en-us/windows/uwp/app-to-app/share-data

I erstellt DataTransferManager und befestigt DataRequested Ereignis in c-tor meiner Klasse nach Erklärung für den Artikel:

DataTransferManager dataTransferManager; 

public MainPage() 
{ 
    this.InitializeComponent(); 
    ... 
    dataTransferManager = DataTransferManager.GetForCurrentView(); 
    dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.OnDataRequested); 
} 

Als nächstes wird in einem Verfahren, das von Hintergrund-Thread aufgerufen wird ich rufe ShowShareUI sicherstellen, dass es auf dem Hauptthread führt

Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
{ 
    DataTransferManager.ShowShareUI(); //THIS CALL SHOWS A POPUP AND IMMEDIATELLY CLOSES IT 
}).AsTask().Wait(); 

Da ist in meinem OnDataRequested Ereignis, füge ich die Datei möchte ich teilen:

private async void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args) 
{ 
    // get the file from application sandbox 
    StorageFile attachmentFile = await StorageFile.GetFileFromPathAsync(@"C:\Users\ME\AppData\Local\Packages\f040f23f-....-84\LocalState\logs\MYLOG.log"); 
    DataRequest request = args.Request; 
    request.Data.Properties.Title = "My Log File"; 
    request.Data.Properties.Description = "Sharing MYLOG file."; 
    List<IStorageItem> storage = new List<IStorageItem>() 
    { 
     attachmentFile 
    }; 
    request.Data.SetStorageItems(storage); 
} 

aber nichts passiert. Ich hatte keine Möglichkeit, irgendetwas in dem Dialog auszuwählen, der sich für eine halbe Sekunde öffnete und schloss. So sieht der Dialog aus, er öffnet und schließt fast sofort nach dem Öffnen, er zeigt nur "Diese App kann momentan nicht teilen".

enter image description here

Antwort

1

Es herausgefunden, folgt die Lösung für mein Problem.

Added globale Variable in MainPage.xaml.cs:

private DataTransferManager dataTransferManager; 

Im Konstruktor Mainpage, hat dieses Bild

dataTransferManager = DataTransferManager.GetForCurrentView(); 
dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.OnDataRequested); 

Bis zu diesem Punkt hat mein Code nicht ändern, aber als nächstes kommt Aufruf ShowShareUI und dieser Aufruf wurde ursprünglich von einem Hintergrundthread aufgerufen, aber mithilfe von Dispatcher an den UI-Thread gesendet (siehe Originalbeitrag). Ich weiß immer noch nicht, warum es so funktioniert, wie ich es ursprünglich erklärt habe, aber es funktioniert nicht, aber nachdem ich den Code wie unten geändert habe, funktioniert es jetzt.So initiieren auf die Schaltfläche klicken Sie auf den UI-Thread teilen

private void Button_Click() 
{ 
    DataTransferManager.ShowShareUI(); 
} 

Dieser Event-Handler durch den obigen Aufruf ShowShareUI ausgelöst wird():

private async void DataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) 
{ 
    DataRequestDeferral deferral = args.Request.GetDeferral(); 

    // MyLogger has SendLogs method but calling this in Button_Click above will not work and the Share 
    // dialog will just open and close. Moving it down to this event solves the issue. 
    MyLogger.SendLogs(async logpath => 
    { 
     await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => 
     { 
      StorageFile myFile = await StorageFile.GetFileFromPathAsync(logpath); 

      DataRequest request = args.Request; 
      request.Data.Properties.Title = "Share My Logs"; 
      request.Data.Properties.Description = string.Format("Share log file {0}.", myFile.DisplayName); 

      List<IStorageItem> myStorageItems = new List<IStorageItem>() { myFile }; 
      request.Data.SetStorageItems(myStorageItems); 
      deferral.Complete(); 
     }); 
    }); 
} 

Das ist mein Problem behoben hat

+0

Ich hatte das gleiche Problem. Löste es Entfernen ** request.FailWithDisplayText() ** – Adriano

+0

Wie ist das mit diesem Problem verbunden? Tx – pixel

1

StorageFile attachmentFile = StorageFile.GetFileFromPathAsync erwarten (@ "C: \ Benutzer \ ME \ AppData \ Local \ Packages \ f040f23f -....- 84 \ LocalState \ logs \ MYLOG.log ");

In UWP konnten Sie Dateien nicht direkt aus dem Pfad abrufen.

UWP-Anwendungen laufen Sandboxed und haben sehr begrenzten Zugriff auf das Dateisystem. Zum größten Teil können sie direkt auf ihren Installationsordner und ihren Anwendungsdatenordner zugreifen. Sie sind nicht berechtigt, anderswo auf das Dateisystem zuzugreifen. Rob hat diesen Punkt in seinem Blog erklärt Skip the path: stick to the StorageFile

So würde der Code wie geändert werden wie folgt vor:

StorageFolder logsFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync("logs"); 
StorageFile file = await logsFolder.GetFileAsync("MYLOG.log"); 

Bitte Code ändern und versuchen, Ihre App erneut laufen Gesicht zu sehen, wenn Sie noch dieses Problem.

+0

Aber in Mein Fall oben, es greift auf die Datei in App-Anwendung Datenordner (Sandbox). Der angegebene Pfad ist der Pfad zur App-Sandbox. Das funktioniert und ich weiß es, weil ich zuerst versuchte, die Datei an eine neue E-Mail anzuhängen, nur um herauszufinden, dass das nur mit der E-Mail-App aus dem App Store funktioniert, aber nicht mit irgendeiner anderen Win32-App, die es unbrauchbar macht. Auf die Datei wird also hier richtig zugegriffen und sie wird abgerufen. Danke – pixel

+0

... BTW, das gleiche Problem existiert, wenn ich Code ändere, wie Sie vorschlugen. Der Aufruf von ShowShareUI() öffnet den Freigabe-Dialog, aber zu dem Zeitpunkt, zu dem das Ereignis OnDataRequested() eingegeben wurde (Haltepunkte), wird das Dialogfeld bereits geschlossen. Kein Unterschied – pixel

Verwandte Themen