首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin.Essentials FilePicker导致app重新启动

Xamarin.Essentials FilePicker导致app重新启动
EN

Stack Overflow用户
提问于 2022-01-08 13:17:57
回答 1查看 359关注 0票数 2

我们有一个Xamarin窗体应用程序,它有一个选项卡视图。在其中一个选项卡中,我们打开一个新的内容页,它需要有一个选项来选择文件和上传附件。使用Xamarin.Essentials FilePicker,我们可以选择文件并读取文件内容,但是在读取文件之后,应用程序自动导航到主屏幕--就像应用程序重新启动一样。

我们已经观察到,当文件选择器打开时,App.xaml.cs中的App.xaml.cs被调用,当文件被读取,选择器被取消时,App.xaml.cs中的恢复文件就会被调用。这似乎会导致XForms应用程序完全重新启动。

所有权限都到位了--我们的目标是Android9.0,使用的是XForms版本4.8,X.Essentials版本1.6。

你能帮忙吗?

相关守则:

代码语言:javascript
复制
            try
            {
                var file = await FilePicker.PickAsync();
                if (file != null)
                {
                    var stream = await file.OpenReadAsync();
                    byte[] FileData = new byte[stream.Length];
                    await stream.ReadAsync(FileData, 0, (int)(stream.Length - 1));
                    fileData = Convert.ToBase64String(FileData);
                    fileStream = new MemoryStream(FileData);
                    FileNameVisibility = true;
                    FileName = file.FileName;
                }
            }
            catch (Exception ex)
            {
                Crashes.TrackError(ex);
            }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-08 22:37:23

测试文档中的代码片段

此代码适用于我:

FilePickerPage.xaml:

代码语言:javascript
复制
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="XFSOAnswers.FilePickerPage">
    <ContentPage.Content>
        <StackLayout>
            <Button Text="Pick File" Clicked="PickFileButton_Clicked" />
            <Label x:Name="FileName" />
            <Image x:Name="FileImage" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

FilePickerPage.xaml.cs:

代码语言:javascript
复制
using System;
using System.Threading.Tasks;
using Xamarin.Essentials;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace XFSOAnswers
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class FilePickerPage : ContentPage
    {
        public FilePickerPage()
        {
            InitializeComponent();
        }

        private void PickFileButton_Clicked(object sender, EventArgs e)
        {
            Device.BeginInvokeOnMainThread(async () =>
            {
                await PickAndShow(PickOptions.Images);
            });
        }

        async Task<FileResult> PickAndShow(PickOptions options)
        {
            try
            {
                var result = await FilePicker.PickAsync(options);
                if (result != null)
                {
                    FileName.Text = $"File Name: {result.FileName}";
                    if (result.FileName.EndsWith("jpg", StringComparison.OrdinalIgnoreCase) ||
                        result.FileName.EndsWith("png", StringComparison.OrdinalIgnoreCase))
                    {
                        var stream = await result.OpenReadAsync();
                        FileImage.Source = ImageSource.FromStream(() => stream);
                    }
                }

                return result;
            }
            catch (Exception ex)
            {
                // The user canceled or something went wrong
                _ = ex;
            }

            return null;
        }
    }
}

App.xaml.cs:

代码语言:javascript
复制
...
MainPage = new StartPage();

StartPage:

代码语言:javascript
复制
... had a button to go to FilePickerPage.

因此,StartPage在堆栈上,然后是FilePickerPage。

在完成FilePicker之后,FilePickerPage仍然显示-带有文件名和图像:

MainActivity.cs:

代码语言:javascript
复制
protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    ...
}


public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
    Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

注意:上面的MainActivity代码应该会自动出现在任何新的Xamarin表单项目中;只有当这是一个旧的项目时,它才会丢失,然后由项目模板自动添加Essential。

那么,如何调试您的代码。

  1. 首先注释掉所有的代码
代码语言:javascript
复制
    if (file != null) { ... }

当评论被删除时,会不会崩溃?

  1. 包装您展示的整个代码片段:
代码语言:javascript
复制
    Device.BeginInvokeOnMainThread( async () => {
        ... YOUR CODE ...
    });
  1. 是的,OnSleep / OnResume确实会接到电话。不,这不一定是“重新启动应用程序”。

也许您的导航堆栈是空的?当FilePicker关闭时,可能没有地方可以回去了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70632689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档