有谁知道从 Xamarin.Forms PCL 项目访问 Android MediaStore 的方法吗?
我正在尝试将文件移动到 Android 上的公共下载文件夹中,但由于需要 Android 11 范围存储,我不确定如何在 Xamarin.Forms 中实现此操作。
我怀疑我可能需要创建一个依赖服务并调用原生 Android 函数。
编辑 这是我在依赖服务中尝试过的操作:
public void InsertIntoMediaStore(string filePath, string fileName) {
string fileNameWithoutExt = Path.ChangeExtension(fileName, null);
int fileSize = (int)new FileInfo(filePath).Length;
byte[] buffer = null;
ContentValues values = new ContentValues();
ContentResolver contentResolver = CrossCurrentActivity.Current.AppContext.ContentResolver;
var appName = "TestApplication";
values.Put(Android.Provider.MediaStore.MediaColumns.Title, fileNameWithoutExt);
values.Put(Android.Provider.MediaStore.MediaColumns.MimeType, "image/jpg");
values.Put(Android.Provider.MediaStore.MediaColumns.Size, fileSize);
values.Put(Android.Provider.MediaStore.Downloads.InterfaceConsts.DisplayName, fileNameWithoutExt);
Android.Net.Uri newUri = contentResolver.Insert(Android.Provider.MediaStore.Downloads.ExternalContentUri, values);
System.IO.Stream save;
try {
buffer = new byte[1024];
save = contentResolver.OpenOutputStream(newUri);
Android.Content.Res.AssetManager assets = CrossCurrentActivity.Current.Activity.Assets;
Android.Content.Res.AssetFileDescriptor descriptor = Android.App.Application.Context.Assets.OpenFd(fileName);
System.IO.Stream inputstream = descriptor.CreateInputStream();
CopyFile(inputstream, save);
}
catch (Exception ex) {
System.Console.WriteLine(ex.Message);
}
}
首先确保您有权访问下载文件夹:
public async Task<bool> CheckStorageAsync()
{
PermissionStatus stat = (PermissionStatus)await Permissions.CheckStatusAsync<Permissions.StorageWrite>();
return (stat == PermissionStatus.Granted || stat == PermissionStatus.Restricted);
}
这些额外的清单权限通常会简化方法:
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
使用方法如下:
private string getDownloadsFolder(string yourfilename)
{
if (CheckStorageAsync().Result)
{
return = Path.Combine("/storage/emulated/0/Download", yourfilename);
}
return string.Empty;
}
然后使用StreamReader读取文件,或者使用StreamWriter写入文件。
using var infile = new StreamReader(filepath);
string instring = infile.ReadToEnd();