我一直在尝试列出 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 !
我想我明白了。我必须以不同的方式实施权利: 在我的 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/ 的硬编码部分很丑,但现在就这样了。
您可以先调用文件夹选择器。或者pickfolder不确定是否在我的脑海中。在任何情况下,它都会在运行期间明确提示用户并“允许访问此文件夹”。然后您可以自由访问列表目录子文件夹等。