无法访问文件:/// android_asset

时间:2017-01-24 00:36:33

标签: android xamarin xamarin.android

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

我尝试使用以下内容在我的应用程序中加载此文件:

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

            MyMapView.Map.OperationalLayers.Add(vtpkLayer);

我没有收到任何错误,但文件永远不会被加载。

如何在Android中访问此文件?

谢谢!

1 个答案:

答案 0 :(得分:3)

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

首先创建一个方法来获取读取流并写入写入流并将资源写入文件:

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();
}

然后从资产中获取读取流:

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");