【问题标题】:Xamarin.FilePicker returns null FileData objectsXamarin.FilePicker 返回 null FileData 对象
【发布时间】:2018-12-16 14:29:28
【问题描述】:

我正在尝试在 xamarin.Forms 上实现包“FilePicker”,但不幸的是没有成功。

这是 XAML.cs 中的代码:

using System;
using Xamarin.Forms;
using Plugin.FilePicker;
using Plugin.FilePicker.Abstractions;

namespace FilesTest
{
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();

    }

    async void Pic()
    {
        try
        {
            FileData fileData = await CrossFilePicker.Current.PickFile();
            if (fileData == null) {
                Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
                return; // user canceled file picking
            }
            string fileName = fileData.FileName;
            string contents = System.Text.Encoding.UTF8.GetString(fileData.DataArray);

            System.Console.WriteLine("File name chosen: " + fileName);
            System.Console.WriteLine("File data: " + contents);
        }
        catch (Exception ex)
        {
            System.Console.WriteLine("Exception choosing file: " + ex.ToString());
        }
    }

    private void PickFileButton_Clicked(object sender, EventArgs e)
    {
        Pic();
    }
}
}

edit:对于那些询问的人,我正在尝试让它在 android 上运行,我的 AndroidManifest.xml 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.FilesTest">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="27" />
<application android:label="FilesTest.Android"></application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>

(XAML 中的代码只是一个简单的按钮,在被点击时会调用 PickFileButton_Clicked() 方法)

经过数小时的调试,除了那些“~”字符外,我的控制台上没有写入任何其他内容...我知道 FileData 对象在文件选择后为空(不,正在选择的文件是一个简单的文本文件...),但我找不到任何关于它为什么会发生的信息。有谁知道为什么 FileData 对象为空?请帮忙。

【问题讨论】:

  • 您是否按照文档中标记为重要部分的步骤进行操作?
  • @Jason 如果您链接到这些文档可能会有所帮助...
  • 这是安卓还是iOS?您是否设置了权限和权限请求?如果是 Android,Logcat 会说什么,如果是 iOS,控制台会说什么?如果这是一个 .netstandard 项目,在 Android 或 iOS 项目中,您是否还添加了 File Picker nuget 包?简而言之,这可能不起作用的原因有很多,我们需要更多信息。
  • @Jason 如果您的意思是权限问题,我已经编辑了问题并添加了我的 AndroidManifest.xml 文件,因此您可以看到权限。虽然我不确定我做得对...

标签: c# xamarin xamarin.forms filepicker


【解决方案1】:

成功了,感谢所有支持者!

问题: 权限。

在深入研究并学习了如何使用 android 和 Xamarin 处理权限之后,我设法从手机内存中读取了一个文本文件。

此外,我从 Xam.Plugin.FilePicker(在 Xamarin Nuget 管理器上有更多下载)切换到 Xamarin.Plugin.FilePicker。如果它有帮助的话,我想知道。

最终代码:

using System;
using Xamarin.Forms;
using Plugin.FilePicker;
using Plugin.FilePicker.Abstractions;
using Android.Support.V4.Content;
using Android;
using Android.Support.V4.App;
using Android.App;
using Android.Content.PM;
using Android.Runtime;

namespace FilesTest
{
public partial class MainPage : ContentPage, ActivityCompat.IOnRequestPermissionsResultCallback
{
    public IntPtr Handle => default(IntPtr) ;

    public MainPage(){InitializeComponent();}

    async void Pic()//the function that triggers the file picker
    {
        try
        {
            FileData fileData = await CrossFilePicker.Current.PickFile();
            if (fileData == null) {
                return; // user canceled file picking
            }
            string fileName = fileData.FileName;
            string contents = System.Text.Encoding.UTF8.GetString(fileData.DataArray);

            Console.WriteLine("File name chosen: " + fileName);
            Console.WriteLine("File data: " + contents);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception choosing file: " + ex.ToString());
        }
    }

    private void PickFileButton_Clicked(object sender, EventArgs e)//in the xaml there is a button that triggers this function
    {
        var thisActivity = Forms.Context as Activity;
        if(ContextCompat.CheckSelfPermission(thisActivity, Manifest.Permission.ReadExternalStorage) != Permission.Granted)
        {// Permission is not granted
            ActivityCompat.RequestPermissions(thisActivity, new String[] {Manifest.Permission.ReadExternalStorage }, 1);//1 is just the code to retrive this permission
        } else
        {//if permission is already granted
            Pic();
        }
    }

    public void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults) // this function is called after the permission box is shown and the user picked whether to grant or deny the permission
    {
        if(requestCode == 1)
        {
            if(grantResults.Length > 0 && grantResults[0] == Permission.Granted)
            {//permission has been granted by the user
                Pic();
            } else
            {//permission denied
            }
        }
    }

    public void Dispose(){}
}
}

【讨论】:

  • 我遇到的问题是选择文件后,代码在 FileData fileData = await CrossFilePicker.Current.PickFile(); 之后没有进入下一条语句可能是由于一些内部错误,但我无法得到任何异常。我刚刚用 Xamarin.Plugin.FilePicker 替换了 Xam.Plugin.FilePicker,它已经开始工作了。感谢您提及。
猜你喜欢
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多