如何获取 Uno 平台中包含资产的 uri?

How to get uri to included asset in Uno Platform?

为了与 android 绑定项目集成,我需要提供一个指向 .zip 文件的 Uri,我已将其包含在资产中并指定为 AndroidAsset。如何获取此类文件的 Uri? 我已经尝试过 ms-appx:///Assets/file.zipfile:///Assets/file.zip

更新: 需要注意的是,使用 Uri 的函数是 Android 本机代码,所以我怀疑 ms-appx:// 没有得到正确解析。

更新2: 无法提供流。 我调用的方法显示在此处的示例中:https://github.com/Laerdal/Xamarin.Nordic.DFU.Android/blob/7244627c09e97e05ee2c8e05744f19055981486b/Sample/Nordic/FirmwareUpdater.cs#L27.

_dfuServiceInitiator.SetZip(firmwareZipFile);

本机实现如下所示:https://github.com/NordicSemiconductor/Android-DFU-Library/blob/07bdaa50cfc5786790bf1ac589b14931de65d099/dfu/src/main/java/no/nordicsemi/android/dfu/DfuServiceInitiator.java#L620

public DfuServiceInitiator setZip(@NonNull final Uri uri) {
    return init(uri, null, 0, DfuBaseService.TYPE_AUTO, DfuBaseService.MIME_TYPE_ZIP);
}

方法 StorageFile.GetFileFromApplicationUriAsync 可用于从 ms-appx Uri 获取 StorageFile 对象。

然后可以使用StoragFilePath属性获取本地的android路径。请注意将文件的构建操作设置为 Content.

var file = await StorageFile.GetFileFromApplicationUriAsync(new System.Uri("ms-appx:///Assets/file.zip"));
Android.Net.Uri zipUri = Android.Net.Uri.Parse("file:///"+file.Path);

StorageFile.GetFileFromApplicationUriAsync() 方法读取的文件可能不是 return UWP 上的稳定路径,尤其是在 Android 或 WebAssembly 上,文件不是必须在文件系统上。

在 Android 上,该文件是 Stream 直接从 APK 文件构建的,在 WebAssembly 上它存储在一个临时位置。

为了保持文件的稳定副本,请使用以下内容:

var file = await StorageFile.GetFileFromApplicationUriAsync(new System.Uri("ms-appx:///TextFile.txt"));
var newFile = await file.CopyAsync(Windows.Storage.ApplicationData.Current.LocalFolder, file.Name, NameCollisionOption.ReplaceExisting);

var txt = await FileIO.ReadTextAsync(newFile);