2017-05-09 2 views
0

Ich benutze das Medien-Plugin von James Montemagno. Ich habe das Plugin installiert und alle erforderlichen Berechtigungen hinzugefügt. Allerdings, wenn ich meine app laufen, erhalte ich eine NULL-Verweis Ausnahme in der ersten Zeile des folgenden Codes:Null Referenz Ausnahme- Takephotoasync Xamarin

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

Ich habe versucht, nach einer Lösung gesucht für fast zwei volle Tage ohne Glück! Jede Hilfe würde sehr geschätzt werden! Vielen Dank im Voraus!

+0

Sie Haltepunkte setzen Haben in? Können Sie feststellen, ob 'image' null oder' file' ist? –

+0

Können Sie uns mehr Code zeigen? Es ist schwer zu wissen, was von einer einzelnen Linie aus geschieht. – Adam

Antwort

1

Ich schlage download the source

HERE Sie eine Probe finden, wie das Plugin zu verwenden.

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

    if (file == null) 
     return; 

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

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

Ich hatte das gleiche Problem, weil ImageSource.FromStream Versionen immer der Stream erstellt ... Hier ist mein Code, die Bilder und zeigt die Bilder in einem binded Listview nimmt.

Kurz gesagt, ich bekomme den Original-Stream aus dem Plugin, dann wandle ich es in Byte [] und speichern Sie es in einem dedizierten Objekt. Wenn ich das Bild in einer Bildquelle anzeigen muss, erstelle ich einen neuen Stream aus dem Byte [] und verwende es mit der ImageSource.FromStream-Methode aus Xamarin.Forms.

public class PictureModel 
    { 
     public byte[] File { get; set; } 
     public ImageSource ImageSource => ImageSource.FromStream(() => new MemoryStream(File)); 
    } 

    public class PicturesViewModel : ViewModelBase 
    { 
     public ObservableCollection<PictureModel> Pictures { get; set; } = new ObservableCollection<PictureModel>(); 

     public ICommand TakePictureCommand => new Command(async() => 
     { 
      var stream = await TakePictureAsync(); 
      var picture = new PictureModel { File = await ImageConverter.ReadFully(stream) }; // custom method to convert stream into byte[] 
      Pictures.Add(picture); 
     }); 

     protected async Task<Stream> TakePictureAsync() 
     { 
      await CrossMedia.Current.Initialize(); 

      if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported) 
      { 
       return null; 
      } 

      var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions 
      { 
       SaveToAlbum = false, 
       PhotoSize = PhotoSize.Medium 
      }); 

      if (file == null) 
       return null; 

      var stream = file.GetStream(); 
      file.Dispose(); 
      return stream; 
     } 
    } 

Vielleicht brauche ich den lokalen Strom in der TakePictureCommand zu entsorgen, aber ich noch nicht testen.

Und die XAML:

<ListView x:Name="listView" ItemsSource="{Binding Pictures}" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" RowHeight="200"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
       <StackLayout Orientation="Horizontal"> 
        <Image Source="{Binding ImageSource}" WidthRequest="400" HeightRequest="200" /> 
       </StackLayout> 
      </ViewCell> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
+0

Hier ist das Problem von Xamarin https://forums.xamarin.com/discussion/18994/imagesource-fromstream-dispose – hugoterelle

Verwandte Themen