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

Xamarin中Xam.Plugin.Media无法调用相机的技术咨询

嘿,看你正在搞Xamarin Android的相机应用,用的是Xam.Plugin.Media,目标是只启动相机不保存照片对吧?我帮你把没写完的配置补全,再给你完整的实现代码,保证能顺利跑起来:

1. 补全AndroidManifest配置

你之前的FileProvider配置没写完,完整配置得加上meta-data指向路径配置,同时别忘了加相机权限,直接复制这段到你的AndroidManifest.xml里:

<!-- 相机基础权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<application ...>
    <!-- FileProvider核心配置 -->
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>

    <!-- Android 10+ 适配Scoped Storage,避免存储权限问题 -->
    android:requestLegacyExternalStorage="true"
</application>
2. 创建FileProvider路径配置文件

在你的Android项目里,先在Resources目录下新建一个xml文件夹,然后创建file_paths.xml文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="my_images" path="Pictures" />
    <cache-path name="cache_images" path="Pictures" />
</paths>

这个配置是告诉FileProvider可以访问应用的临时存储目录,用来存拍照的临时文件。

3. 实现按钮点击启动相机的代码

在你的Activity里,给按钮绑定点击事件,代码逻辑里会处理权限检查、启动相机、拍完删除临时文件:

using System;
using System.IO;
using Plugin.Media;
using Plugin.Media.Abstractions;
using Xamarin.Essentials;
using Android.Widget;
using Android.App;
using Android.OS;

namespace YourAppNamespace
{
    [Activity(Label = "CameraDemo")]
    public class CameraDemoActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.YourLayoutName);

            // 获取拍照按钮
            var takePhotoBtn = FindViewById<Button>(Resource.Id.takePhotoButton);
            takePhotoBtn.Click += TakePhotoButton_Click;
        }

        private async void TakePhotoButton_Click(object sender, EventArgs e)
        {
            // 先检查相机是否可用
            if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
            {
                Toast.MakeText(this, "当前设备相机不可用或不支持拍照", ToastLength.Short).Show();
                return;
            }

            // 请求动态相机权限(Android 6.0+ 必须要)
            var cameraPermission = await Permissions.CheckStatusAsync<Permissions.Camera>();
            if (cameraPermission != PermissionStatus.Granted)
            {
                cameraPermission = await Permissions.RequestAsync<Permissions.Camera>();
                if (cameraPermission != PermissionStatus.Granted)
                {
                    Toast.MakeText(this, "得先给相机权限才能用哦", ToastLength.Short).Show();
                    return;
                }
            }

            // 配置拍照选项:不存相册,用临时目录
            var photoOptions = new StoreCameraMediaOptions
            {
                SaveToAlbum = false,
                Directory = "TempCameraShots",
                Name = $"temp_photo_{Guid.NewGuid()}.jpg",
                AllowCropping = false
            };

            // 启动相机拍照
            var photo = await CrossMedia.Current.TakePhotoAsync(photoOptions);

            if (photo != null)
            {
                // 这里可以加你需要的操作,比如把照片显示在ImageView里
                // var previewImg = FindViewById<ImageView>(Resource.Id.photoPreview);
                // previewImg.SetImageBitmap(await BitmapFactory.DecodeStreamAsync(photo.GetStream()));

                // 拍完就删临时文件,完全不保存
                if (File.Exists(photo.Path))
                {
                    File.Delete(photo.Path);
                }
            }
        }
    }
}
4. 额外注意点
  • 如果你的项目已经迁移到AndroidX,记得把android.support.v4.content.FileProvider换成androidx.core.content.FileProvider
  • 确保Xam.Plugin.Media是最新版本,避免兼容性坑
  • 尽量用真机测试,模拟器相机经常出莫名其妙的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:09:13