使用Xamarin.Forms和Prism打开相机时出错

时间:2019-01-15 12:59:49

标签: xamarin xamarin.forms android-camera prism

隐藏代码


    async Task BtnCameraEvento()
    {
        try
        {
            await CrossMedia.Current.Initialize();

            //Verifica se a camera está disponivel
            if (!CrossMedia.Current.IsTakePhotoSupported || !CrossMedia.Current.IsCameraAvailable)
            {
                await App.Current.MainPage.DisplayAlert("Aviso", "Nenhuma camera detectada", "OK");

                return;
            }

            //tira a foto
            var file = await CrossMedia.Current.TakePhotoAsync(
            new StoreCameraMediaOptions
            {
                SaveToAlbum = false,
                Directory = "Demo",
                Name = "foto"
            });

            //Verifica se foi tirado alguma foto
            if (file == null)
                return;

            //Adiciona a foto a lista de imagens
            _imageList.Add(file.Path);
        }
        catch (Exception ex)
        {
            int x = 1;
        }
    }

以下错误出现在“ CrossMedia.Current.TakePhotoAsync”行中:

  

“无法获取文件位置。这很可能意味着未在Android Manifest文件中设置文件提供者信息。请查看有关如何在项目中进行设置的文档。”

1 个答案:

答案 0 :(得分:1)

尤其请参见Sushihangover链接的文档的这一部分:

https://github.com/jamesmontemagno/MediaPlugin#android

在此处复制以防链接中断:

  

Android

     

需要WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限,但是库将自动为您添加此权限。此外,如果您的用户正在运行棉花糖,则插件将自动提示他们输入运行时权限。您必须将权限插件代码添加到您的主要活动或基础活动中:

     

添加到活动:

public override void OnRequestPermissionsResult(int requestCode, string[] 
permissions, Android.Content.PM.Permission[] grantResults)
{
    Plugin.Permissions.PermissionsImplementation.
        Current.OnRequestPermissionsResult
        (requestCode, permissions, grantResults);
}
  

Android当前活动设置

     

此插件使用当前活动插件来访问当前的Android活动。如果没有将MainApplication.cs文件自动添加到您的应用程序,请确保完成完整的设置。请完整阅读当前活动插件文档。您必须至少在Activity的OnCreate方法中设置以下内容:

CrossCurrentActivity.Current.Init(this, bundle);
  

强烈建议您使用“当前活动插件文档”(https://github.com/jamesmontemagno/CurrentActivityPlugin/blob/master/README.md)中概述的自定义应用程序

     

Android其他设置

     

通过添加这些权限,Google Play会自动过滤掉没有特定硬件的设备。您可以通过在Android项目中的AssemblyInfo.cs文件中添加以下内容来解决此问题:

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

Android文件提供程序设置

     

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

     

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。)在您的Resources文件夹中添加一个名为xml的新文件夹,并添加一个名为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>
  

您可以在以下网址阅读更多信息:https://developer.android.com/training/camera/photobasics.html