Xamarin表单无法获取文件位置

时间:2019-11-19 20:14:45

标签: file xamarin camera

我必须打开相机并拍照,但无法正常工作。我搜索了类似的帖子,但无法弄清楚。有什么建议吗?

清单

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

file_paths

<external-files-path name="my_images" path="Pictures" />
<external-files-path name="my_movies" path="Movies" />
<external-path name="my_images" path="Android/data/com.plugin.mediatest/files/Pictures" />

代码

await CrossMedia.Current.Initialize();
            if (!CrossMedia.Current.IsTakePhotoSupported && !CrossMedia.Current.IsPickPhotoSupported)
            {
                await DisplayAlert("Message", "Unavailable", "OK");
                return;
            }
            else
            {
                var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
                {
                    Directory = "Images",
                    Name = DateTime.Now +".jpg",
                    SaveToAlbum = false
                });
                await DisplayAlert("FilePath", file.Path, "OK");
                PhotoImage.Source = ImageSource.FromStream(() =>
                {
                    var stream = file.GetStream();
                    return stream;
                });

1 个答案:

答案 0 :(得分:0)

您可以参考此 Usage ,并且GitHub上有a sample

takePhoto.Clicked += async (sender, args) =>
{
    await CrossMedia.Current.Initialize();

    if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
    {
        DisplayAlert("No Camera", ":( No camera available.", "OK");
        return;
    }

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

    if (file == null)
        return;

    await DisplayAlert("File Location", file.Path, "OK");

    image.Source = ImageSource.FromStream(() =>
    {
        var stream = file.GetStream();
        return stream;
    }); 
};

关于Android Misc Setup

默认情况下,该库将android.hardware.cameraandroid.hardware.camera.autofocus作为可选功能添加到您的应用清单中。您有责任在使用设备之前检查设备是否支持硬件。相反,如果您希望Google Play过滤掉不需要硬件的设备,则将以下内容添加到Android项目中的 AssemblyInfo.cs 文件中:

[assembly: UsesFeature("android.hardware.camera", Required = true)]
[assembly: UsesFeature("android.hardware.camera.autofocus", Required = true)]

您还必须添加一些其他配置文件以遵守新的严格模式:

1。)在标签内的AndroidManifest.xml内添加以下内容:

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

2。)将一个名为 xml 的新文件夹添加到您的Resources文件夹中,并添加一个名为file_paths.xml的新XML文件。确保此XML文件的构建操作为:AndroidResource

添加以下代码:

<?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>

最终效果:

enter image description here

==================================更新============= =======================

检查共享样本后,有两个问题。

首先,最好将解决方案的Nuget软件包(Xamarin Forms 3.1)更新为最新版本(Xamarin Forms 4.3)。

enter image description here enter image description here

enter image description here

第二,您忘记了将提供者添加到AndroidManifest.xml

<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.companyname.fileprovider.fileprovider" android:exported="false" android:grantUriPermissions="true">
        <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/files_paths"></meta-data>
 </provider>

注意:需要将提供者内部的part参数(android:resource)修改为您在poject中的自定义名称(@xml/files_paths)。您未将其命名为@xml/file_paths,则找不到提供程序。

样本效果:

enter image description here