c# - Xamarin.FilePicker 返回 null FileData 对象
问题描述
我正在尝试在 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();
}
}
}
编辑:对于那些问的人,我试图让它在 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 处理权限之后,我设法从手机内存中读取了一个文本文件。
此外,我从在 Xamarin Nuget 管理器上下载更多的 Xam.Plugin.FilePicker 切换到 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(){}
}
}
推荐阅读
- java - 在 JAVA android 应用程序中连接 MYSQL 的问题
- vulkan - Vulkan 描述符集池中的最大集数的目的是什么?
- python - 从无理数中获取浮点数
- python - 我的视图没有从 Djagno 的 Form 中保存实例
- react-native - 如何使用 Sectionlist 为 react-native 中的粘性部分标题添加背景?
- java - 使用 AWS 部署 java 套接字应用程序
- java - 使用 ~/ 从实际用户主页打开文件的 Java
- sql - PostgreSQL 使用 CTE 优化包含 Window 函数的查询性能
- haskell - Windows 上的 Cabal(来自巧克力)不使用库构建项目
- javascript - 如何使水平滚动和部分具有粘性