android - Xamarin.Forms 从 Android 获取 sdcard 文件列表
问题描述
我使用 Xamarin.Forms for Android 应用程序并尝试从 cdcard 获取文件列表。这段代码:
var dir = Android.OS.Environment.ExternalStorageDirectory();
返回本地路径而不是 cd 卡 /storage/emulated/0 的路径
我尝试使用 NuGet FilePicker:
var file = await CrossFilePicker.Current.PickFile();
string pathFile = file.FilePath;
如果本地文件路径正常输出,那么对于sdcard它也无法获取文件路径并返回内容://com.android.externalstorage.documents/document/2352-3212%3Atest.txt
我有一个问题,如何访问 sdcard 上的文件?其他应用程序使用 sdcard,例如音频和视频播放器。
ps 添加了在应用程序中从 sdcard 写入和读取的所有必要权限。
解决方案
正如文档所说“ Android : FilePath 属性可能包含以content://
”开头的内容 URI,您应该将 Uri 转换为 filePath。
这是一个没有使用FilePicker nuget的方法,你应该在PCL项目中使用DependencyService,调用android原生方法。
1.在PCL项目中创建一个接口:
public interface IGetFiles
{
List<string> GetFiles(string filetype);// you could set what type of file do you want
}
2.让你的 MainActivity 实现接口:
[assembly: Dependency(typeof(MainActivity))]//dont miss this line
namespace EntryCa.Droid
{
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity,IGetFiles
{
private static MainActivity Instance;
List<string> fileList = new List<string>();
protected override void OnCreate(Bundle savedInstanceState)
{
...
Instance = this;
...
}
public List<string> GetFiles(string filetype)
{
ActivityCompat.RequestPermissions(Instance, new string[] { Manifest.Permission.WriteExternalStorage }, 1);
var path2 = Android.OS.Environment.ExternalStorageDirectory;
return Search_Dir(path2, filetype); ;
}
public List<string> Search_Dir(Java.IO.File dir,string fileType)
{
Java.IO.File[] FileList = dir.ListFiles();
if (FileList != null)
{
for (int i = 0; i < FileList.Length; i++)
{
if (FileList[i].IsDirectory)
{
Search_Dir(FileList[i], fileType);
}
else
{
if (FileList[i].Name.EndsWith(fileType))
{
fileList.Add(FileList[i].AbsolutePath);
//here you have that file.
//System.Console.WriteLine(FileList[i].AbsolutePath);
}
}
}
return fileList;
}
return null;
}
}
}
3. 在您的页面中调用:
List<string> files = DependencyService.Get<IGetFiles>().GetFiles(".txt");
推荐阅读
- javascript - 音频无法与 cookie 一起正常工作
- php - 使用 DynamoDB 在 EC2 之间共享会话
- git - 当我创建一个新的 git 分支时,我的本地项目文件会发生什么?
- python - 在 numpy 中创建非等距数组的函数
- python - Python Pandas 和 Spearmanr 按行运行更快
- angular - 当我拼接@Input变量时,它反映了父组件的变量
- karate - 如何在后台调用 sql 脚本或查询以获取空手道功能?
- c# - 如何在 c# 中将具有“object”类型的变量转换为具有泛型类型的类?
- c# - C#While循环不起作用
- android - 为什么 Sqlite 只返回最后一行而不是所有行数据?