【问题标题】:Xamarin Xam.Plugin.Media can't work out how to access cameraXamarin Xam.Plugin.Media 无法弄清楚如何访问相机
【发布时间】:2018-04-16 17:44:08
【问题描述】:

我正在尝试创建一个可以访问相机的 Xamarin 应用程序(我不需要存储任何拍摄的照片或任何东西,只需要能够通过单击按钮启动相机。)我使用的是 Android用于测试应用的设备。

我安装了 Xam.Plugin.Media 插件。我在 AndroidManifest 的 application-tag 中添加了以下内容:

<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="file_paths"></meta-data>
</provider>

我在 Android 项目中创建了一个名为 xml 的资源下的新文件夹。我在 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" />
  <external-files-path name="my_movies" path="Movies" />
</paths>

最后我将此代码添加到我的 MainPage.xaml.cs 文件中:

    public void CameraClicked(object sender, EventArgs e) {
        testAsync();
    }

    async void testAsync() {
        await CrossMedia.Current.Initialize();

        if (CrossMedia.Current.IsCameraAvailable && CrossMedia.Current.IsTakePhotoSupported) {
            await DisplayAlert("Alert", "Camera available!", "OK");

            var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions {
                Directory = "Sample",
                Name = "test.jpg"
            });

        }
        else {
            await DisplayAlert("Alert", "Camera unavailable!", ":(");
        }
    }

如果我运行上面的代码 - 不向清单或 xml 文件添加任何内容 - 它将显示消息“相机可用!”,因此该部分似乎工作正常。

但是,当我添加 file_paths.xml 文件时,我的应用程序在构建时崩溃了。我收到消息:

资源目录名无效:obj\Debug\res file_paths.xml "res file_paths.xml"。 demoApp_Xamarin.Android C:\Users\Peter\Desktop\Skola\demoAppar\Xamarin\demoApp_Xamarin\demoApp_Xamarin\demoApp_Xamarin.Android\aapt.exe

文件 file_paths.xml 的文件路径似乎不完整。好像缺少一个反斜杠。 (不过,我不知道如何解决它。或者即使这是实际问题。)

我还收到以下错误消息:

找不到类型或命名空间名称“App”(您是否缺少 using 指令或程序集引用?)

每当我创建一个名为 file_paths.xml 的文件时,无论我把它放在哪里,都会出现第二条消息。

【问题讨论】:

  • 我的应用程序也遇到了同样的问题。尝试将file_paths.xmlBuild Action 属性从Content 更改为AndroidResource。这适用于我的测试应用程序,但不适用于我当前的项目。
  • @MuhammadKhan 谢谢你的建议。遗憾的是,它已经默认设置为 AndroidResource。
  • 您是否尝试在新的空白应用程序中使用该插件?我的应用程序在运行时崩溃了,只有当 Build Action 设置为 AndroidResource 时。 > 未处理的异常:Java.Lang.RuntimeException:无法获取提供程序 com.google.firebase.provider.FirebaseInitProvider:android.content.res.Resources$NotFoundException:发生无法找到资源 ID #0x7f07001a。即使我删除了 Firebase 代码,也会出现此异常。
  • @MuhammadKhan 是的。我首先在一个新应用程序中尝试了它。它崩溃了,让我很生气,所以我删除了它并创建了一个新的(第二个应用程序),但我得到了相同的结果。我想也许我第一次搞砸了,但显然不是。不确定这是否值得一提;我将两个项目都创建为“.NET 标准”。

标签: android xamarin


【解决方案1】:

在 Android 中:

1>清单内

a)先添加权限

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

b) 在应用标签内创建提供者:

<application android:label="Application Name" android:icon="@drawable/appIcon" android:largeHeap="true"> <provider android:name="android.support.v4.content.FileProvider" android:authorities="applicationPackageName.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider> </application>

c) 在 Resource 目录中创建 xml 文件夹: 里面的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" /> <external-files-path name="my_movies" path="Movies" /></paths>

2>ViewModel 内部:

  public ICommand _capturePhoto;
    public ICommand CapturePhoto
    {
        get
        {
            return _capturePhoto ?? new Command(async () =>
            {
                try
                {
                    if (!CapturePhoto.CanExecute(null)) return;

                    if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
                    {
                        return;
                    }

                    var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
                    {
                        SaveToAlbum = true,
                        CompressionQuality = 75,
                        CustomPhotoSize = 50,
                        PhotoSize = PhotoSize.MaxWidthHeight,
                        MaxWidthHeight = 2000
                    });

                    if (file == null)
                        return;
                    var fileExtension = MimeTypeMap.GetFileExtensionFromUrl(file.Path);
                    AddAttachmentToCollection(file.Path, DocumentType.Photo,fileExtension);
                    file.Dispose();
                }
                catch (Exception ex)
                {
                }
            });
        }
    }

【讨论】:

    【解决方案2】:

    我不完全确定,但在您的 android 清单中,我认为您缺少 file_path 文件的 @,因为您正在“链接”到资源文件。

    应该是

    <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
                 android:resource="@file_paths"></meta-data>
    

    我的 file_paths 文件位于一个名为“xml”的文件夹中,我的代码是

    <meta-data android:name="android.support.FILE_PROVIDER_PATHS" 
               android:resource="@xml/file_paths"></meta-data>
    

    这是有效的。

    【讨论】:

    • 我尝试将 android:resource="" 路径更改为我能想象到的所有内容。我使用了正斜杠,反斜杠,有@,没有@。输入完整路径 (Resources/xml/file_paths.xml),只输入文件名。我觉得我已经尝试了一切,但它不起作用。 ://
    • 我没有读到您还创建了一个名为 xml 的文件夹。所以应该是@xml/file_paths
    猜你喜欢
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2013-05-19
    • 1970-01-01
    相关资源
    最近更新 更多