2017-08-25 17 views
3

現在、私はXamarin.Formsを使用して、Androidプロジェクトから "json"ファイルをロードしようとしています。ここでXamarin.Forms FileStream - ファイルが見つかりません

は私のコードです:パスについては

var path = @"client_secret.json"; 
using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read)) 
{ 
} 

私は、プロジェクトのルートフォルダに「client_secret.json」を配置するために、さまざまなケースを試してみました、資産フォルダ、ビン、ビン>デバッグ、ビン>リリースと同様のため".Droid"プロジェクトとPCLも。私はまた、ファイルのビルドアクションを "コンテンツ"、 "埋め込みリソース"、 "追加ファイル"、 "AndroidResource"、 "AndroidEnvironment"に変更しようとしました。異なるフォルダにそれを見つけることを試みる:私は「client_secret.json」に変更し、物理パス(\アプリ.... \ Project.Androidの\ client_secret.json Dを):使用することも試み

Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath 

Directory.GetFiles(Directory.GetCurrentDirectory()) 

Directory.GetFiles(Android.OS.Environment.RootDirectory.AbsolutePath) 

Directory.GetFiles(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)) 

そして、まだどこにでも私はそれを見つける。 "Copy to output"ファイルのプロパティが "Copy always"に変更され、結果が残っていません。

このファイルでFileStreamを作成するには、誰かが私が間違っていることを知っていますか? FileStreamを使用するためには、事前

答えて

3

おかげ - あなたはおそらく絶対ファイルパス名が必要になります。アセットファイルでは不可能です(WebViewなどのURL構文file:///android_asset/...は使用できますが、FileStreamでは使用できない場合があります)。

What you can do is get access to InputStream using AssetManagerGoogleClientSecrets.Load()の方法と互換性がある)。

using(var stream = this.Assets.Open(@"client_secret.json")) 
{ 
    var secrets = GoogleClientSecrets.Load(stream).Secrets; 
    ... 

2.別のオプションは、copy your asset file to storageになり、その後、先のパスを使用してFileStreamにしようとすると、アクセスう。

var path = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), @"client_secret.json"); 
using (var asset = Assets.Open("client_secret.json")) 
    using (var dest = System.IO.File.Create(path)) 
     asset.CopyTo(dest); 

using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read)) 
{ 
    var secrets = GoogleClientSecrets.Load(stream).Secrets; 
    ... 

注:オプション1、及び2について、 add this json file as an asset to android app

3.次のオプションwould be to use embedded resourcesにあなたが手順に従っていることを確認してください - あなたはAssembly.GetManifestResourceStream()を使用してファイルにアクセスすることができます。

var assembly = typeof(MainActivity).GetTypeInfo().Assembly; 
using (var stream = assembly.GetManifestResourceStream("AssemblyNamespace.client_secret.json")) 
{ 
    var secrets = GoogleClientSecrets.Load(stream).Secrets; 
    ... 

注:オプション3については、手順を必ず守ってください。add this json file as an embedded resource to android app or assembly

+0

こんにちは、あなたの答えに感謝します。私は3番目のオプションを使用しようとしましたが、 "GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(ストリーム).Secrets、Scopes、" user "、CancellationToken.None)を待っています; "指定されたファイルを見つけることができません"というメッセージが表示される –

+0

3番目のオプション - resource-idを指定するときに間違った名前空間を使用するのは非常に簡単です。あなたが正しいものを使用していることを確認してください。また、オプション1または2を試してみましたか? – Ada

+0

また、受け取った例外のスタックトレースをいくつか共有できますか? – Ada

3
+0

ありがとうございます。しかし、私はそれをFileStreamとして読むことができますか?後者は "FileStream"タイプが必要なメソッドを使用しているためです。 ありがとう –

+0

私は認識していません。 FileStreamでしか動かないものは何ですか? – Jason

+0

Google APIから来たDriveServiceを使用しようとしています。しかし、その前に私は彼のファイルにアクセスできるように、私はユーザーを認証する必要があります。 Googleの公式ドキュメントでは、認証を成功させるために、「client_secret.json」でFileStreamを使用する必要があります。 –

関連する問題