android - 无法访问文件 :///android_asset 中的文件

标签 android xamarin xamarin.android

我的应用程序的 "Assets" 文件夹中有一个文件 myfile.vtpk

我正在尝试使用以下方法在我的应用程序中加载此文件:

            Uri vtpkUri = new Uri("file:///android_asset/myfile.vtpk");
            ArcGISVectorTiledLayer vtpkLayer = new ArcGISVectorTiledLayer(vtpkUri);

            MyMapView.Map.OperationalLayers.Add(vtpkLayer);

我没有收到任何错误,但文件从未加载过。

如何在 Android 中访问此文件?

谢谢!

最佳答案

由于 Assets 文件夹中的文件被编译到 APK 中, Assets 文件夹中的文件或 APK 中的任何文件都没有“Uri”。如果您需要能够传递 Uri,您可能希望将 Assets 复制到您的文档或应用程序的其他文件夹,然后获取 Uri。

首先创建一个方法来获取读取流和写入流并将您的 Assets 写入文件:

private void ReadWriteStream(Stream readStream, Stream writeStream)
{
    int Length = 256;
    Byte[] buffer = new Byte[Length];
    int bytesRead = readStream.Read(buffer, 0, Length);
    // write the required bytes
    while (bytesRead > 0)
    {
          writeStream.Write(buffer, 0, bytesRead);
           bytesRead = readStream.Read(buffer, 0, Length);
    }
    readStream.Close();
    writeStream.Close();
}

然后从 Assets 中获取读取流:

AssetFileDescriptor afd = Assets.OpenFd("filenameinAssetsfolder.ext");
var readStream = afd.CreateOutputStream();

然后创建文件路径和写入流:

// This will be your final file path
var pathToWriteFile = 
    Path.Combine (System.Environment.GetFolderPath 
    (System.Environment.SpecialFolder.Personal), 
    "filenametowrite.ext"); 
FileStream writeStream = 
    new FileStream(pathToWriteFile, 
    FileMode.OpenOrCreate, 
    FileAccess.Write);

最后调用上面创建的复制方法:

ReadWriteStream(readStream, writeStream);

现在您应该能够访问路径在 pathToWriteFile 中的文件。

编辑:根据下面的评论,尝试以下操作而不是先获取 AssetFileDescriptor。替换:

AssetFileDescriptor afd = Assets.OpenFd("filenameinAssetsfolder.ext");
var readStream = afd.CreateOutputStream();

与:

Stream readStream = Assets.Open("filenameinAssetsfolder.ext");

关于android - 无法访问文件 :///android_asset 中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41818136/

相关文章:

android - 带有搜索 EditText 的 MvvmCross Droid MvxListView?

android - Xamarin OpenCV ICvCameraViewListener

android - RecyclerView Adapter - NotifyItemRemoved - 删除的项目在滚动后再次出现

javascript - 有没有办法在 webview 中拦截 javascript 触发的 URL?

android - 在结束 ListView android中添加项目

java - Android Fatal : Error java. 创建 Socket 时单击按钮时出现 lang.IllegalStateException

android - 如何访问 android xamarin 表单中工具栏图像的点击或单击

c# - 从 Xamarin 表单启动 android 服务

android - 调试 .NET MAUI android 应用程序时断点未命中

android - 可扩展 ListView 中的自定义图标具有扭曲的尺寸