Xamarin.Android在Android 13中的MediaPicker.CapturePhotoAsync功能无法正常工作。

4

我在我的应用程序中使用Xamarin.Essentials MediaPicker来捕获图像。 https://learn.microsoft.com/de-de/xamarin/essentials/media-picker?tabs=android

就像这样var photo = await MediaPicker.CapturePhotoAsync();

对于Android < 13,我正在请求权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

一切都运行正常。

由于这些权限在Android 13上不起作用,因此我正在请求

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

(请参见{{link1:Android 13 - 如何请求WRITE_EXTERNAL_STORAGE}})

问题在于,当尝试拍照时,Xamarin.Essentials.MediaPicker仍然缺少StorageWritePermission。但是我无法在Android 13中请求这些权限。

enter image description here

有什么想法可以让它在Android 13上运行吗?

信息:

更新:


谁告诉你它使用或需要这些权限?它们是不必要的。 - blackapps
有对此的任何答案吗?我遇到了同样的问题。 - user3488019
@blackapps 异常处理程序告诉我,因为应用程序崩溃(请参见截图)。 - Aiko West
3个回答

1

更新

在Android 13中,由于权限问题,无法使用MediaPicker.CapturePhotoAsync()方法。您可以查看问题线程Storage permissions Android 13 api 33以获取更多信息。

以下代码适用于Android 13之前的版本

我在我的一侧创建了一个演示,它运行良好,您可以参考此演示。 我正在使用以下权限。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

 <queries>
    <intent>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
    </intent>
</queries>

这是.cs文件中的代码。

 public partial class MainPage : ContentPage
        {
            public string PhotoPath { get; set; } = null;
            public MainPage()
            {
                InitializeComponent();
            }
    
            private async void Button_Clicked(object sender, EventArgs e)
            {
                var file = await MediaPicker.CapturePhotoAsync();
                await LoadPhotoAsync(file);
                if (file == null)
                    return;
                async Task LoadPhotoAsync(FileResult photo)
                {
                    // canceled
                    if (photo == null)
                    {
                        PhotoPath = null;
                        return;
                    }
                    // save the file into local storage
                    var newFile = Path.Combine(FileSystem.CacheDirectory, photo.FileName);
                    using (var stream = await photo.OpenReadAsync())
                    using (var newStream = File.OpenWrite(newFile))
                        await stream.CopyToAsync(newStream);
                    PhotoPath = newFile;
                    img.Source = PhotoPath;//Show on the front page
                }
            }
        }

这是XAML中的代码

<StackLayout>
    <Button Text="button" Clicked="Button_Clicked"></Button>
    <Image x:Name="img" ></Image>
</StackLayout>

我测试了MediaPicker.CapturePhotoAsync(),你需要在AndroidManifest.xml文件中添加 <queries> <intent> <action android:name="android.media.action.IMAGE_CAPTURE" /> </intent> </queries> - Guangyu Bai - MSFT
这在我的三星Tab 7 FE Android 13上无法工作。我甚至无法请求WRITE_EXTERNAL_STORAGE权限。不会出现弹出窗口来授予权限。 - Aiko West
但是在Android 13中不应该需要这些权限,但CapterPhotoAsync仍然会请求它们。 - Aiko West
1
这似乎是在Android 13上的一个问题,您可以查看问题线程Storage permissions Android 13 api 33 - Guangyu Bai - MSFT

1

已在 Xamarin.Essentials Nuget 更新版本1.7.5中修复

更新 Nuget 包后,我的 13 台 Android 设备没有任何问题。

enter image description here


添加了那个,不幸的是仍然崩溃。 - fsulser
仍然因为权限异常而崩溃?我的三星平板有时在拍照时也会崩溃,但不是因为这个线程中的错误。 - Aiko West

0

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