Windows Phone 8.1共享截图时,WinRT在共享应用中不附加图片

本文关键字:共享 应用 Phone Windows WinRT | 更新日期: 2023-09-27 18:02:54

我想分享我的应用程序的截图。截图保存到手机的图片库中,然后作为StorageFile共享

问题是,图片没有附加到共享应用程序。我已经确认截图已成功保存在手机图片库中。

这是我的代码。我错过了什么?

    private async void askFacebook()
    {
        // Render some UI to a RenderTargetBitmap
        var renderTargetBitmap = new RenderTargetBitmap();
        await renderTargetBitmap.RenderAsync(this.gridRoot, (int)this.gridRoot.ActualWidth, (int)this.gridRoot.ActualHeight);
        // Get the pixel buffer and copy it into a WriteableBitmap
        var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
        var width = renderTargetBitmap.PixelWidth;
        var height = renderTargetBitmap.PixelHeight;
        var wbmp = await new WriteableBitmap(1, 1).FromPixelBuffer(pixelBuffer, width, height);
        imageToShare = await saveWriteableBitmapAsJpeg(wbmp, string.Format("{0}.jpg", getAppTitle()));
        DataTransferManager.ShowShareUI();
    }
    private string getAppTitle()
    {
        // Get the assembly with Reflection:
        Assembly assembly = typeof(App).GetTypeInfo().Assembly;
        // Get the custom attribute informations:
        var titleAttribute = assembly.CustomAttributes.Where(ca => ca.AttributeType == typeof(AssemblyTitleAttribute)).FirstOrDefault();
        // Now get the string value contained in the constructor:
        return titleAttribute.ConstructorArguments[0].Value.ToString();
    }
    private async Task<StorageFile> saveWriteableBitmapAsJpeg(WriteableBitmap bmp, string fileName)
    {
        // Create file in Pictures library and write jpeg to it
        var outputFile = await KnownFolders.PicturesLibrary.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
        using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
        {
            await encodeWriteableBitmap(bmp, writeStream, BitmapEncoder.JpegEncoderId);
        }
        return outputFile;
    }
    private async Task encodeWriteableBitmap(WriteableBitmap bmp, IRandomAccessStream writeStream, Guid encoderId)
    {
        // Copy buffer to pixels
        byte[] pixels;
        using (var stream = bmp.PixelBuffer.AsStream())
        {
            pixels = new byte[(uint)stream.Length];
            await stream.ReadAsync(pixels, 0, pixels.Length);
        }
        // Encode pixels into stream
        var encoder = await BitmapEncoder.CreateAsync(encoderId, writeStream);
        var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;
        encoder.SetPixelData(BitmapPixelFormat.Bgra8, 
            BitmapAlphaMode.Premultiplied,
           (uint)bmp.PixelWidth, 
           (uint)bmp.PixelHeight,
           logicalDpi, 
           logicalDpi, 
           pixels);
        await encoder.FlushAsync();
    }

    private void ShareImageHandler(DataTransferManager sender,  DataRequestedEventArgs e)
    {
        DataRequest request = e.Request;
        request.Data.Properties.Title = "Ask Social Media";
        request.Data.Properties.Description = "Do you know the answer to this question?";
        // Because we are making async calls in the DataRequested event handler,
        //  we need to get the deferral first.
        DataRequestDeferral deferral = request.GetDeferral();
        // Make sure we always call Complete on the deferral.
        try
        {
            request.Data.SetBitmap(RandomAccessStreamReference.CreateFromFile(imageToShare));
        }
        finally
        {
            deferral.Complete();
        }
    }

Windows Phone 8.1共享截图时,WinRT在共享应用中不附加图片

显然对于Windows Phone,图像需要是一个StorageItem,因为SetBitmap方法只适用于Windows 8.x

对于Windows phone,而不是

request.Data.SetBitmap(RandomAccessStreamReference.CreateFromFile(imageToShare));

我创建了一个存储项目,并使用SetStorageItems来共享它。它可以与本地Windows Phone应用程序一起使用,如电子邮件、OneNote,但我还没有测试过它在Facebook、Twitter等平台上的共享功能。

 var imageItems = new List<IStorageItem>();
 imageItems.Add(imageToShare);
 request.Data.SetStorageItems(imageItems);