Atif Shabeer
Atif Shabeer

Reputation: 555

Windows Phone 8.1 Share Contract

I wrote a Windows Phone 8.1 (WINRT) App. I am trying to share an image from my app which is in LocalStorage of the app. I am using Windows Phone 8.1 Share Contract.

private async void OnShareDataRequested(DataTransferManager sender, DataRequestedEventArgs _dataRequestedEventArgs)
{
    _dataRequestedEventArgs.Request.GetDeferral();
    List<StorageFile> ListObject = new List<StorageFile>();
    Uri UriObject = new Uri(FileLocation,UriKind.RelativeOrAbsolute);

    _dataRequestedEventArgs.Request.Data.Properties.Title = "Dr. App";
    _dataRequestedEventArgs.Request.Data.Properties.Description = "Photo from my Dr. App Album.";


    StorageFolder StorageFolderObject;
    StorageFile StorageFileObject;
        try
        {

            StorageFolderObject = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFolderAsync(LocalCache);
            StorageFileObject = await StorageFolderObject.GetFileAsync(FileNameSaved);

            _dataRequestedEventArgs.Request.Data.Properties.Thumbnail = RandomAccessStreamReference.CreateFromFile(StorageFileObject);
            _dataRequestedEventArgs.Request.Data.SetBitmap(RandomAccessStreamReference.CreateFromFile(StorageFileObject));


            ListObject.Add(StorageFileObject);
            _dataRequestedEventArgs.Request.Data.SetStorageItems(ListObject);
        }
        catch(Exception ex_)
        {

        }
        finally
        {
            _dataRequestedEventArgs.Request.GetDeferral().Complete();

        }


}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    DataTransferManager.GetForCurrentView().DataRequested -= OnShareDataRequested;
    base.OnNavigatedFrom(e);
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    DataTransferManager.GetForCurrentView().DataRequested += OnShareDataRequested;
    base.OnNavigatedTo(e);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
    DataTransferManager.ShowShareUI();
}

I am getting PREPARING CONTENT TO SHARE and then it vanishes in a second. ShareUI doesnt open.

Upvotes: 1

Views: 262

Answers (1)

Kasper Holdum
Kasper Holdum

Reputation: 13363

The documentation states that the asynchronous work has an upper limit of 200 ms. Are you violating this premise?

DataRequest.GetDeferral(): Use this method when you want to use an asynchronous function call to generate the DataPackage during a share operation. This function must return a DataPackage object within 200ms to prevent the operation from timing out. If your app shares content that takes more time to package, such as a collection of files or photos, don't use this method. Instead, use the SetDataProvider method to assign a delegate to a DataPackage and return that DataPackage to the target app.

Another thing that stands out to me when I look at your code is that you invoke the GetDeferral method twice instead of saving the result from the first invocation.

Upvotes: 1

Related Questions