Camera - Get Photo

Android 照相功能並儲存

nuget : Xam.Plugin.Media

nuget : Plugin.Permissions

在ProjectName.Android 設定 AndroidManifest.xml
 

<application android:label="Hello.Android" android:icon="@drawable/icon">
  <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.companyname.Hello.fileprovider" android:exported="false" android:grantUriPermissions="true">  
     <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
  </provider>
</application>

建立資料夾 Resources\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>

在ProjectName.Android 設定 AssemblyInfo.cs

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

在 ProjectName 建立 XAML
目的:當按下 Button 開啟拍照,並顯示於Imager

<StackLayout>
  <Button x:Name="takePhoto" Text="Take Photo"/>
  <Image x:Name="image"/>
</StackLayout>

在ProjectName XAML.cs
 

public CameraPage ()
{
  InitializeComponent ();

  takePhoto.Clicked += async (sender, args) =>
  {
    if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
    {
       DisplayAlert("No Camera", ":( No camera avaialble.", "OK");
       return;
    }

    var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
    {
       Directory = "Test",
       SaveToAlbum = true,
       CompressionQuality = 75,
       CustomPhotoSize = 50,
       PhotoSize = PhotoSize.MaxWidthHeight,
       MaxWidthHeight = 2000,
       DefaultCamera = CameraDevice.Front
    });

    if (file == null) return;

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

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