2017-01-24 9 views
1

私のアプリケーションの"Assets"フォルダにファイルmyfile.vtpkがあります。ファイルにアクセスできないファイル:/// android_asset

私は、以下のものを使用して自分のアプリケーションでこのファイルのファイルをロードしようとしています:

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

      MyMapView.Map.OperationalLayers.Add(vtpkLayer); 

私はエラーを取得していないが、ファイルがロードされたことはありません。

Androidでこのファイルにアクセスするにはどうすればよいですか?

ありがとうございます!

+1

私はXamarinが何のために話すことはできませんが、普通のAndroidアプリの開発では、 'ファイル:/// android_asset'はWebView''によって使用されるものですが、少しelse。 – CommonsWare

+0

@CommonsWare - Androidでファイルを読み込む方法のサンプルを教えてください。どこにファイルを置いても、私はファイルにアクセスできないようです。それは行く必要がある特定のディレクトリがあるようだが、私はそれを見つけることができません。 – UndefinedReference

+0

@CommonsWare - 私は、ファイル:///mnt/sdcard/map.vtpkを参照している人々に見てきましたが、ファイルを最初に保存するアプリケーションのディレクトリをどこで見つけるかわかりません。 – UndefinedReference

答えて

3

アセットフォルダ内のファイルがAPKにコンパイルされているため、アセットフォルダ内のファイルには「Uri」、APK内にはそのファイルはありません。 Uriを渡す必要がある場合は、そのAssetをドキュメントやアプリケーションの別のフォルダにコピーして、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); 

最後に、コピーメソッドのcrea上記テッド:

ReadWriteStream(readStream, writeStream); 

今、あなたはpathToWriteFileにパスでファイルにアクセスすることができるはずです。

EDIT:下記のコメントに従って、AssetFileDescriptorを最初に取得する代わりに、以下を試してください。置き換え:

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

で:

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

@ jgoldberger- 'java.io.FileNotFoundException:このファイルをファイルディスクリプタとして開くことはできません。それはおそらく圧縮されている。これは.vtpkファイルです。そのエラーを回避する方法はありますか? – UndefinedReference

+0

Hmm .. Assets.OpenFd(...)の代わりにAssets.Open(...)を使用してみてください。このオプションを表示するために編集された回答 – jgoldberger

+0

ありがとう、それは働いた。あなたは素晴らしいです。私は先に進み、あなたの答えを受け入れます。 – UndefinedReference

関連する問題