2017-08-25 51 views
3

目前我正嘗試從我的Android項目中使用Xamarin.Forms加載文件「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」,並使用物理路徑(d:\ APPS .... \ Project.Android \ client_secret.json),並試圖找到它在不同的文件夾:

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

而且還我找不到它。 「複製到輸出」文件屬性更改爲「始終複製」,仍然沒有結果。

有沒有人知道我在做什麼錯在這種情況下,使FileStream在這個文件上?

在此先感謝

回答

3

爲了使用FileStream - 你將最可能需要的絕對文件路徑名;這對於資產文件是不可能的(有些情況下,您可以像在WebView等中那樣使用URL語法file:///android_asset/...,但在FileStream中不能);

What you can do is get access to InputStream using AssetManager,這應該與GoogleClientSecrets.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

下一個選項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-rd選項,但在「等待GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets,Scopes,」user「,CancellationToken.None);」我收到「無法找到指定文件」 –

+0

第三種選擇 - 在指定資源ID時很容易錯過並使用錯誤的名稱空間。請確保你使用的是正確的。另外,你有機會嘗試選項1或2嗎? – Ada

+0

另外,你可以請你分享你收到的例外堆棧跟蹤。 – Ada

3
+0

謝謝您的回答。但是,我可以將它作爲FileStream讀取嗎?因爲後者我正在使用需要「FileStream」類型的方法。 謝謝 –

+0

不是我所知道的。你想做什麼,只會使用FileStream? – Jason

+0

我正在嘗試使用來自Google API的DriveService。但在此之前,我必須對用戶進行身份驗證,以便我可以訪問他的文件。在Google的官方文檔中,爲了實現成功的身份驗證,我必須使用FileStream以及它們提供的「client_secret.json」。 –