You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Forms新手求助:跨平台APP拍照并保存至应用内目录的实现方法

嘿,刚上手Xamarin.Forms的话,实现拍照+保存到应用私有目录的功能其实挺顺手的,我给你一步步捋清楚,保证你能快速搞定!

实现Xamarin.Forms拍照并保存到应用目录的完整步骤

一、准备工作:安装依赖与配置权限

首先,咱们得用官方推荐的Xamarin.Essentials工具包——它把跨平台的相机、文件操作这些API都封装好了,不用自己写平台特定代码。如果还没装,直接在NuGet包管理器里搜索Xamarin.Essentials,给共享项目、Android项目、iOS项目都装上就行。

接下来必须配置权限,不然相机根本用不了:

Android端

打开AndroidManifest.xml,添加以下权限代码:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

要是你的App目标是Android 10及以上,还得在<application>标签里加一句:

android:requestLegacyExternalStorage="true"

iOS端

右键打开Info.plist选择「源代码模式」,添加以下键值对(权限描述要写清楚,不然AppStore审核容易卡):

<key>NSCameraUsageDescription</key>
<string>需要访问相机来拍摄照片</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>需要访问相册来保存照片</string>

二、写拍照+保存的核心逻辑

新手的话,先直接在页面的代码后台写逻辑最直观,后续再迁到ViewModel里也没问题。

首先引入必要的命名空间:

using Xamarin.Essentials;
using System.IO;
using System;

然后写核心的拍照方法:

private async Task TakePhotoAndSaveAsync()
{
    try
    {
        // 调用系统相机拍摄照片,返回临时文件
        var tempPhoto = await MediaPicker.CapturePhotoAsync(new MediaPickerOptions
        {
            Title = "拍摄照片"
        });

        // 用户取消拍照的话直接返回
        if (tempPhoto == null)
            return;

        // 获取应用的私有存储目录(这个目录不会被系统清理,也只有App能访问)
        var appPrivateDir = FileSystem.AppDataDirectory;
        // 给照片起个唯一的名字,避免重复覆盖
        var savedPhotoPath = Path.Combine(appPrivateDir, $"photo_{DateTime.Now:yyyyMMddHHmmss}.jpg");

        // 把临时文件复制到私有目录
        using (var tempStream = await tempPhoto.OpenReadAsync())
        using (var saveStream = File.OpenWrite(savedPhotoPath))
        {
            await tempStream.CopyToAsync(saveStream);
        }

        // 提示用户保存成功
        await DisplayAlert("搞定!", "照片已经存到应用私有目录啦", "好的");
    }
    catch (Exception ex)
    {
        // 处理异常,比如用户拒绝权限、相机不可用的情况
        await DisplayAlert("出错了", $"拍照或保存失败:{ex.Message}", "知道了");
    }
}

三、在页面上加个触发按钮

打开你的XAML页面,加个按钮绑定点击事件:

<Button Text="点击拍照" Clicked="TakePhotoButton_Clicked" 
        HorizontalOptions="Center" Margin="20"/>

然后在代码后台实现点击事件:

private async void TakePhotoButton_Clicked(object sender, EventArgs e)
{
    await TakePhotoAndSaveAsync();
}

四、可选:查看保存的照片路径

如果想确认照片到底存在哪了,可以在保存成功后把路径打印出来,或者写个方法获取所有保存的照片:

private List<string> GetAllSavedPhotos()
{
    var appDir = FileSystem.AppDataDirectory;
    // 筛选出所有jpg格式的照片
    return Directory.GetFiles(appDir, "*.jpg").ToList();
}

一些小提醒

  • FileSystem.AppDataDirectory在不同平台的实际路径不一样:
    • Android:/data/data/[你的包名]/files
    • iOS:/var/mobile/Containers/Data/Application/[应用ID]/Documents
  • 这个私有目录是App专属的,不会被用户误删,也不用申请额外的存储权限(除了一开始的基础权限)
  • 记得处理异常!比如用户点了拒绝相机权限,或者设备没有相机的情况

内容的提问来源于stack exchange,提问作者BartManVSBatMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:50:04