目前我正在尝试使用Xamarin.Forms从我的Android项目加载文件“json”。
这是我的代码:
var path = @"client_secret.json";
using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
}
对于路径,我尝试了很多不同的情况,将“client_secret.json”放在项目根文件夹,资产文件夹,bin,bin> Debug,bin> Release以及“.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吗?
提前致谢
答案 0 :(得分:3)
AssetManager assets = this.Assets;
using (StreamReader sr = new StreamReader (assets.Open ("client_secret.json")))
{
content = sr.ReadToEnd ();
}
答案 1 :(得分:3)
1。为了使用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
的步骤操作
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
的步骤操作