使用 Xamarin.Forms PCL 项目中的 android MediaStore

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

有谁知道从 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);

        }
    }
android xamarin.forms mediastore
1个回答
0
投票

首先确保您有权访问下载文件夹:

    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();
© www.soinside.com 2019 - 2024. All rights reserved.