无法在Xamarin Android应用中加载供ImageSharp使用的字体

时间:2018-09-19 10:18:13

标签: android xamarin xamarin.forms xamarin.android imagesharp

我有一个Xamarin Forms应用程序,其中在Android项目的 Assets 文件夹中包含了一个名为transactions: [{ item_list: { items: [...categoryItem, ...ordersItems] }, amount: { currency: 'INR', total: reg.totalBill } }] 的字体文件。其构建操作设置为Roboto-Regular.ttf

我使用AndroidAsset NuGet包,尝试加载该字体以将其用于水印。

但是,尝试使用资产流安装字体时,抛出异常:

  

System.NotSupportedException:不支持指定的方法。

SixLabors.Fonts

有什么想法会导致这种情况,或者是否有更好的方法来加载字体以供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; 包使用?

编辑:我尝试了以下SushiHangover的建议,但产生的结果相同:

Android asset stream in Xamarin

2 个答案:

答案 0 :(得分:0)

似乎底层的Stream没有LengthPosition属性(这解释了例外情况),所以现在我改为采用可搜索的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为什么不返回可搜索的流吗?

答案 1 :(得分:0)

有两种Assets.Open方法,一种提供了accessMode(设置了C#Access枚举标志):

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#open(java.lang.String,%20int)

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
}