Xamarin Cross Platform Selfi

Wenn ich ein Patent auf Selfis hätte, müsste ich nicht mehr arbeiten. Also wenigsten eine App schreiben um auf jedem Smartphone ein Foto machen zu können greifen wir zu Xamarin Forms.

Zunächst wir mit Visual Studio 2015 ein cross Plattform Shared oder Portabel angelegt.

image

Um mit shared C# Code auf die Kamera zugreifen zu können werden per Nuget zwei Plugins installiert. Sowohl Xam.Plugin.Media als auch Plugin.Permissions werden für jedes Projekt in der Solution benötigt.

image

Achtung. Xamarin.Forms nur auf Release 2.1.06529 updaten. Die 2.2er Version zieht im Android Projekt eine Reihe andere Pakete nach, die mit Android SDK Version 23 Konflikte aufweisen kann.

image

Im Share Projekt wird dann eine Xamarin Forms Datei hinzugefügt.

image

In der app.xaml.cs wird der Code so geändert, das diese Datei die Startdatei wird

   1:  public class App : Application
   2:      {
   3:          public App ()
   4:          {
   5:              // The root page of your application
   6:              MainPage = new App1.Page1();

Die native Cross Plattform Selfi App wird ein Foto aufnehmen und anzeigen. Da UI enthält einen Button und die Anzeige des Bildes.

   1:  <StackLayout>
   2:      <Button Clicked="myclick" Text="foto!"></Button>
   3:      <Image x:Name="image"></Image>
   4:    </StackLayout>

Visual Studio 2015 unterstützt in meinem Fall kein Intellisense in XAML.

Im folgenden Code wird das Bild nur im Temp Verzeichnis gespeichert. In der Nuget Doku zum Media Plugin ist beschrieben wie man das Foto auch in der Bilder Gallery dauerhaft ablegen kann  (mini Challenge!) seit Version 2.1.

   1:     protected async void myclick(object sender, EventArgs e)
   2:          {
   3:              await CrossMedia.Current.Initialize();
   4:   
   5:              if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
   6:              {
   7:                  await DisplayAlert("No Camera", ":( No camera available.", "OK");
   8:                  return;
   9:              }
  10:              var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
  11:                  {
  12:                      DefaultCamera = CameraDevice.Front,
  13:                      Directory = "Test",
  14:                      Name = "test.jpg"
  15:                  });
  16:                  if (file == null)
  17:                      return;
  18:                  await DisplayAlert("File Location", file.Path, "OK");
  19:                  image.Source = ImageSource.FromStream(() =>
  20:                  {
  21:                      var stream = file.GetStream();
  22:                      file.Dispose();
  23:                      return stream;
  24:                  });
  25:            
  26:         }

 

Wichtig zu beachten sind die notwendigen Rechte auf den Smartphone Platformen. Für Android passiert das automatisch. Nach kurzem Intermezzo mit dem Intel HAXM Driver, bin ich wieder zum Microsoft Hyper V basierenden Android Emulator gewechselt.

image

Dieser kann keine Webcam durchschleifen, sondern animiert eine Klötzchengrafik. Nach drücken auf den Auslöser (blauer Knopf mitte) muss der Benutzer die Aufnahme bestätigen und erhält dann folgenden Screen

image

Auf Windows 10 laufen UWP Apps am Smartphone, Rasperry, Xbox oder Windows phone 10. Jedenfalls benötige ich so keinen Emulator.

image

Allerdings gibt es bei 64bit eine Exception, also x86 wählen.

Im Manifest der UWP App muss Webcam erlaubt werden (package.appxmanifest)

image

Vorschau, Bestätigungsdialog, Messagebox werden Plattformspezifisch angezeigt. In der Cam Preview ist das Bild übrigens noch spiegelverkehrt.

image

image

Theoretisch wäre auch Windows Phone 8.1 möglich. Allerdings bekomme nicht nur ich einen XAML Parse Exception. Vermutlich ist in Media Plugin ein Bug, der allerdings als closed und gelöst eingetragen ist.

Dieses Cross Plattform Kamera C# Xamarin Forms Sample stammt aus dem Xamarin Camp.

Kommentare sind geschlossen