Невозможно загрузить шрифт для использования с ImageSharp в приложении Xamarin для Android

У меня есть приложение Xamarin Forms, в которое я включил файл шрифтов Roboto-Regular.ttf в папке "Ресурсы" проекта Android. Его действие по сборке установлено на AndroidAsset,

С использованием SixLabors.Fonts Пакет NuGet, я пытаюсь загрузить этот шрифт, чтобы использовать его для водяных знаков.

Однако при попытке установить шрифт с использованием потока ресурсов выдается исключение, говорящее:

System.NotSupportedException: указанный метод не поддерживается.

var fonts = new FontCollection();

FontFamily fontFamily;

using (var fontStream = Assets.Open("Roboto-Regular.ttf"))
{
    fontFamily = fonts.Install(fontStream); // Fails with "method not supported"
}

return fontFamily;

Любые идеи, которые могут быть причиной этого, или если есть лучший способ загрузить шрифты для использования с SixLabors.ImageSharp пакет?

Изменить: я попробовал предложение ниже SushiHangover, но он дает тот же результат:

Поток ресурсов Android в Xamarin

2 ответа

Решение

Кажется основной Stream не имел Length или же Position свойства (что объясняет исключение), поэтому на данный момент я прибег к преобразованию в поиск MemoryStream вместо:

using (var assetStreamReader = new StreamReader(Assets.Open("Roboto-Regular.ttf"))
{   
    using (var ms = new MemoryStream())
    {
        assetStreamReader.BaseStream.CopyTo(ms);

        ms.Position = 0;

        var fontFamily = new FontCollection().Install(ms);
    }
}

Глядя на FontReader В реализации, ошибка теперь имеет еще больший смысл: https://github.com/SixLabors/Fonts/blob/master/src/SixLabors.Fonts/FontReader.cs

Тем не менее, я не уверен, почему Assets не возвращает искомый поток?

Есть два Assets.Open методы и один обеспечивает accessMode (Установлен флаг перечисления доступа C#):

using (var fontStream = Assets.Open("Roboto-Regular.ttf", Android.Content.Res.Access.Random))
{
    fontFamily = fonts.Install(fontStream); 
}

re: https://developer.android.com/reference/android/content/res/AssetManager.html

public enum Access
{
    [IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_BUFFER")]
    Buffer = 3,
    [IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_RANDOM")]
    Random = 1,
    [IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_STREAMING")]
    Streaming,
    [IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_UNKNOWN")]
    Unknown = 0
}
Другие вопросы по тегам