Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表单:如何下载图像,在本地保存并在屏幕上显示?_C#_Xamarin_Xamarin.forms_Xamarin.essentials - Fatal编程技术网

C# 表单:如何下载图像,在本地保存并在屏幕上显示?

C# 表单:如何下载图像,在本地保存并在屏幕上显示?,c#,xamarin,xamarin.forms,xamarin.essentials,C#,Xamarin,Xamarin.forms,Xamarin.essentials,我在Android上的本机应用程序中打开JPG文件时遇到问题。 我使用的是最新版本的Xamarin Essentials,有一些功能叫做Launcher。 这是我的密码 await Launcher.TryOpenAsync("file:///" + localPath); 我的本地路径是存储在Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)中的文件 每当我试图打开该文件时,都会出现以下错误: f

我在Android上的本机应用程序中打开JPG文件时遇到问题。 我使用的是最新版本的Xamarin Essentials,有一些功能叫做Launcher。 这是我的密码

await Launcher.TryOpenAsync("file:///" + localPath);
我的本地路径是存储在
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)中的文件

每当我试图打开该文件时,都会出现以下错误:

file:////data/user/0/mypackagename/files/.local/share/Screenshot.jpg exposed beyond app through Intent.getData()
我在stackoverflow上找到了几种解决方案,但我不想使用Intent,因为我的应用程序设计为跨平台的(如果可能的话,我希望避免使用本机平台编码)

启动器在iOS上也会抛出错误:

canOpenURL: failed for URL: ** -- file:///" - error: "This app is not allowed to query for scheme file
我做错了什么?

步骤1:下载图像 我们可以使用
HttpClient
下载图像

HttpClient.GetByteArrayAsync
将检索图像数据并将其保存在内存中

在下面的
DownloadImage
中,我们将以
字节[]
的形式检索图像

静态类ImageService
{
静态只读HttpClient _client=新HttpClient();
公共静态任务下载映像(字符串imageUrl)
{
如果(!imageUrl.Trim().StartsWith(“https”,StringComparison.OrdinalIgnoreCase))
抛出新异常(“iOS和Android需要Https”);
返回_client.GetByteArrayAsync(imageUrl);
}
}
步骤2将映像保存到磁盘 现在我们已经下载了图像,我们将把它保存到磁盘上

Xamarin.Essentials.Preferences
允许我们使用键值对将项目保存到磁盘。由于
byte[]
只是一个指向内存的指针,我们必须首先将
byte[]
转换为base64字符串,然后才能将其保存到磁盘

静态类ImageService
{
静态只读HttpClient _client=新HttpClient();
公共静态任务下载映像(字符串imageUrl)
{
如果(!imageUrl.Trim().StartsWith(“https”,StringComparison.OrdinalIgnoreCase))
抛出新异常(“iOS和Android需要Https”);
返回_client.GetByteArrayAsync(imageUrl);
}
公共静态无效SaveToDisk(字符串imageFileName,字节[]imageAsBase64String)
{
Xamarin.Essentials.Preferences.Set(imageFileName,Convert.ToBase64String(imageAsBase64String));
}
}
步骤3:检索要显示的图像 现在我们已经下载了图像并将其保存到磁盘,我们需要能够从磁盘检索图像以将其显示在屏幕上

下面的
GetFromDisk
从磁盘检索图像并将其转换为
Xamarin.Forms.ImageSource

静态类ImageService
{
静态只读HttpClient _client=新HttpClient();
公共静态任务下载映像(字符串imageUrl)
{
如果(!imageUrl.Trim().StartsWith(“https”,StringComparison.OrdinalIgnoreCase))
抛出新异常(“iOS和Android需要Https”);
返回_client.GetByteArrayAsync(imageUrl);
}
公共静态无效SaveToDisk(字符串imageFileName,字节[]imageAsBase64String)
{
Xamarin.Essentials.Preferences.Set(imageFileName,Convert.ToBase64String(imageAsBase64String));
}
公共静态Xamarin.Forms.ImageSource GetFromDisk(字符串imageFileName)
{
var imageAsBase64String=Xamarin.Essentials.Preferences.Get(imageFileName,string.Empty);
返回ImageSource.FromStream(()=>new MemoryStream(Convert.FromBase64String(imageAsBase64String));
}
}
示例:在
Xamarin.Forms.ContentPage中使用
ImageService
class应用程序:应用程序
{
public App()=>MainPage=new MyPage();
}
类MyPage:ContentPage
{
只读图像_downloadeImage=新图像();
公共MyPage()
{
内容=_下载图像;
}
受保护的重写异步void OnAppearing()
{
常量字符串xamrainImageUrl=”https://cdn.dribbble.com/users/3701/screenshots/5557667/xamarin-studio-1_2x_4x.png"
常量字符串xamarinImageName=“XamarinLogo.png”;
var downloadeImage=等待ImageService.DownloadImage(xamrainImageUrl);
SaveToDisk(xamarinImageName,下载图像);
_downloadeImage.Source=ImageService.GetFromDisk(xamarinImageName);
}
}

你的目标是什么?是否要在屏幕上显示作为嵌入式资源保存的图像?我需要从服务器下载文件并以某种方式呈现它。我想这将是最简单的解决方案。明白了!我们将使用Xamarin.Essentials.Preferences从磁盘保存/检索文件。Xamarin.Essentials.Launcher用于打开其他应用程序,如设置或Twitter。@BrandonMinick如果您找到了解决方案,请添加一个描述您所做工作的答案,好吗?这将有助于未来的开发人员future@PaulKertscher当然我在11小时前回答了以下问题:我想在本机应用程序中打开此映像。这可能吗?我已经实现了类似于您的解决方案,但我对此不太满意。您能详细说明一下本机应用程序的含义吗?你在用Xamarin表格吗?是的,我在用Xamarin表格。我想下载jpg文件(完成了),然后在Android/iOS上的默认应用程序中打开该jpg(用这张照片打开照片浏览器)哦-好的。这是一个完全不同的问题,也是一个完全不同的过程。让我们这样做:打开一个新的问题与具体的解释,然后评论下面的链接,我们将回答它。我不想删除这个问题和这个答案,因为这两个问题都已经有了很多观点和投票,这意味着这个讨论对其他开发人员很有帮助。好的,这里有一个新问题: