Xamarin Xam.Plugin.Media无法解决如何访问摄像头的问题

时间:2018-04-16 08:38:53

标签: android xamarin

我正在尝试创建一个可以访问相机的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文件添加任何内容 - 它将显示消息&#34;相机可用!&#34;,因此该部分似乎工作正常。

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

  

无效的资源目录名称:obj \ Debug \ res file_paths.xml&#34; res file_paths.xml&#34;。 demoApp_Xamarin.Android C:\ Users \ Peter \ Desktop \ Skola \ demoAppar \ Xamarin \ demoApp_Xamarin \ demoApp_Xamarin \ demoApp_Xamarin.Android \ aapt.exe

似乎文件file_paths.xml的文件路径不完整。好像没有反斜杠了。 (但我不知道如何修复它。或者即使这是实际问题。)

我还收到以下错误消息:

  

类型或命名空间名称&#39;应用程序&#39;找不到(你错过了使用指令或汇编引用吗?)

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

2 个答案:

答案 0 :(得分:0)

在Android中:

1&gt; 清单

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)在资源目录中创建xml文件夹: 在xml里面:: 创建file_paths.xml: - &gt;

<?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&gt;在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)
                {
                }
            });
        }
    }

答案 1 :(得分:0)

我不完全确定但是在你的Android清单中我认为你错过了一个@的file_path文件,因为你是&#34;链接&#34;到资源文件。

应该是

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

我的file_paths文件位于名为&#34; xml&#34;的文件夹中。我的代码是

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

这是有效的。