C# FilePicker返回空FileData对象
我试图在xamarin.Forms上实现包“FilePicker”,但不幸的是没有成功 下面是XAML.cs中的代码:C# FilePicker返回空FileData对象,c#,xamarin,xamarin.forms,filepicker,C#,Xamarin,Xamarin.forms,Filepicker,我试图在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()
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();
}
}
}
编辑:对于那些提出问题的人,我正在尝试让它在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对象为空吗?请帮忙。这很有效,谢谢所有的支持者强> 问题是: 权限。 在深入挖掘并学习如何使用android和Xamarin处理权限后,我设法从手机内存中读取了一个文本文件 此外,我从Xam.Plugin.FilePicker(在Xamarin Nuget manager上有更多下载)切换到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(){}
}
}
您是否遵循了标记为重要的部分中文档中的步骤?@Jason如果您链接到这些文档,可能会有所帮助……这是Android还是iOS?您是否设置了权限和权限请求?如果是Android,Logcat怎么说?如果是iOS,控制台怎么说?如果这是一个.netstandard项目,在Android或iOS项目中,您是否也添加了文件选择器nuget包?简言之,这可能有很多原因不起作用,我们需要更多信息。@Jason如果你是说问题与权限有关,我已经编辑了这个问题并添加了我的AndroidManifest.xml文件,因此你可以查看权限。虽然我不确定我是否做对了…但我面临的问题是,在选择文件后,代码不会进入FileData FileData=wait CrossFilePicker.Current.PickFile()之后的下一个语句;可能是由于一些内部错误,但我无法获得任何异常。我刚刚用Xamarin.Plugin.FilePicker替换了Xam.Plugin.FilePicker,它已经开始工作了。谢谢你提到这件事。