Xamarin媒体插件获取安卓图片路径

3

我正在使用Xamarin Forms的媒体插件(由James Montemagno开发),拍照并存储实际上都正常工作。我已经在模拟器上调试了图像的创建过程,它已经被存储在

/storage/emulated/0/Android/data/{APPNAME}.Android/files/Pictures/{DIRECTORYNAME}/{IMAGENAME}

然而,在我的应用程序中,它将从API获取文件名列表,我希望检查该文件夹中是否存在该图像。

以下方法在IOS上运行良好。

var documentsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string jpgFilename = System.IO.Path.Combine(documentsDirectory, App.IMAGE_FOLDER_NAME);
jpgFilename = System.IO.Path.Combine(jpgFilename, name);

我已经尝试过以下两种方法在安卓上获取它,但都是错误的。
var documentsDirectory = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
string jpgFilename = System.IO.Path.Combine(documentsDirectory, App.IMAGE_FOLDER_NAME);
jpgFilename = System.IO.Path.Combine(jpgFilename, name);
Java.IO.File dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DataDirectory + "/" + App.IMAGE_FOLDER_NAME + "/" + name);

dir最终变成了/storage/emulated/0/data/{DIRECTORY}/{IMAGENAME}

jpgFileName最终变成了/data/data/{APPNAME}.Android/files/{DIRECTORYNAME}/{IMAGENAME}

我不想在路径中硬编码任何内容,但是这两个路径都不正确。我在GIT文档中没有找到获取文件路径的方法,除非查看拍照时创建的文件的路径。


我记得一段时间前试过这样做。我想我放弃了复制默认保存位置的尝试。相反,我创建了自己可重现的文件夹,并将其提供给媒体插件选项,以便将图像保存在那里。 - Gerald Versluis
@GeraldVersluis 我已经尝试寻找一种方法来实现这个,但媒体插件上的唯一选项似乎是目录,它只是在末尾添加另一个文件夹,而我已经在使用中,而不是定义完整的保存路径。我能想到的唯一方法就是再保存一次图像,然后删除原始图像,但如果可能的话,我想避免这样做。 - wolfman1001
3个回答

4

问题

我在使用 Xamarin 媒体插件时遇到了同样的问题,具体表现为:

  • 我们并不知道插件将图片保存在 Android 设备上的哪个位置。

在阅读了所有相关文档之后,我只找到了这条信息:

...... 当用户拍照时它仍然会存储临时数据,但是如果需要,也会将其复制到公共图库中(基于平台)。在 MediaFile 中,您现在可以查看 AlbumPath。

(来源:Github 插件页面)

  • 因此,您可以将照片保存到手机图库中(它将是公开的),但路径是已知的。
  • 而我们并不知道“存储临时数据”是什么意思。

解决方案

在调查应用程序如何/在哪里存储数据时,我找到了插件在 Android 上存储照片的位置 >> 因此我可以生成完整的文件名

在您的 Android 应用程序中,您要查找的基本路径是:

var basePath = Android.App.Application.Context.GetExternalFilesDir(null).AbsolutePath

它引用了你的应用程序的外部私有文件夹。它看起来像这样:

应用程序外部私有文件夹是指:

/storage/emulated/0/Android/data/com.mycompany.myapp/files


最终获取完整文件路径的方法如下:

var fullPath = basePath + {DIRECTORYNAME} + {FILENAME};

我建议您创建一个依赖服务,例如“ILocalFileService”,该服务将公开此“基本路径”属性。如果您同意,请告诉我!

完全和我的问题一样,我不知道它所说的“它仍然会存储临时数据”是什么意思。 - undefined

0

我解决了一个类似的问题。我想将我的应用程序中的所有文件收集到一个对所有用户可见的文件夹中。

var documentsDirectory = Android.OS.Environment.GetExternalStoragePublicDirectory(
                                                Android.OS.Environment.DirectoryDocuments);

FileManager under Android

如果您想创建“目录”,请在您的类中添加“using System.IO;”并且您将拥有一个普通.NET应用程序中相同的功能。
if (!Directory.Exists(path))
    Directory.CreateDirectory(path);

如果您想要创建文件或目录,可以使用 PCLStorage
public async Task<bool> CreateFileAsync(string name, string context)
{
    // get hold of the file system
    IFolder folder = FileSystem.Current.LocalStorage;

    // create a file, overwriting any existing file
    IFile file = await folder.CreateFileAsync(name, 
                                              CreationCollisionOption.ReplaceExisting);

    // populate the file with some text
    await file.WriteAllTextAsync(context);

    return true;
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接