首页 > 解决方案 > 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 写入和读取的所有必要权限。

标签: androidxamarin.forms

解决方案


正如文档所说“ 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");

推荐阅读