Android 上的 MAUI:列出 SD 卡的文件夹内容并写入其中

问题描述 投票:0回答:3

我一直在尝试列出 SD 卡的文件夹内容并使用 MAUI 将其写入我的 Android 手机中。

我的目标是访问一个文件夹(即:SD卡/DCIM/Test EXIF),列出其内容并批量修改/删除文件元数据。

我已经尝试了好几天了,但没有成功,我无法访问 SD 卡,并且不知道如何操作。 我尝试了一个像这样的简单文件选择器:

var result = await FilePicker.Default.PickAsync();
if (result != null)
{
     // Do Stuff
}

对 SD 卡的访问有效,但这不是我想要的:文件显然已复制到缓存中,并且我希望原始文件是可编辑的。我想要处理多个文件,而不是一个一个地处理。

我尝试了另一种方法:使用 GetLogicalDrives()

   string folders = "";
   var xxx = System.Environment.GetLogicalDrives();

   foreach (string foldnm in xxx)
       folders = folders + foldnm + ";";

在列表中,我找到了“/storage/emulated/0/Android/data”,这似乎是我正在寻找的基础。所以我尝试了以下方法:

var files = Directory.GetFiles("/storage/emulated/0/Android/data", "*");

但我的访问被拒绝:System.UnauthorizedAccessException:“访问路径‘/storage/emulated/0/Android/data’被拒绝。”。我认为这是一个正确的问题,所以在 Android/Resources.AndroidManifest.xml 中我添加了以下几行:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

卸载/重新安装应用程序并得到相同的结果,因此我在代码中添加了一个提示以检查并请求读取(暂时)权限,但授予提示从未出现:

        PermissionStatus status = await Permissions.CheckStatusAsync<Permissions.StorageRead>();
        if (status == PermissionStatus.Denied)
        {
            await DisplayAlert("Alert", "Permission Denied", "OK");
            // Ask for permission
            status = await Permissions.RequestAsync<Permissions.StorageRead>();
        }

        if (status == PermissionStatus.Granted)
        {
            var files = Directory.GetFiles("/storage/emulated/0/Android/data", "*");
        }

在我的设备的“设置”>“应用程序”>“应用程序信息”>“我的应用程序”>“权限”上:根本没有列出任何权限。

有什么线索吗?这几天我要把剩下的头发拔掉!

也许我的方法是错误的,但我正在尝试在 Android 中读取/写入我的外部存储

编辑: 我的路走错了。我的SD卡的地址是/storage/3439-3532/。 我可以成功列出其目录,但在尝试访问文件时,出现访问被拒绝错误:

string[] dirs1 = Directory.GetDirectories("/storage/3439-3532/", "*"); // works OK
string[] dirs2 = Directory.GetDirectories("/storage/3439-3532/BEB/", "*"); // works OK
string[] theFiles = Directory.GetFiles("/storage/3439-3532/BEB/", "*"); // KO !
c# android maui
3个回答
4
投票

我想我明白了。我必须以不同的方式实施权利: 在我的 Android 清单中,只需要 MANAGE_EXTERNAL_STORAGE :

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

在我的 Android >MainActivity.cs 中,我添加了一个新意图。第一次应用程序启动时,它会请求许可:

public class MainActivity : MauiAppCompatActivity
{
    // Added this v
    protected override void OnCreate(Bundle savedInstanceState)
    {
        if (!Android.OS.Environment.IsExternalStorageManager)
        {
            Intent intent = new Intent();
            intent.SetAction(Android.Provider.Settings.ActionManageAppAllFilesAccessPermission);
            Android.Net.Uri uri = Android.Net.Uri.FromParts("package", this.PackageName, null);
            intent.SetData(uri);
            StartActivity(intent);
        }
        base.OnCreate(savedInstanceState);
    }

}

现在我可以列出我想要的文件,创建新目录,新文件等...

string[] theFiles = Directory.GetFiles("/storage/3439-3532/DCIM/Camera", "*");

Directory.CreateDirectory("/storage/3439-3532/BEB");

using FileStream outputStream = File.OpenWrite("/storage/3439-3532/BEB/test.txt");
using StreamWriter streamWriter = new StreamWriter(outputStream);
await streamWriter.WriteAsync("OKAY");

我仍然发现 /storage/thingy/ 的硬编码部分很丑,但现在就这样了。



0
投票

您可以先调用文件夹选择器。或者pickfolder不确定是否在我的脑海中。在任何情况下,它都会在运行期间明确提示用户并“允许访问此文件夹”。然后您可以自由访问列表目录子文件夹等。

© www.soinside.com 2019 - 2024. All rights reserved.